批量地址解析2000万个美国地址


34

美国是否有任何免费或价格合理的数据库可以搜索并返回纬度和经度信息?


快速是可以的,但准确性才是关键。-Wyatt Earp与地理编码器打交道时,有一些(例如该线程中引用的)以低廉的价格对许多地址进行地理编码,但是如果您想在许多不同的领域中寻求非常好的精度,则需要高级地理编码器。结果将更加一致和异常准确,尤其是在没有邮政匹配的情况下。在最精确的地理编码方面,您没有什么可与之抗衡的,否则您的计算就无法与其他向用户提供技术的技术保持一致

2
您提供有关高质量需求的意见,但没有建议。请提供您的一些建议,否则无助于回答用户的问题。
RyanDalton

Answers:


30

对于那么多记录,甚至不考虑使用Web服务。在您完成任务之前,他们会节流或切断您的注意力。

因此,您的选择变成了在本地运行,为此,您有几个商业或免费选择。

免费选项将使用人口普查TIGER数据集,您需要将其加载到空间数据库中。您可以找到针对TIGER for PostGIS 甚至sqlite 进行地理编码的库。哎呀,您甚至可以使用ArcGIS对TIGER进行地理编码。当然,ArcGIS不是免费的,这使我有了下一个商业选择。如果您确实有获得ArcGIS许可的机会,那么您将拥有带有TeleAtlas(我的意思是Tom Tom)或Navteq数据集的StreetMap DVD 。这取决于您是否捆绑了StreetMap Premium。这两个数据集中的任何一个都可能比TIGER提供更一致的结果。

加载数据后,请帮自己一个忙,并制作街道数据库的多个副本,并在具有输入数据子集的多台计算机上运行地理编码过程。不要尝试仅在一台计算机上运行它,否则您将等待数天才能完成它,更不用说您运行的任何进程很可能在完成之前都会泄漏内存并崩溃几次。这意味着您要为流程设置不同的检查点。


2
我发现将输入和地址数据分成较小的部分(例如状态)是有益的。这使定位器的使用速度更快,并且运行时间过长,进程锁定的可能性也较小。通常,编写一个基于状态的循环来编写一个定位器来进行定位器创建和地理编码通常不太难。
纳撒努斯2012年

26

我在SmartyStreets(地址验证公司)工作。我们的服务对所有人都是免费的(不超过基本水平)。创业公司也可以要求第一年完全免费使用我们的服务。因此,如果您符合该分类,则一年的无限制服务是免费的。

Ragi建议不要使用Web服务,但是,我们的API可以在大约5个小时内(大约每秒1000个)轻松为您清理,标准化和地理编码2000万个地址。某些时间取决于计算机的速度(您拥有多少个内核)和您的网络连接(不要通过3G尝试,但是标准的宽带连接就可以了)。

只是想指出,使用Web服务当然是可能的。

更新:从2017年8月1日起,我已经对Web服务进行了远程测试,并且仅使用一个2015年的MacBook Pro在无线网络上就获得了每秒70,000秒钟的持续查询。是的,这非常快。这意味着一个只有2000万个地址的小名单仅需5分钟。


2
好吧,如果您要让他对2000万条记录进行地理编码而不给他一角钱,并且每秒可以完成1000次/请求(非常令人印象深刻),那么与从头开始构建自己的堆栈相比,这当然是一个更好的解决方案。
Ragi Yaser Burhum'3

1
绝对。1000 /秒不是最大值 这只是一个很好的标准。多线程,多核和更快的网络连接甚至可以提高吞吐量。我们最近有一个非营利性客户,该客户刚刚使用我们的服务处理了1.8亿个地址。随着全国大选的临近,许多团体正在努力清理和地理编码其地址。
Jeffrey

1
@RagiYaserBurhum注意,克里斯也在寻求“价格合理”的解决方案。当然,从头开始构建自己的堆栈可能是“免费的”,但是当您考虑机会成本时,确实如此吗?您自己做就可以获得的好处:可能没有成本(“免费”)。使用现有服务的好处:节省大量时间。另外,对于现代的Web架构(并行化)来说,处理不断的流量负载可能是当今的每秒1000个请求。最后,我认为对于这件事,“免费”和“合理定价”是优先事项。
马特

