如何一次对一组 200 个地址进行地理编码

Posted

技术标签:

【中文标题】如何一次对一组 200 个地址进行地理编码【英文标题】:How to geocode a set of 200 addresses at once 【发布时间】:2013-03-21 12:33:29 【问题描述】:

我了解到 ios 将应用程序一次限制为大约 50 个地理编码请求。如果我有大套装,可能有 200 套怎么办?有什么方法可以一次对超过 50 套进行地理编码?例如,使用集合之间的延迟,每个集合限制为 50 个。延迟集合之间的地理编码的理想方法是什么?

我看过 NSProgrammer 对以下问题的回答:

iPhone iOS5 CLGeocoder how to geocode a large (200) set of addresses?

对他提到的那种延迟有什么建议吗?该延迟会在处理程序内部并在另一个线程上运行吗?

for(int i = 0; i < [myArray count]; i++)

[call geoCoderMethod];



-geoCoderMethod
    [geocoder geocodeAddressString:addressString completionHandler:^(NSArray *placemarks, NSError *error) 

    getCo-ordinates;
    add annotation to mapview;

我尝试将数组拆分为每个 25 项的块并调用 geoCoderMethod 并使用 performSelector 方法引起延迟。但是performSelector 方法和geoCoder 似乎在不同的线程中运行,我无法在方法调用之间造成延迟。

【问题讨论】:

【参考方案1】:

这里的完整解决方案取决于您的逻辑。您可以使用可变数组来存储所有 200 个地址并运行“for 循环”以将发送请求限制在 50 以下,例如 20 或 30 取决于您的地址数组的数组计数。并除以你的限制来决定如果你有 200 个地址,这个“for 循环”应该循环多少次,然后如果你除以 20,那么你的“for 循环”总共运行 10 次,每次运行它都会发送 20 个地址进行地理编码.这样它就不会达到 50 并且您可以轻松检索。

【讨论】:

【参考方案2】:

我有一组地址,我需要将它们转换为坐标。我所做的是将集合分成最多 40 个联系人的块(您可能会增加到 50 个,但在一分钟内不会超过)。因此,拥有超过 40 个联系人的组必须在两者之间设置延迟,以便在加载地图视图之前处理所有地址并将其转换为坐标。

我需要根据用户要求加载地图视图。在我的情况下,无论组中的联系人列表和时间因素如何,都可以再次加载地图视图并获得收益。 如果用户打算加载地图视图并在 1 分钟内再次重新加载,我需要为此开发一个逻辑。为此,我决定保存地图视图的状态,如果用户决定在 1 分钟内重新加载同一组地址。

但如果用户决定加载另一组联系人,那么我必须根据要加载的联系人组重新考虑我的逻辑。所以我必须跟踪要加载哪个组(以前的组或新组),该组的联系人数量是否超过 40。

我必须注意的另一个重要因素是时间。为此,我有一个静态的NSDate 变量,它始终跟踪CLGeocoder 上次工作的“时间”,如果当前时间(CLGeocoder 即将使用时)没有相差 1 分钟,然后我不得不延迟加载地图。

这是我使用来自CLGeocoder 的坐标实现mapView 所做的。我相信逻辑可以在很大程度上优化,输出会更快。 如果有人提出更好的实现,将不胜感激。

【讨论】:

以上是关于如何一次对一组 200 个地址进行地理编码的主要内容,如果未能解决你的问题,请参考以下文章

使用前向地理编码获取iOS中许多地址的纬度和经度时如何添加延迟?

如何在 PHP 中对谷歌地理编码 api 进行批量纬度/经度查找?

地理编码服务[关闭]

如何使用 PHP 对 MapQuest 地理编码器进行批量地理编码?

如何对非标准业务地址进行地理编码

如何从谷歌地图地理编码返回地址类型?