如何通过编程(并合法地)获取街道地址的经纬度

75

据说可以从Google Maps或类似服务中获取此信息。(仅限美国地址并不足够。)

15个回答

70

1
太好了!“通过HTTP进行地理编码”的部分似乎是我正在寻找的。 - Ola Eldøy
3
请确保你遵守使用规则。我认为Google只允许在Google地图上展示位置时使用此功能。不允许将其用于其他用途,但您应该检查许可证和使用规则。 - peSHIr
v2(自2010年起不推荐使用)将在几个月内(2013年5月)彻底关闭,因此建议不再使用它来构建任何新的东西! - Funka
可以通过服务获取它,但不允许将其存储以备后用。在此处查看有关此事的评论(在答案下方)http://stackoverflow.com/a/30595524/2403881 - Nhan

22
除了前面提到的Google地理编码Web服务,还有一个由Yahoo提供的竞争服务。在最近一个需要用户交互进行地理编码的项目中,我为两者都提供了支持。原因是我发现特别是在美国以外的地方,它们对于更加偏僻的位置的处理差异很大。有时候谷歌会有最好的答案,有时候又是Yahoo。
需要注意的一点是:如果Google真的认为他们不知道您所在的地方,在返回一个602错误表示失败。而雅虎则会尝试从您的错误地址中提取出城市/省份/州等信息,并返回该城镇中心的位置。因此,您必须注意您获得的结果是否真正符合您的要求。有些结果会附带一些辅助字段来告诉您这一点:雅虎称这个字段为“精度”,而谷歌称其为“准确性”。

1
这是一个 jsfiddle 示例,展示了取代雅虎服务的诺基亚Ovimaps的替代方案:http://jsfiddle.net/MgjGr/ - Chris Moschini

15

如果你不想依赖在线服务,那么可以从美国人口普查局下载TIGER Shapefiles

查找感兴趣的街道,该街道将有几个段落。每个段落都有起始地址和结束地址,您需要对该段进行插值,以找到您的房屋号码所在的位置。

这将为您提供经纬度坐标对。

请注意,在线服务会使用大量地址检查和校正,为了获得良好的结果,您也必须复制这些步骤。

另请注意,尽管免费数据很好,但并不完美-最新的街道可能不在其中(它们可能在Google的数据中),而且由于测量误差,这些街道可能偏离其实际位置。 但对于98%的地理编码需求,它运作完美,是免费的,并且您控制一切,因此可以减少应用程序中的依赖性。

Openstreetmaps的目标是绘制全世界的地图,尽管他们还没有实现目标,但值得关注,因为他们在CC许可下提供数据。

然而,许多(大多数?)其他国家仅由政府或需要支付费用的服务进行映射。 如果您不需要对很多数据进行地理编码,则使用Google、Yahoo或其他免费的全球地图服务可能已经足够了。

如果您需要地理编码大量数据,则最好从主要提供商(例如Teleatlas)租用地图数据。

-亚当


这个方法不可行(对于这个问题而言;一般来说,它在美国听起来很好),因为问题已经说明仅适用于美国地址的解决方案将不被接受。 - peSHIr
1
没错,不过最初该问题并没有说明这一点 - 作者在原始帖子发布后15分钟内所做的编辑不算作编辑。不过,我会更新回答。 - Adam Davis

9

你也可以尝试使用OpenStreetMap NameFinder,它包含了类似维基百科的开源街道数据,覆盖(可能)全球。NameFinder将在八月底停止服务,但Nominatim是它的替代品。


7
Google要求您显示带有其数据的Google地图,每天最多2.5k(曾经是25k)个HTTP请求。这很有用,但您必须注意使用情况。
他们确实有。

http://groups.google.com/group/Google-Maps-API/web/resources-non-google-geocoders

(Google已将其删除。如果您看到重复或缓存,我将链接到该网站。)

...其中我发现GeoNames,它既有可下载的数据库,也有免费的网络服务和商业网络服务。


1
很不幸,似乎groups.google.com的链接已经不存在了... 不过,感谢您提供的geonames链接,看起来很有前途! - Funka
1
更正/澄清:Google“v3”API每天允许2500个请求(每个IP地址!),而不是25k。请参见https://developers.google.com/maps/documentation/geocoding/#Limits - Funka

4

如果你的网站是免费供消费者使用的,那么谷歌的服务条款将允许你免费使用他们的地理编码 API。否则,你将需要获取企业地图许可证。


3

可用于 Drupal 和 PHP(且易于修改):

function get_lat_long($address) {
  $res = drupal_http_request('http://maps.googleapis.com/maps/api/geocode/json?address=' . $address .'&sensor=false');
  return json_decode($res->data)->results[0]->geometry->location;
}

太好了!感谢上帝读完所有的答案,这样我才能找到你的答案。请问在普通的 PHP 中使用此 URL 是否有任何限制,比如每天请求的次数?@Nate - Rajesh

2

使用R代码获取街道地址的纬度和经度

# CODE TO GET THE LATITUDE AND LONGITUDE OF A STREET ADDRESS WITH GOOGLE API
addr <- '6th Main Rd, New Thippasandra, Bengaluru, Karnataka'  # set your address here
url = paste('http://maps.google.com/maps/api/geocode/xml?address=', addr,'&sensor=false',sep='')  # construct the URL
doc = xmlTreeParse(url) 
root = xmlRoot(doc) 
lat = xmlValue(root[['result']][['geometry']][['location']][['lat']]) 
long = xmlValue(root[['result']][['geometry']][['location']][['lng']]) 
lat
[1] "12.9725020"
long
[1] "77.6510688"

2

2

以上链接似乎已经失效。 - Gurupad Hegde

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