1

我正在计算两个位置之间的距离,如下所示

             CLLocation *locA = [[CLLocation alloc] initWithLatitude:lat longitude:lon];

            CLLocationCoordinate2D coordinate = [self getLocation];

            CLLocation *locB = [[CLLocation alloc] initWithLatitude:coordinate.latitude   longitude:coordinate.longitude];

            CLLocationDistance distance = [locA distanceFromLocation:locB];


            CLLocationDistance kilometers = distance / 1000.0;

但是当我连接到 wifi 和 3G 网络时,它给出了不同的结果。如何为两者获得相同的结果。

4

2 回答 2

2

您总是不会为两者获得相同的位置。事实上,如果您明天回到完全相同的位置并打开定位服务,即使您使用相同的技术,您也可能无法获得相同的纬度和经度。

您从 a 收到的纬度和经度CLLocationManager并不是一门精确的科学。事实上,如果您查看CLLocation收到的原始对象,您会注意到有一个horizontalAccuracy属性可以反映坐标的准确/不准确程度。当您第一次启动位置服务时,您甚至会看到多个位置进入,通常精度会越来越高。

但它永远不会是完美的,你也不应该期望它是完美的。这就是为什么在真实设备上测试位置感知代码很重要的原因之一,因为模拟器会让人产生一种在现实世界中不存在的绝对准确度的错误感觉。您应该编写预期这一点的代码。而且,如果不出意外,您应该开始考虑horizontalAccuracy从位置管理器收到的对象。

于 2015-02-17T14:33:30.433 回答
0

您发布的代码行没有任何问题,唯一可以在两种情况下(wifi 和 3g)给您带来差异的行是您的方法[self getLocation]

我猜你在哪里得到设备位置。

在这种情况下,您的设备可能会同时使用 gps 和 wifi 访问来计算其位置,因此可能会发生很小的差异(您可能已经注意到一些地图应用程序建议您打开 wifi 以获得更高的准确性)

无论如何,在您的 getLocation 方法中,尝试在使用 CLLocationManager 时添加更精确的准确性

我试过这个:

- (CLLocationCoordinate2D )getLocation {
    self.locationManager = [[CLLocationManager alloc] init];
    locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m
    [locationManager startUpdatingLocation];
    CLLocationCoordinate2D startCoord = CLLocationCoordinate2DMake(locationManager.location.coordinate.latitude, locationManager.location.coordinate.longitude);

    return startCoord;
}

并且精度足以使 3G/wifi 之间没有差异,但您可以将其设置为

kCLLocationAccuracyBestForNavigation;
kCLLocationAccuracyBest;
kCLLocationAccuracyNearestTenMeters;

ps 我希望您使用的是带 GPS 的设备,当然...

于 2015-02-17T14:28:31.173 回答