如何从CLGeocoder获取多个地标标记

8
无论我给地理编码器提供什么地址([geocoder geocodeAddressString:completionHandler:]),它总是只在placemarks数组中放置一个对象。
有没有办法获得多个结果(就像Maps应用程序中那样),让用户选择一个?
2个回答

11

苹果的原生地理编码服务由MapKit框架提供。该框架中的重要对象是MKLocalSearch,它可以将地址进行地理编码并返回多个结果。

MKLocalSearchmapItems中返回10个MKMapItem类型的结果。每个MKMapItem包含一个MKPlacemark对象,这是CLPlacemark的子类。

以下是使用MapKit的MKLocalSearch的示例:

MKLocalSearchRequest* request = [[MKLocalSearchRequest alloc] init];
request.naturalLanguageQuery = @"Calgary Tower";
request.region = MKCoordinateRegionMakeWithDistance(loc, kSearchMapBoundingBoxDistanceInMetres, kSearchMapBoundingBoxDistanceInMetres);

MKLocalSearch* search = [[MKLocalSearch alloc] initWithRequest:request];
[search startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) {
   yourArray = response.mapItems; // array of MKMapItems
   // .. do you other logic here  
 }];

3
我已经对数据包进行了嗅探,似乎CLGeocoder没有连接到Google的地理编码服务,而是连接到了苹果公司的。我还注意到每次只能从那里获取一个地标。
如果你想要更复杂的内容,你应该使用Google或其他地理编码服务。我使用SVGeocoder(https://github.com/samvermette/SVGeocoder),它具有非常相似的API与CLGeocoder。

1
为什么会这样?根据 Apple 文档,在进行正向地理编码请求时,如果提供的信息导致多个可能的位置,则可能返回多个地标对象。 - prince
我认为目前苹果的地理编码服务相当有限。我预计它很快会有所改变。你可以看到苹果正在急于摆脱对谷歌的依赖。 - Maciej Trybiło
尽管iOS 6原生地图搜索解决方案似乎实现了每个人都在寻找的东西,但从CLGeocoder返回多个“placemark”仍然存在问题,这很有趣。我想知道Apple目前正在使用什么解决方案。 - NSTJ
2
SVGeocoder使用Google地理编码服务,顺便说一下,您不能在没有在Google地图上显示结果的情况下使用该服务。 - Matt Green

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接