我有以下代码:
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
)
有什么想法吗?
答案 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坐标时出错。如果你这样更改它们,查询效果很好!