9

我有以下代码:

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
)

有任何想法吗?

4

3 回答 3

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's来比较距离,而不是与 比较距离containsCoordinate:

希望能帮助到你。

于 2012-11-29T18:12:32.187 回答
2

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

CLGeocoder参考在其概述中指出:

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

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

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

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

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

于 2012-04-20T06:23:27.313 回答
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

于 2012-08-20T08:55:24.053 回答