iOS 正向地理编码返回不稳定、稀疏的结果

Posted

技术标签:

【中文标题】iOS 正向地理编码返回不稳定、稀疏的结果【英文标题】:iOS Forward Geocoding returns shaky, sparse results 【发布时间】:2014-08-21 08:56:54 【问题描述】:

我正在开发一个需要能够按名称搜索位置的应用程序,感谢CLGeocoder,它看起来应该相当简单。我已经完成了所有设置,它似乎正在工作,但我得到的结果非常稀疏。

无论我输入什么,我最多会得到 1-2 个结果,通常根本没有。当我搜索“太平洋水族馆”时,它会正确找到它,但只有当我真正完成输入时:甚至只留下最后一个字母“c”,它什么都没有。输入我自己的地址不会返回任何内容,即使我完全输入它也是如此。

是这样的吗?当然CLGeocoder 不是没用吗?我可以做些什么来增加返回结果的数量,或扩大可能的匹配范围?

下面是我正在使用的代码,连接到一个简单的 UITableViewUISearchBar 对...

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
    [_placeResults removeAllObjects];
    [_geocoder geocodeAddressString:searchText completionHandler:^(NSArray* placemarks, NSError* error)
        for (CLPlacemark* aPlacemark in placemarks) 
            [_placeResults addObject:aPlacemark];
        
        [_mainTableView reloadData];
     ];


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    return [_placeResults count];


-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    SearchTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    CLPlacemark *thisPlace = [_placeResults objectAtIndex:indexPath.row];
    [cell.labelTitle setText:[[[thisPlace addressDictionary] objectForKey:@"FormattedAddressLines"] objectAtIndex:0]];

    return cell;

正如我所说,它确实有点作用,所以我知道一切都正确连接。只是效果不太好

有什么建议吗?

【问题讨论】:

ios 并没有真正的“位置自动完成搜索 api”。 CLGeocoder 和 MKLocalSearch 假定提供了完整的文本。一种流行的替代方法是 Google 的 Place Autocomplete API,但从技术上讲,您可能还需要切换到使用 Google Maps for iOS SDK,因为 Google 自动完成结果“必须与 Google 地图一起使用”(如果您打算在地图)。 【参考方案1】:

我认为您对 CLGeocoder 的用途有错误的认识。它的目的是在地理位置坐标和它的全文标题之间进行转换。

此外,您是否阅读过文档? CLGeocoder 需要联系地理编码服务器。因此,在 textDidChange: 消息的每次迭代中调用它不仅使用不当,而且效率极低。

来自 Apple 的文档:

应用程序应该意识到它们如何使用地理编码。每个应用程序的地理编码请求都有速率限制,因此在短时间内发出过多请求可能会导致某些请求失败。 (当超过最大速率时,地理编码器会将值为 kCLErrorNetwork 的错误对象返回给关联的完成处理程序。)以下是有效使用此类的一些经验法则:

为任何一项用户操作最多发送一个地理编码请求。

如果用户执行多个涉及对同一位置进行地理编码的操作,请重复使用初始地理编码请求的结果,而不是为每个操作启动单独的请求。

这里的想法是每个应用程序都受到 Apple 的速率限制。因此,您需要谨慎使用 API,并提交全文查询。

摘自geocodeAddressString:completionHandler:

发起正向地理编码请求后,不要尝试发起另一个正向或反向地理编码请求。

【讨论】:

我正在离开 Apple 的“地理编码位置数据”文档 (developer.apple.com/library/ios/documentation/UserExperience/…) 底部的“将地名转换为坐标”部分,这似乎表明这是一种可行的方法根据书面姓名/地址查找位置。但如果这不是这样做的方法,我当然愿意接受更好的主意。您将如何制作位置搜索功能,就像在 Google/Apple Maps 风格的应用程序中那样? @AlexanderWinn 如果您尝试进行某种基于位置的自动完成搜索(即用户开始输入并出现地址),您很可能需要实现自己的数据库,因为它是一个昂贵的操作。看看来自 Apache 的 SOLR,它们具有您正在寻找的搜索功能。不过警告,这不是一项简单的任务。 Arg,很公平。谢谢你的帮助!我希望有一种快速的方法来实现对位置的实时搜索,但如果没有,我想问题已经得到解答。嘘。 +1 为 Shucks。是的。如果您确实找到了服务,请告诉我...不过,我相信它会非常昂贵。

以上是关于iOS 正向地理编码返回不稳定、稀疏的结果的主要内容,如果未能解决你的问题,请参考以下文章

使用 CLGeocoder 的正向地理编码示例

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

单个应用程序中的正向和反向地理编码:需要方向

谷歌地图地理编码器返回相同的结果

pygeocoder 返回错误的地理编码

如何防止谷歌地理编码器从其他国家返回结果