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

时间:2012-04-18 03:55:43

标签: objective-c ios clgeocoder

我有以下代码:

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
)

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

这是一个适合我的解决方法。我正在使用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.
}];

或者,如果您想继续使用区域:而不是将距离与distanceFromLocation:进行比较,则可以使用CLRegion的{​​{1}}。

希望它有所帮助。

答案 1 :(得分:2)

虽然看起来似乎不太可能,但似乎a)苹果公司并不打算在某个地区附近进行地理编码业务名称,或者b)这是一个错误。

CLGeocoder reference在其概述中指出:

  

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

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

  

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

更加模糊。我尝试运行你的代码,代码与它非常相似,通过我的几个项目得到了相同的结果。 即便是Apple的 GeocoderDemo sample也会出现这个问题(虽然我住在加利福尼亚州距离你的长/长的例子只有150英里),所以我们当中没有写过任何内容。

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

答案 2 :(得分:0)

我修复了你的答案。您在翻转GPS坐标时出错。如果你这样更改它们,查询效果很好!

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