有没有批量地理编码的方法(通过地址获取纬度/经度和反之)?

7
Google Geocoding API 有严重的限制(每天只能请求2,500次),我们总是得到一个限制错误。他们的商业许可证需要10,000美元,对我们来说太昂贵了。
服务应该适用于不同的语言和不同的国家。
服务应该验证地址并返回纬度/经度。地址可以是具有不同格式的字符串。
我们愿意为这样的服务付费,RESTful API 更可取。

另一个服务 http://batchgeo.com/ - Oleg Dats
你能给我澄清一下吗?你是在寻找美国地址吗?你是想要验证地址是否存在并将其进行地理编码吗?还是说你只是想知道地址如果存在的话会在哪里(即地址近似值)? - Jeffrey
@Jeffrey,我稍微更新了一下。你还对什么感兴趣? - Oleg Dats
5个回答

5
我曾在SmartyStreets工作,你所描述的正是他们的核心领域。
您可能会对LiveAddress感兴趣,它可以将地址转换为纬度/经度,并且每秒可以处理数千个请求。它在3个数据中心进行地理分布,并具有RESTful终点。您可以每个请求最多处理100个地址。如果您有Excel或CSV文件等内容,还有一个列表处理版本。
最高价格标签为$10k,但它可以为您提供一年无限次查询。
一些示例代码位于https://github.com/smartystreets/LiveAddressSamples
他们的许可协议没有限制您的使用。Dbaseman是正确的:您遇到限制错误是因为违反了服务条款(除非您从他们那里获得商业许可,但即使如此,地址也是“最佳猜测”--不像CASS认证服务那样标准化和验证。这是需要记住的事情)。

1
目前我们仅支持美国地址(无论使用何种语言)。 要处理请求,请求必须包含“街道地址”和“城市/州/邮编”(这三个元素的任意组合)。 如果您无法将它们分开,则有一种方法可以在没有分开不同部分的情况下处理地址。该算法在此处描述。 请记住,虽然Google更加灵活,但其目的非常不同:近似地址,而不是验证地址。 - Matt
1
更新:这有点晚了,但是您不再需要手动分离单行地址的部分。LiveAddress会为您完成。 - Matt
SmartyStreets支持反向地理编码吗(即经度、纬度-->街道地址)? - stackoverflowuser2010
截至目前,我们只是从地址进行正向地理编码。 - Matt
@Matt:你知道有没有任何解决方案/公司可以以相同的价格进行批量反向地理编码吗? - stackoverflowuser2010
显示剩余3条评论

5

你有没有考虑过使用Nominatim?你可以利用OpenStreetMaps的数据自己创建,或者向OpenStreetMapsMapQuest发送请求。可能的缺点包括CC许可证(需要归属,对你来说可能是一个问题,也可能不是),以及验证问题(数据几乎完全由众包提供,因此可能存在不准确性)。好处包括更少限制性的使用政策、频繁更新、全球覆盖范围,当然,价格也无法超越。

请参见https://jsfiddle.net/4hzzrws5/

var Data =[
{address: "17 rue de l'Abreuvoir. Nantilly. 28260 La Chaussée d'Ivry"},
{address: "52 rue Ernestine 95100 Argenteuil"},
{address: "3 allée Baudelaire 59139 Wattignies"},
{address: "165, Petit chemin d'aix   13320  Bouc Bel Air"},
{address: "54 avenue Yolande d'Aragon 49100 ANGERS"},
{address: "John Doe, Le Rouho Guidel 56520"},
{address: "51100"},
{address: "21 rue du Docteur Gallet - 74000 Annecy"},
{address: "4 Impasse des Cigales, 26500 Bourg lès Valence"},
{address: "83140 SIX FOURS LES PLAGES"},
{address: "35 cours Vitton 69006 Lyon"},
{address: "7 rue lallier 75009"},
{address: "Paul Michel, Villa Pétricciù,Ghjassu Pétricciù, 20221.CERVIONE"}
]

var cityAndCountry = function(res){
  var osmObj= res[0].address,
      city=osmObj.town || osmObj.city || osmObj.county || '',
      country=osmObj.country || '',
      iso2 =osmObj.country_code || '';
  var out = [ city, country, iso2];
  return out
}
var latAndLon = function(res){
  var lat= res[0].lat,
    lon= res[0].lon;
  var out = [lat,lon];
  return out
}

var queryOsm = function(url) {
  $.getJSON(url, function (data) { 
    data.length==0? 
      console.log(["","",""],data)
     :console.log(cityAndCountry(data),latAndLon(data),data);
  });
}

var delayedPing = function (i,data) {
  // console.log(i, data.length)
  var d = data[data.length-i];
  if(d.address){ 
   // placeAddressOnMap(gc, d.address, d.service||"", d.customer||"")
    var url = 'https://nominatim.openstreetmap.org/search/'+d.address+'?format=json&addressdetails=1&limit=1';
    queryOsm(url)
  } else { console.log(["","","",d.address]) }
  var delay = 1000+200*Math.random();
  if (--i > 0) { setTimeout(function () { delayedPing(i,data); }, delay); }
}

delayedPing(Data.length,Data);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


1

没有这样的,如果你查看他们的许可证,它明确设计为防止您像那样使用他们的服务。基本上,只有当

  1. 最终用户启动每个对API的请求,并且
  2. 您的服务是免费的。

他们还禁止您将其服务的结果保存/缓存到数据库中。谷歌使使用他们的工具进行原型设计变得容易,但一旦您开始扩展规模,您将会付出代价(在这方面与M $并没有太大不同)。


0
以下选项可能适合您:
  1. GeoNames
  2. Gisgraphy
  3. GeoCoder

我直接与谷歌就谷歌地图许可问题进行了沟通。不幸的是,他们没有意识到由于成本问题导致了巨大的市场份额流失。


0

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