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

#1 楼

对于那么多的记录,甚至不考虑使用Web服务。在完成任务之前,它们会限制或切断您的工作。

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

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

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

#2 楼

我在SmartyStreets(地址验证公司)工作。我们的服务对所有人都是免费的(不超过基本水平)。创业公司也可以要求在第一年完全免费使用我们的服务。因此,如果您符合该分类标准,则一年免费使用我们的无限制服务是免费的。
Ragi建议不要使用网络服务,但是,我们的API可以在大约5个小时内为您轻松清理,标准化和地理编码2000万个地址(每秒大约1000)。某些时间取决于您的计算机的速度(您拥有多少个内核)和您的网络连接(不要通过3G尝试,但是标准的宽带连接就可以了)。
只是想指出使用Web服务肯定是有可能的。

截至2017年8月1日,我已经对Web服务进行了远程测试,并且仅使用一台2015 MacBook Pro在服务器上进行了每秒70,000次持续查询。无线网络。是的,非常快。这意味着只有2000万个地址这样的小名单仅需5分钟即可实现。

评论


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

–拉吉·亚瑟(Ragi Yaser Burhum)
2012年3月7日20:39

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

–杰弗里
2012年3月7日20:49



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

–马特
2012年3月7日在20:51

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

–拉吉·亚瑟(Ragi Yaser Burhum)
2012年3月7日在21:02

同样,每秒1000 / req / s(在当代体系结构中非常可行)仍然需要一些出色的工程来进行地理编码。他们正在为此做我的道具:)

–拉吉·亚瑟(Ragi Yaser Burhum)
2012年3月7日在21:04

#3 楼

我使用此演练描述了如何使用2010 TigerLine数据构建Postgis Geocoder。我现在正在运行它-速度不快,因为要对3百万个地址进行地址解析需要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数据不正确?

–克里斯·穆恩奇(Chris Muench)
2012年3月9日17:53

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

–亚当·穆奇(Adam Musch)
2012年3月9日18:00

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

–亚当·穆奇(Adam Musch)
2012年9月9日18:11

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

–克里斯·穆恩奇(Chris Muench)
2012年3月9日18:36

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

–aaryno
2015年6月8日19:46

#4 楼

数据的位置非常重要,因为网络服务的质量会发生变化(精度,规模等)。
我使用Google地理数据库对Google api,facebook api和ex-simplegeo中的地址进行了地理编码。

http://blog.programmableweb.com/2012/06/21/7-free-geocoding-apis-google-bing-yahoo-and-mapquest/

#5 楼

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

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

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

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

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

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

#6 楼

您可以查看我的软件“ Easy Georeferencer”,它是独立创建,易于使用且功能强大的软件(请参阅文章底部的屏幕截图)。

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

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

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

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



评论


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

– RyanKDalton
13-10-21在4:50

@RyanDalton在写“我创建的软件”时,我确实透露过我是作者,尽管我可以看到它可能没有引起注意,因为在句子中没有特别强调它。更改了我的措词,以期使我更清楚自己在拥护自己的软件。

– Karim Bahgat
13-10-21在13:07

#7 楼

您可以使用一堆服务对2000万条记录进行地理编码,但这会花费您大量的时间。 Esri,Pitney Bowes和其他公司通过订阅或每x地理编码的费用提供这些服务。 2000万不是一件小事,但我认为这是一个商业案例。

#8 楼

当您将对美国地址进行地理编码时,我认为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限制,也可以控制它。哦,我是说免费的吗? ;-)

#9 楼

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

#10 楼

如果您的工作流程是使用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/en/1.10.0/

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

#11 楼

AWS现在有许多可用的地理编码服务器。获取您自己的服务器并将数据转储到那里。 https://aws.amazon.com/marketplace/search/results/ref=dtl_navgno_search_box?page=1&searchTerms=geocode

https://aws.amazon.com/marketplace/pp/B013CW6HOA

https://aws.amazon.com/marketplace/pp/B0112MQ63Y

#12 楼

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

使用限制:


使用Google Geocoding API受以下限制每天查询限制为2,500
地理位置请求。 (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开始

评论


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

– Andy W
2012年3月7日15:01

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

–阿拉贡
2012年3月7日15:52

这违反了服务条款。除非您在Google Map上显示结果,否则它是ilegal。即使您这样做,我也会发现“高速缓存的论点”,即有人为2000万个功能扩展了一些内容!

–拉吉·亚瑟(Ragi Yaser Burhum)
2012年3月7日16:10