1
@Matt放下“免费”并不总是免费的。我不会反对这一点(您的时间很值得)。我很清楚,大多数开源解决方案的成本实际上是成本模型从使用许可到支持服务的转变。我并不是想讽刺,我确实认为,如果Jeffey可以免费(甚至合理定价)提供解决方案,那将更好的解决方案。以SmartyStreets 的最高上市价格,2,000万个积分将花费100,000美元。我敢肯定,即使是在商业用例中,它们也可以节省一小部分费用。
Ragi Yaser Burhum 2012年

1
同样,每秒1000 / req / s(这在当代体系结构中非常可行)仍将需要一些出色的工程来进行地理编码。他们为此得到了我的道具:)
拉吉·亚瑟·伯姆

8

我使用此演练描述了如何使用2010 TigerLine数据构建Postgis地理编码器。我现在正在运行它-速度不快,因为要对200万个地址进行地理编码需要3周的时间。

但是,它是免费的,不受限制的,并且花费最少的代码和Postgres技能的人用了不到2天的时间来设置并加载一个(大型)州的数据来开始地理编码。我也没有为该系统做过postgres调优,而是在NFS挂载上运行,因此我怀疑如果需要,我可以从中获得一两个数量级的性能提升。

我没有使用Web服务,而是将我的所有地址都加载到了postgres数据库中,然后运行一个快速而又肮脏的perl脚本来一次对所有地址进行地理编码:

perl -e for ($i=1; $i<[max_key_value]; $i+=1) 
   {printf "UPDATE source_addresses
               SET (rating, new_address, lon, lat) 
                     = (g.rating, pprint_addy(g.addy), 
                       ST_X(g.geomout), ST_Y(g.geomout) ) 
              FROM (SELECT DISTINCT ON (address_id) address_id, (g1.geo).* 
                      FROM (SELECT address_id, (geocode(address)) As geo 
                              FROM source_addresses As ag 
                             WHERE ag.rating IS NULL and address_id = $i 
                           ) As g1 
                     ORDER BY address_id, rating LIMIT 1
                   ) As g WHERE g.address_id = source_addresses.address_id;\n"
  } | psql -d geocoder 

(仅出于可读性而换行)

这样就生成了“使用该ID值对地址进行地址解析并使用最佳匹配”更新语句,并将其通过管道传递给psql来执行此操作。它只会尝试对没有评级的地址进行地址解析-即尚未进行地址解析的地址。因此它是可重新启动的,并且每个步骤都是独立完成的。


您是否发现某些地址的2010 TigerLine数据不正确?
克里斯·穆恩奇

无论如何,它都不是完美的数据。但是,从质量的角度来看,我拥有的地址数据是有争议的。所撰写的地址解析器确实提供了“评分”字段,其中值越低越好。我将在示例中添加一个示例。
Adam Musch 2012年

@ChrisMuench:如果您给我一个或两个加利福尼亚州的地址,我很高兴通过我的地址解析器向他们射击以向您展示-这样我就不会接他们。
亚当·穆奇

好吧,我在纽约的某个地址尝试了postgis地理编码器,它们可能相距500英尺至1英里
Chris Muench 2012年

这对您来说太少了,为时已晚,但是其他人可能会觉得有用。请确保您的地址解析正确。当我添加逗号时,我发现普通连接的“ 123 Oak St. Anytown ST 12345”加速了550倍:“ 123 Oak St.,Anytown,ST,12345”
aaryno

3

我猜您想对地址进行地理编码但不为此付出任何代价?您可以使用一堆服务对2000万条记录进行地理编码,但这会花费您很多。Esri,Pitney Bowes和其他公司通过订阅或每x地理编码的费用提供这些服务。2000万不是一件小事,但我认为这是一个商业案例。



3

这篇帖子可能为时已晚,无法帮助原始海报。但是,对于希望免费对大量数据进行地理参考的其他人,您可以查看我的软件“ Easy Georeferencer”,该软件独立创建,易于使用且功能强大(请参阅文章底部的屏幕截图)。

