如何存储CLLocationCoordinate2D?

时间:2013-01-14 22:44:57

标签: ios mkmapview cllocation parse-platform

我正在尝试构建一个构建和保存类似于map run的路由的应用程序。我正在使用Breadcrumb示例代码,特别是来自Apple的CrumbPathCrumbPathView作为我的路线的基础。两个问题:

  1. 如果我尝试访问MKMapPoint *points的{​​{1}}对象,请执行以下操作:

    CrumbPath

    我的应用崩溃,说:

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

    我很难理解,因为在Thread 1: EXC_BAD_ACCESS (code: 1, address: 0x9450342d) 文件中,apple的人通过显式获取写锁定然后解锁它来写入“数组”,但是如果我获取了读锁定并尝试从中读取,它崩溃了。

  2. 我尝试访问CrumbPath.m的原因是尝试获取points,将它们转换为MKMapPoints个对象,然后保存它们以便重新绘制CLLocationCoordinate2D {1}}根据用户的要求。由于我无法访问polyline,因此我尝试将我发送到points的{​​{1}}对象保存到数组中以上传到CLLocationCoordinate2D locationManager 3}}后端,但我总是收到错误说:

    _route

    这使得这更容易。有没有人知道为什么我会收到这些错误?

  3. 位置管理员代表

    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];
        }
    }
    

3 个答案:

答案 0 :(得分:10)

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

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

应该是:

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

正如我的评论所述,%d应该用于计数,而%@会导致崩溃。

关于第二个问题,您无法向NSArray添加c结构。在将其添加到数组之前,应将其包装在NSValue中。 CLLocationCoordinate2D是一个c-struct。查看documentation here.

改变这个:

[_routePoints addObject:_userLocation];

为:

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

要从NSValue返回坐标,您可以使用

[aValue MKCoordinateValue];

正如您的错误消息中所述,您试图将CLLocationCoordinate2D添加到需要对象的数组中。

答案 1 :(得分:1)

无论你使用什么api与parse交谈,都期待一个id,它是指向任何对象的指针。如果我没有弄错的话,cllocationcoordinate2d是两个双精度的c结构而不是对象。您应该创建一个小包装器对象来保存这两个双精度数并将它们转换为CLLocationCoordinate2d项目。

答案 2 :(得分:0)

1:

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

_route.points不是字符串,而您使用的是NSStrig格式符号“%@”。

此外:

由于CLLocationCoordinate2D是C-Sruct而不是Objective-C对象,因此您可能想要创建自己的GeoPoint类。