使用 wifi 和 3G 给出两点之间的不同距离
Giving the different distance between two points using wifi and 3G
我正在计算两个位置之间的距离,如下所示
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 时它给出不同的结果 network.how 以获得相同的结果。
您发布的代码行没有任何问题,
在这两种情况下(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 的设备,当然...
您总是不会为两者获得相同的位置。事实上,如果您明天回到完全相同的位置并打开定位服务,即使您使用相同的技术,您也可能无法获得相同的经纬度。
您从 CLLocationManager
获得的纬度和经度并不是一门精确的科学。事实上,如果您查看收到的原始 CLLocation
对象,您会注意到有一个 horizontalAccuracy
属性 反映了 accurate/inaccurate 坐标可能的样子。当您第一次启动位置服务时,您甚至会看到多个位置进来,而且通常准确性越来越高。
但它永远不会是完美的,你不应该期望它是完美的。这就是为什么在真实设备上测试位置感知代码很重要的原因之一,因为模拟器会让人误以为绝对准确,这在现实世界中是不存在的。您应该编写预料到这一点的代码。而且,如果不出意外,您应该开始考虑 horizontalAccuracy
从位置管理器收到的对象。
我正在计算两个位置之间的距离,如下所示
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 时它给出不同的结果 network.how 以获得相同的结果。
您发布的代码行没有任何问题,
在这两种情况下(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 的设备,当然...
您总是不会为两者获得相同的位置。事实上,如果您明天回到完全相同的位置并打开定位服务,即使您使用相同的技术,您也可能无法获得相同的经纬度。
您从 CLLocationManager
获得的纬度和经度并不是一门精确的科学。事实上,如果您查看收到的原始 CLLocation
对象,您会注意到有一个 horizontalAccuracy
属性 反映了 accurate/inaccurate 坐标可能的样子。当您第一次启动位置服务时,您甚至会看到多个位置进来,而且通常准确性越来越高。
但它永远不会是完美的,你不应该期望它是完美的。这就是为什么在真实设备上测试位置感知代码很重要的原因之一,因为模拟器会让人误以为绝对准确,这在现实世界中是不存在的。您应该编写预料到这一点的代码。而且,如果不出意外,您应该开始考虑 horizontalAccuracy
从位置管理器收到的对象。