如何存储CLLocationCoordinate2D?

我正在尝试构build一个应用程序来构build和保存类似于映射我的运行的路线。 我使用的是Breadcrumb示例代码,特别是CrumbPathCrumbPathView作为我的路线的基础,从苹果。 两个问题:

  1. 如果我尝试访问MKMapPoint *points对象, CrumbPath所示:

     [_route lockForReading]; NSLog(@"%@", _route.points); NSLog(@"%d", _route.pointCount); [_route unlockForReading]; 

    我的应用程序崩溃,说:

     Thread 1: EXC_BAD_ACCESS (code: 1, address: 0x9450342d) 

    我很难理解,因为在CrumbPath.m文件中,苹果公司的人们通过明确地获取写入锁,然后解锁它来写入“数组”,然后解锁它,但是如果我获得读取锁并尝试读取它,它崩溃。

  2. 我尝试访问points的原因是试图获取MKMapPoints ,将它们转换为CLLocationCoordinate2D对象,并保存它们,以便我可以根据用户的要求重新绘制多段polyline 。 由于我无法访问这些points ,因此我尝试从我的locationManager保存CLLocationCoordinate2D对象,该对象发送给数组中的_route传到我的Parse后端,但是我总是得到一个错误:

     Sending 'CLLocationCoordinate2D' to parameter of incompatible type 'id' 

    这并没有使这个更容易。 有没有人有任何见解,为什么我得到这些错误?

位置经理代表

 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { if (_userLocation.longitude != manager.location.coordinate.longitude && _userLocation.latitude != manager.location.coordinate.latitude) { _userLocation = manager.location.coordinate; } if (_isRecording) { if (!_route) { NSLog(@"lat: %f, lng: %f", _userLocation.latitude, _userLocation.longitude); _route = [[CrumbPath alloc] initWithCenterCoordinate:_userLocation]; [_mapView addOverlay:_route]; MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(_userLocation, 2000, 2000); [_mapView setRegion:region animated:YES]; }else { MKMapRect updateRect = [_route addCoordinate:_userLocation]; if (!MKMapRectIsNull(updateRect)) { MKZoomScale currentZoomScale = (CGFloat)(_mapView.bounds.size.width / _mapView.visibleMapRect.size.width); CGFloat lineWidth = MKRoadWidthAtZoomScale(currentZoomScale); updateRect = MKMapRectInset(updateRect, -lineWidth, -lineWidth); [_routeView setNeedsDisplayInMapRect:updateRect]; } } [_routePoints addObject:_userLocation]; [_route lockForReading]; NSLog(@"%d", _route.pointCount); NSLog(@"%@", _route.points); [_route unlockForReading]; } } 

停止logging逻辑

  //stop recording NSLog(@"STOP"); if (_route) { NSLog(@"There is a route"); //Show route options toolbar [_route lockForReading]; NSLog(@"%@", _route); NSLog(@"%d", _route.pointCount); NSLog(@"%@", _route.points); PFObject *routeToSave = [PFObject objectWithClassName:@"Routes"]; //[routeToSave setObject:_route forKey:@"routePoints"]; [_route unlockForReading]; [routeToSave saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) { if (!error) { NSLog(@"%c", succeeded); }else { NSLog(@"%@", error); } }]; } 

关于你的第一个问题,崩溃是因为这个:

 NSLog(@"%@", _route.pointCount); 

它应该是:

 NSLog(@"%d", _route.pointCount); 

正如我在评论中提到的, %d应该用于count, %@会导致崩溃。

关于你的第二个问题,你不能添加ac结构到NSArray 。 在将它添加到数组之前,你应该把它包装在NSValueCLLocationCoordinate2D是一个c结构。 在这里检查文档。

改变这个:

 [_routePoints addObject:_userLocation]; 

至:

 NSValue *aValue = [NSValue valueWithMKCoordinate:_userLocation]; [_routePoints addObject:aValue]; 

要从NSValue获取坐标,可以使用,

 [aValue MKCoordinateValue]; 

正如您在错误信息中提到的那样,您正试图将CLLocationCoordinate2D添加到期望对象的数组中。

无论你用什么API来parsing,都期望一个id,它是一个指向任何对象的指针。 cllocationcoordinate2d是两个双打的c结构,如果我没有弄错的话,它不是一个对象。 你可能应该创build一个小包装对象来保存这两个双打,并将它们转换为/从CLLocationCoordinate2d项目。

1:

行: NSLog(@"%@", _route.points) ; 是错的

_route.points不是string,而是使用NSStrig格式化符号“%@”。

进一步:

由于CLLocationCoordinate2D是一个C-Sruct,而不是一个Objective-C对象,所以你可能想创build一个自己的GeoPoint类。