该程序简单易用,可直接从无需安装的exe文件运行。您可以选择在GNS或GeoNames数据源之间进行地理编码,并且可以执行迄今为止其他地理编码器无法完成的工作,可以基于GADM管理单位数据库对省份进行地理编码,也可以对CShapes数据集中的历史国家/地区边界进行地理编码。唯一的警告是它不对地址数据进行地理编码。所有输出都以shapefile的形式提供,可以在GIS中立即进行可视化/分析。

至于大数据的效率和处理,该程序已经过测试,仅3小时即可对10万条记录进行地理编码。对于较大的数据集,预期的处理时间增加应呈曲线下降,因为大部分处理时间仅在加载国家参考数据集时才进入初始阶段,但随后会增加。同样,在对大型数据集进行地理编码时,不必担心互联网瓶颈或连接问题,因为软件,参考数据集和处理都基于本地计算机。匹配率可以达到80-90%,因为它基于模糊名称匹配来解决拼写差异。

下载包中包含更多详细信息,包括入门论文和初学者指南。无需犹豫,该程序只是一个简单的文件,您可以将其放置在桌面上并在桌面上运行,而无需承担任何义务或使计算机混乱。

可以从以下网站下载该软件:http : //geocodeanything.wordpress.com/

希望能有所帮助。

在此处输入图片说明


您应该始终披露自己是生产软件产品的公司的作者/开发人员和/或工作。
2013年

@RyanDalton在写“我创建的软件”时,我确实透露过我是作者,尽管我可以看到它可能没有引起注意,因为它在句子中没有给予太多强调。更改了我的措词,希望可以使我更清楚自己在拥护自己的软件。
卡里姆·巴格加特

2

当您将对美国地址进行地理编码时,我认为Data Science Toolkit中的“ 街道地址到坐标”工具将很适合您。

This API takes either a single string representing a postal address, or a JSON-encoded  
array of addresses, and returns a JSON object with a key for every address. The value 
for each key is either null if no information was found for the address, or an object 
containing location information, including country, region, city and latitude/longitude 
coordinates.

您可能想要下载虚拟机,然后从自己的硬件运行它。这样,您不必担心API限制,也可以控制它。哦,我是说免费的吗?;-)


太神奇了!我很惊讶从未听说过它。加上它的强大功能,您可以下载VM,并使其已经可以在您自己的系统上运行。
瑞安·道尔顿

它也是开源的。:) github.com/petewarden/dstk
RK

2

我没有看到您需要的精度水平的任何参考,但是我假设您想要屋顶长拉特或接近它。输入地址的质量也可能是一个因素。完整的地址列表比不完整或错误的地址列表更好,更快地编码。此外,是否可以接受90%的命中率,还是需要对所有2000万个地址进行编码?我没有免费的解决方案,但是我知道并使用了一个相对便宜的解决方案。来自Semaphore Corp的ZP4,http://www.semaphorecorp.com/提供了地址清理器/地理编码器和插件,该插件将处理这些地址并返回已清理的地址,一个标志(指示该地址是否可交付USPS)以及ZIP + 4的长经度。ZIP + 4精度通常在建筑区域(街道的正确侧面和正确的街区)接近屋顶精度,而在农村地区则不接近屋顶精度。30天许可的费用为120美元。在那之后,地址清理器仍将起作用,但是传递点验证(DPV)和地理位置返回将不再起作用。如果使用过去两年内建立起来的相对较快的计算机,并且所有本地数据都可以在本地存储和访问,那么2000万条记录应在10天内完成。在过去的15年中,我一直在对地址进行地理编码,并且在大部分时间里我一直在使用ZP4。在他们提供长期或DPV之前,


2

我现在正在对1800万个地址进行地理编码,因此我想分享自己的设置。

基本上,我使用一个简单的剧本将Amazon EC2实例设置为PostGIS Tiger Geocoder服务器,然后使用脚本批处理地理编码地址,并将其映射到人口普查区块。

Amazon EC2的成本:最低要求的180G SSD成本约为每月18美元。我的t2.large实例每月总费用约为90美元。

如果您的Linux机盒的SSD> 180G,则基本上也可以免费使用。

