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

Web services 如何通过编程(合法)获取街道地址的经度和纬度,web-services,api,geolocation,geocoding,street-address,Web Services,Api,Geolocation,Geocoding,Street Address,据推测,可以从谷歌地图或类似的服务中获得这一信息。(仅美国地址还不够好。)你要找的术语是地理编码,是的,谷歌提供了这项服务 新的V3 API: 旧的V2 API: 您可以在此处查看Google Maps API文档,了解以下内容: 您似乎还可以使用实时地图为国际地址执行以下操作: 如果您想在不依赖服务的情况下完成此操作,请从美国人口普查局下载 你可以在你感兴趣的街道上查找,这条街有几个部分。每个段都有一个起始地址和结束地址,您可以沿着段进行插值,以找到您的门牌号所在的段 这将为您提供lon/

据推测,可以从谷歌地图或类似的服务中获得这一信息。(仅美国地址还不够好。)

你要找的术语是地理编码,是的,谷歌提供了这项服务

  • 新的V3 API

  • 旧的V2 API:


您可以在此处查看Google Maps API文档,了解以下内容:

您似乎还可以使用实时地图为国际地址执行以下操作:


如果您想在不依赖服务的情况下完成此操作,请从美国人口普查局下载

你可以在你感兴趣的街道上查找,这条街有几个部分。每个段都有一个起始地址和结束地址,您可以沿着段进行插值,以找到您的门牌号所在的段

这将为您提供lon/lat对

然而,请记住,在线服务使用大量的地址检查和更正,为了获得好的结果,您还必须复制这些内容

还要注意的是,尽管免费数据很好,但它并不完美——最新的街道并不在那里(它们可能在谷歌使用的数据中),而且由于调查不准确,街道可能会偏离其真实位置。但对于98%的地理编码需求,它工作完美,是免费的,你可以控制一切,这样你就减少了应用程序中的依赖性

Openstreetmaps的目标是映射世界上的所有事物,尽管它们并不完全存在,但值得密切关注,因为它们根据CC许可证提供数据

然而,许多(大多数?)其他国家仅由政府或服务绘制地图,您需要为此支付费用。如果您不需要对大量数据进行地理编码,那么使用谷歌、雅虎或其他一些免费的全球地图服务就足够了

如果您必须对大量数据进行地理编码,那么最好从主要提供商(如teleatlas)租赁地图数据


-亚当

除了上述,还有一个竞争对手。在最近的一个项目中,地理编码是通过用户交互完成的,我包括了对两者的支持。原因是我发现,特别是在美国以外的地区,他们对更隐蔽地点的处理方式差异很大。有时谷歌会有最好的答案,有时雅虎会


需要注意的一点是:如果谷歌真的认为他们不知道你的位置在哪里,他们会返回一个602错误,表示失败。另一方面,如果雅虎能从你的坏地址中剥离出一个城市/省/州/等,它将返回该城镇中心的位置。所以你必须关注你得到的结果,看看它们是否真的是你想要的。在一些结果中有一些辅助字段可以告诉你这一点:雅虎称这个字段为“精度”,谷歌称之为“精度”。

如果你的网站免费供消费者使用,谷歌的服务条款将允许你免费使用他们的地理编码API。如果没有,您必须获得企业地图的许可证。

您也可以尝试,其中包含(可能)整个世界的开源、类似wiki的街道数据。NameFinder将于8月底停止存在,但将取代它。

您也可以使用Microsoft的MapPoint Web服务来实现这一点

以下是一篇解释如何:

谷歌要求你显示一张谷歌地图和他们的数据,每天最多有2.5k(WAS25k)HTTP请求。有用,但你必须注意使用

他们确实有

(谷歌已经删除了这个。如果你看到一个副本或缓存,我会链接到它。)


…在其中,我发现它既有可下载的db、免费web服务,也有商业web服务。

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


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"
#使用谷歌API获取街道地址纬度和经度的代码

addr如果要在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

请注意,如果看到的数量超过一定数量,谷歌似乎会限制请求,因此您确实希望在HTTP请求中使用API密钥。

我有一批100000条记录要作为地理代码,并且遇到了谷歌API的限制(因为这是一个内部企业应用程序,我们必须升级到他们的高级服务,即1万美元以上)


所以,我用了这个:——它们也有一个API。(总成本约为200美元)

您可以在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);
  } 
});

在python中使用,用于获取晶格、语言、zipcode等。。 下面是工作示例代码

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')
提名中-有些地址无法工作,所以我尝试了。
它返回正确。 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)

希望有帮助。

我知道这是一个老问题,但谷歌正在改变获取经纬度的方法

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>
<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>

纬度:

经度:

JavaScript代码

<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>
<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>

函数getLatLong()
{
var address=document.getElementById(“地址”).value;
var geocoder=new google.maps.geocoder();
geocoder.geocode({'address':address},函数(结果,状态){
if(status==google.maps.GeocoderStatus.OK){
var latitude=results[0]。geometry.location.lat();
document.getElementById(“latbox”)。值=纬度;
var longitude=results[0]。geometry.location.lng();
document.getElementById(“lngbox”)。值=经度;
} 
});
}

太棒了!“通过HTTP进行地理编码”一节似乎就是我要找的。只要确保您遵守使用规则即可。我不能