CLGeocoder 在其他国家/地区的返回位置

Posted

技术标签:

【中文标题】CLGeocoder 在其他国家/地区的返回位置【英文标题】:CLGeocoder returning locations in other countries 【发布时间】:2012-04-18 03:55:43 【问题描述】:

我有以下代码:

CLGeocoder *_geo = [[CLGeocoder alloc] init];
CLRegion *region = [[CLRegion alloc] initCircularRegionWithCenter: CLLocationCoordinate2DMake(37.33233141, -122.03121860) radius:100 identifier:@"San Francisco"];
[_geo geocodeAddressString:@"Starbucks" inRegion:region
             completionHandler:^(NSArray *placemarks, NSError *error)

    NSLog("%@", placemarks);
];

这将返回菲律宾的星巴克位置,即使该中心位于旧金山的中部。

(NSArray *) $3 = 0x07cd9d10 <__NSArrayM 0x7cd9d10>(
Starbuck's, Metro Manila, Quezon City, Republic of the Philippines @ <+14.63617752,+121.03067530> +/- 100.00m, region (identifier <+14.63584900,+121.02951050> radius 166.35) <+14.63584900,+121.02951050> radius 166.35m
)

有什么想法吗?

【问题讨论】:

【参考方案1】:

这是一个对我有用的解决方法。我使用geocodeAddressString: completionHandler: 没有考虑地区。

之后,我根据返回的地标构建一组地标,但只包括最近的地标。

请注意,此代码不会检查是否存在错误。我已将其删除以使其更简单。

CLLocation *centerLocation = [[CLLocation alloc] initWithLatitude:37.33233141 longitude:-122.03121860];

CLLocationDistance maxDistance = <YOUR_MAX_DISTANCE>;

CLGeocoder *geo = [[CLGeocoder alloc] init];
[geo geocodeAddressString:addressString
        completionHandler:^(NSArray *placemarks, NSError *error)

    NSMutableArray *filteredPlacemarks = [[NSMutableArray alloc] init];
    for (CLPlacemark *placemark in placemarks)
    
        if ([placemark.location distanceFromLocation:centerLocation] <= maxDistance)
        
            [filteredPlacemarks addObject:placemark];
        
    

    // Now do whatever you want with the filtered placemarks.
];

或者,如果您想继续使用区域:您可以使用CLRegioncontainsCoordinate:,而不是与distanceFromLocation: 比较距离。

希望对你有帮助。

【讨论】:

【参考方案2】:

虽然看起来不太可能,但显然 a) Apple 不打算在某个地区附近对公司名称进行转发地理编码,或者 b) 这是一个错误。

CLGeocoder reference 在其概述中指出:

转发地理编码请求获取用户可读地址并找到相应的纬度和经度值...

这当然意味着一个真实的物理地址作为搜索字符串(尤其是“用户可读地址”部分)。但是,geocodeAddressString: inRegion: completionHandler: 的文档指出搜索字符串是:

...描述您要查找的位置的字符串...

这更加模糊。我尝试通过我的几个项目运行您的代码,以及与它非常相似的代码,我得到了相同的结果。 甚至 Apple 的 GeocoderDemo sample 也显示了这个问题(虽然我住在加利福尼亚,距离你的经纬度示例仅约 150 英里),所以我们俩肯定都没有写过。

我开始寻求帮助/与您一起解决这个问题!但是,这一点是研究是我所拥有的。祝你好运。

【讨论】:

我想知道官方的谷歌地图应用程序是如何做到的?当我在应用程序中输入 Starbucks 时,他们似乎做得正确 这完全是在黑暗中拍摄的,但他们可能没有使用 CoreLocation。 Google Maps 应用程序出现在 ios 1.0 中,CoreLocation 直到 iOS 2.0 才出现,CLGeocoder 直到 iOS 5.0 才出现。也无法说明 Google 可能对 Apple 施加了哪些限制,作为其在 iPhone 上免费(直接)向用户收费的 Google 地图技术的一部分。【参考方案3】:

我修正了你的答案。你有一个错误,你翻转了 GPS 坐标。如果您像这样更改它们,则查询效果很好!

http://maps.googleapis.com/maps/api/geocode/json?bounds=37.832331,-121.531219|36.832331,-122.531219&language=en&address=starbucks&sensor=true

【讨论】:

以上是关于CLGeocoder 在其他国家/地区的返回位置的主要内容,如果未能解决你的问题,请参考以下文章

从 CLGeocoder 获取当前城市和国家?

在 iOS 中使用 CLGeocoder 进行转发地理编码,为某些位置的位置返回 null

国家名称的坐标/地区

通过 CLGeocoder 的方法查找一个区域中的所有位置

地图上的多个位置(使用MKMapItem和CLGeocoder)

CLGeocoder() 意外返回 nil