我的平均性能大约是170〜300毫秒/质量好的地址,400〜600毫秒/质量差的地址。糟糕的质量是指其中许多人缺少或输入了错误的城市,邮政编码,甚至是错误的地址。这种地址需要更长的时间进行地址解析,因此您的性能取决于输入的质量。我使用的Amazon EC2实例可以在一个月内对大约400万个格式很差的地址进行地理编码。

有关更多详细信息,请参阅有关系统设置脚本的我的博客文章。



1

如果您的工作流程是使用Python,则geopy是一个很好的解决方案。您可以抽象地编写基本的地理编码逻辑,然后从众多提供商(ArcGIS,百度,必应,DataBC,GeocodeFarm,GoecoderDotUS,GeoNames,Google,IGN France,LiveAddress,NaviData,Nominatim(OSM),OpenCage,OpenMapQuest, Yahoo! BOSS Place Finder,What3Words,Yandex ...。您甚至可以使用所有这些元素,并最终选择最有信心的点,该点可以通过多个地理编码服务的验证来正确。其中许多服务需要注册(但不是全部)。它们可能不太适合在美国使用,但是使用整洁的Python函数进行操作的好处是您应该能够对此进行控制。

这是一个简短的示例:

from geopy.geocoders import Nominatim
geolocator = Nominatim(country_bias='New Zealand', timeout=4)
geocoded = geolocator.geocode('Raglan, Waikato', exactly_one=True)
if geocoded is not None:
    # success
    lat = geocoded.latitude
    lon = geocoded.longitude

https://geopy.readthedocs.org/zh/1.10.0/

真正唯一困难的部分是确保您的地址格式不正确。但是,对2000万个位置进行地理编码仍可能需要花费大量时间,但是...这种负载可能会违反某人的服务条款。希望这对某人有帮助。


我可以与此一起使用CSV吗?
Salman

当然,如果您是使用Python阅读的。
alphabetasoup

0

如果您的地址解析请求每天不超过2,500,则可以使用Google地理编码API。您应该浏览一下api,它可以以json或xml的形式返回结果。

使用限制:

每天使用Google Geocoding API的查询限制为2500个地理位置请求。(Google Maps API for Business用户每天最多可以执行100,000个请求。)

例:

http://maps.google.com/maps/geo?key=yourkeyhere&output=json&q=520+3rd+Street+San+Francisco+CA

结果示例:

{
  "name": "520 3rd Street San Francisco CA",
  "Status": {
    "code": 200,
    "request": "geocode"
  },
  "Placemark": [ {
    "id": "p1",
    "address": "520 3rd St, San Francisco, Kaliforniya 94107, Amerika Birleşik Devletleri",
    "AddressDetails": {
   "Accuracy" : 8,
   "Country" : {
      "AdministrativeArea" : {
         "AdministrativeAreaName" : "CA",
         "SubAdministrativeArea" : {
            "Locality" : {
               "LocalityName" : "San Francisco",
               "PostalCode" : {
                  "PostalCodeNumber" : "94107"
               },
               "Thoroughfare" : {
                  "ThoroughfareName" : "520 3rd St"
               }
            },
            "SubAdministrativeAreaName" : "San Francisco"
         }
      },
      "CountryName" : "USA",
      "CountryNameCode" : "US"
   }
},
    "ExtendedData": {
      "LatLonBox": {
        "north": 37.7826364,
        "south": 37.7799384,
        "east": -122.3942267,
        "west": -122.3969247
      }
    },
    "Point": {
      "coordinates": [ -122.3955757, 37.7812874, 0 ]
    }
  } ]
}

您可以从Google查看一些示例链接以进行地理编码:

1.单一代码

2.反向地理编码

3.从Google GeoCoding开始

我希望它对你有帮助


15
对2000万个位置进行地理编码仅需22年(8,000天)。完全合理的解决方案。
安迪W

我知道这一点,我已经表示过,如果他的地址解析请求每天不超过2500,他可以使用...如果他找不到任何解决方案,这是一个选择
Aragon

4
这违反了服务条款。除非您在Google Map上显示结果,否则它是ilegal。即使您这样做,我也会发现“高速缓存的论点”,即有人为2000万个功能扩展了一些内容!
Ragi Yaser Burhum 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.