如何以编程方式(合法地)获取街道地址的经度和纬度


Answers:


70

您要查找的术语是地理编码,是的,Google确实提供了这项服务。


1
优秀的!我正在寻找“通过HTTP进行地理编码”部分。
奥拉·埃尔多(OlaEldøy)

3
只要确保您遵守使用规则即可。我认为Google仅在您在Google Map上显示位置时才允许使用此功能。不允许将其用于其他目的,但您应检查许可和使用规则。
peSHIr 2012年

v2(自2010年起弃用)仅在短短几个月内(2013年5月)就关闭了,因此建议不要再使用此版本构建任何新内容!
Funka 2013年

允许通过服务获取它,但不允许将其存储以供以后使用。在此处查看有关此问题的评论(在答案下方)stackoverflow.com/a/30595524/2403881
Nhan

22

除了上述Google地理编码Web服务外Yahoo提供了一项竞争服务。在最近的一个项目中,它是通过用户交互来进行地址编码的,其中包括对这两者的支持。原因是我发现,尤其是在美国以外,他们对较隐蔽地点的处理方式差异很大。有时Google会有最佳答案,有时是Yahoo。

要注意的一个陷阱:如果Google真的认为他们不知道您的位置在哪里,他们将返回602错误,指示失败。另一方面,如果雅虎可以从您的错误地址中删除某个城市/省/州/等,则会返回该镇中心的位置。因此,您必须注意获得的结果,看看它们是否真的是您想要的。结果中有一些辅助字段可以告诉您:Yahoo将该字段称为“精度”,而Google将该字段称为“准确性”。


1
jsfiddle,带有替换Yahoo服务的示例,诺基亚的ovimaps:jsfiddle.net/MgjGr
Chris Moschini,

15

如果要在不依赖服务的情况下执行此操作,则可以从美国人口普查下载TIGER Shapefile

您可以在感兴趣的街道上查找,该街道将分为几个部分。每个网段都有一个起始地址和结束地址,您可以沿网段进行插值,以找到您的门牌号在网段上的位置。

这将为您提供一对lon / lat。

但是请记住,在线服务使用了大量的地址检查和更正功能,您也必须复制它们才能获得良好的结果。

还要注意,尽管有免费数据,但它并不是完美的-最新的街道不在其中(它们可能在Google使用的数据中),并且由于调查的不准确,这些街道可能会偏离其真实位置。但是对于98%的地理编码需求来说,它可以完美运行,免费,而且您可以控制所有内容,从而减少了应用程序中的依赖关系。

Openstreetmaps旨在绘制世界上所有事物的地图,尽管它们并不完全是值得一看的,因为根据CC许可提供数据

但是,许多其他(大多数?)其他国家/地区仅按您需要付费的政府或服务进行了映射。如果您不需要对大量数据进行地理编码,那么使用Google,Yahoo或其他一些免费的全球地图服务可能就足够了。

如果您必须对大量数据进行地理编码,那么最好从主要提供商(例如电话簿)中租赁地图数据来为您提供最佳服务。

-亚当


这是行不通的(对于这个问题;一般来说,在美国听起来不错),因为该问题已经表明,仅适用于美国地址的解决方案是不可接受的解决方案。
peSHIr

1
没错,但最初的问题并未说明这一点-作者在原始帖子的15分钟内所做的修改不视为修改。不过,我将更新答案。
亚当·戴维斯


7

Google要求您显示包含其数据的Google地图,每天最多有2.5k(原为25k)HTTP请求。有用,但您必须注意用法。

他们确实有

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

(此后Google删除了它。如果您看到重复项或缓存,我将链接至该链接。)

...在其中,我发现GeoNames同时具有可下载的数据库,免费的Web服务和商业Web服务。


1
不幸的是,groups.google.com链接似乎不再存在...感谢您提供的地名链接,但是看起来很有希望!
Funka

1
更正/澄清点:Google“ v3” API每天(每个IP地址!)允许2500个请求,而不是25k。请参阅developers.google.com/maps/documentation/geocoding/#Limits
Funka,2013年

4

如果您的网站免费供消费者使用,则Google的服务条款将允许您免费使用其地理编码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

如果要在Python中执行此操作:

import json, urllib, urllib2

address = "Your address, New York, NY"

encodedAddress = urllib.quote_plus(address)
data = urllib2.urlopen("http://maps.googleapis.com/maps/api/geocode/json?address=" + encodedAddress + '&sensor=false').read()
location = json.loads(data)['results'][0]['geometry']['location']
lat = location['lat']
lng = location['lng']
print lat, lng

请注意,如果Google看到的邮件数量超过一定数量,似乎确实会限制请求,因此您确实想在HTTP请求中使用API​​密钥。


1

我有100,000条记录要进行地理编码,并遇到了Google API的限制(并且由于它是针对内部企业应用程序的,因此我们必须升级到其高级服务,这需要1万美元以上)

因此,我改用了以下代码:http : //geoservices.tamu.edu/Services/Geocode/BatchProcess/-它们也有一个API。(总费用约为200美元)


1

您可以在JavaScript中尝试像kohat这样的城市

var geocoder = new google.maps.Geocoder();
var address = "kohat";
geocoder.geocode( { 'address': address}, function(results, status) {
var latitude = results[0].geometry.location.lat();
var longitude = results[0].geometry.location.lng();
alert(latitude+" and "+longitude);
  } 
});

在此处输入图片说明


1

在python中使用geopy PyPI 来获取纬度,经度,邮政编码等。这是工作示例代码。

from geopy.geocoders import Nominatim

geolocator = Nominatim(user_agent="your-app-id")

location = geolocator.geocode("Your required address ")

if location:
    print('\n Nominatim ADDRESS :',location.address)
    print('\n Nominatim LATLANG :',(location.latitude, location.longitude))
    print('\n Nominatim FULL RESPONSE :',location.raw)
else:
   print('Cannot Find')

Nominatim中-有些地址无法工作,所以我只是尝试了 MapQuest
它正确返回。Mapquest每月提供免费计划15000笔交易。对我来说足够了。

样例代码:

import geocoder
g = geocoder.mapquest("Your required address ",key='your-api-key')

for result in g:
   # print(result.address, result.latlng)
   print('\n mapquest ADDRESS :',result.address,result.city,result.state,result.country)
   print('\n mapquest LATLANG :', result.latlng)
   print('\n mapquest FULL RESPONSE :',result.raw)

希望能帮助到你。


0

我知道这是一个古老的问题,但是Google更改了基于常规获取经纬度的方法。

HTML代码

<form>
    <input type="text" name="address" id="address" style="width:100%;">
    <input type="button" onclick="return getLatLong()" value="Get Lat Long" />
</form>
<div id="latlong">
    <p>Latitude: <input size="20" type="text" id="latbox" name="lat" ></p>
    <p>Longitude: <input size="20" type="text" id="lngbox" name="lng" ></p>
</div>

JavaScript代码

<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap" async defer></script>

    <script>
    function getLatLong()
    {
        var address = document.getElementById("address").value;
        var geocoder = new google.maps.Geocoder();
        geocoder.geocode( { 'address': address}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var latitude = results[0].geometry.location.lat();
                document.getElementById("latbox").value=latitude;
                var longitude = results[0].geometry.location.lng();
                document.getElementById("lngbox").value=longitude;
            } 
        });
    }
    </script>
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.