在 iOS 中使用 CLGeocoder 进行转发地理编码,为某些位置的位置返回 null
Posted
技术标签:
【中文标题】在 iOS 中使用 CLGeocoder 进行转发地理编码,为某些位置的位置返回 null【英文标题】:Forward geocoding with CLGeocoder in iOS returning null for locality of certain locations 【发布时间】:2013-07-25 05:13:32 【问题描述】:我正在尝试对字符串进行前向地理编码,它通常可以正常工作,但是对于某些位置,例如“温哥华”,它会为结果地标的位置返回 null,但它确实会返回国家、省、和坐标。我什至尝试对从前向地理编码中找到的坐标进行反向地理编码,虽然没有失败,但它返回了一个不同的位置,“穆迪港”。
最奇怪的是,我尝试通过 Apple 的 Geocoder 示例代码运行 Vancouver,它运行良好。位置不会出现空值。
另外,我正在测试它,它突然开始工作,然后我再次检查它停止工作。什么给了?
这是我的代码。怀疑它会有多大帮助。
-(BOOL) textFieldShouldReturn:(UITextField *)textField
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:textField.text completionHandler:^(NSArray *placemarks, NSError *error)
self.placemark = [[MKPlacemark alloc] initWithPlacemark:[placemarks objectAtIndex:0]];
if (error)
NSLog(@"Geocode error %@",error.debugDescription);
[self alertForFailedGeocode];
return;
if (self.placemark.locality == nil || self.placemark.country == nil)
//eg if you search "Canada" you'll get a nil locality, and the coordinate is in the middle of nowhere.
if (self.placemark.location)
[geocoder reverseGeocodeLocation:self.placemark.location completionHandler:^(NSArray *placemarks, NSError *error)
if (error)
[self alertForFailedGeocode];
return;
self.placemark = [placemarks objectAtIndex:0];
[self alertForConfirmGeocode:[self locationStringForPlacemark:self.placemark]];
self.location = self.placemark.location;
self.isUsingCurrentLocation = FALSE;
return;
];
return;
else
NSLog(@"Geocode failed BECAUSE nil locality or country or both");
[self alertForFailedGeocode];
return;
NSLog(@"%d places found",placemarks.count);
[self alertForConfirmGeocode:[self locationStringForPlacemark:self.placemark]];
self.location = self.placemark.location;
self.isUsingCurrentLocation = FALSE;
];
return YES;
【问题讨论】:
嗯,显然对于加拿大本地化将是空的,但即使对于新加坡也是空 - 这很烦人 【参考方案1】:地理编码操作不在设备上处理,需要互联网连接,因为它们发生在云端。它有它的优点和缺点。
优点:
保存您的设备资源,因为转换是在云端进行的。 随着技术的进步,Apple 可以在云上更新他们的 API,这可以为我们的应用程序提供更好的性能,甚至无需更改 代码中的任何内容。
缺点:
您需要稳定的互联网连接才能访问地理编码 API。
现在来到您的情况,我的猜测是由于互联网连接,您无法完全使用地理编码 API。可能这就是为什么你没有得到本地化的原因。
那么问题是你如何获得国家、省份和坐标?
碰巧的是,正向地理编码器可以让您获得高水平 基于本地设备的国家、地区等信息 信息,但需要互联网连接才能获得更多信息 地点等信息。
【讨论】:
很好的答案,虽然我的互联网似乎很好。那么我唯一的问题是为什么它在 ios Geocoder 示例代码中有效? developer.apple.com/library/ios/#samplecode/GeocoderDemo/… 基本上相同的操作,相同的模拟器,大约在同一时间完成,互联网运行良好,许多其他位置运行良好,但当我搜索温哥华时没有城市名称(我还没有找到其他为我做这件事的地方,但想必不止一个) 我试过你的代码,它返回了我的位置。我不知所措。您能否告诉我您在 textfield.text 中使用的确切 NSString。我用温哥华,它给了我当地的感觉。 在“温哥华”中使用了多种不同的变体。就像我说的,在同一个模拟器上运行的 Apple 示例代码似乎总是可以正常工作,但大多数时候我的代码不起作用。有一次它似乎开始正常工作,但后来我无法重现。 您的代码在我看来运行良好。我可以建议延迟一段时间吗?因为地理编码需要时间并且它发生在另一个线程上。您必须调用某种方法来创建/标记注释。您可以在延迟一段时间后调用该方法 [self performSelector:@select(createAnnotation:) withObject:nil afterDelay:5.0];您可以在方法执行之前显示活动指示器视图...以上是关于在 iOS 中使用 CLGeocoder 进行转发地理编码,为某些位置的位置返回 null的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOs 中使用 CLGeoCoder 使用邮政编码/邮政编码获取纬度经度?
XCode 4.3 使用错误链接的 dylib 构建 iOS 应用程序(未找到符号:_OBJC_CLASS_$_CLGeocoder)