如何以程式(及合法)取得街道地址的经纬度

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

96050 次浏览

你正在寻找的术语是地理编码,是的,谷歌确实提供了这项服务。

你可以看看 Google Maps 的 API 文档,从这里开始:

Http://code.google.com/apis/maps/documentation/services.html#geocoding

这似乎也是你可以使用 Live Maps 为国际地址做的事情:

Http://virtualearth.spaces.live.com/blog/cns!2bbc66e99fdcdb98!1588.entry

如果你想在不依赖服务的情况下做到这一点,那么你可以从美国人口普查局下载 TIGER Shapefiles

你看看你感兴趣的街道,它将有几个部分。每个段都有一个开始地址和结束地址,然后沿着这个段进行插值,找到你的门牌号在这个段上的位置。

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

然而,请记住,在线服务使用了大量的地址检查和更正,您必须重复这些工作才能获得良好的结果。

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

Openstreetmap 的目标是映射世界上的所有东西,尽管它们还不完全存在,但值得密切关注,因为它们是在 CC 许可下提供数据的

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

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

亚当

除了上述的 谷歌地理编码网络服务,还有一个竞争的 雅虎提供的服务。在最近的一个使用用户交互完成地理编码的项目中,我包含了对两者的支持。原因是我发现,尤其是在美国以外的地区,他们对于更加偏僻地区的处理方式差别很大。有时候谷歌会给出最好的答案,有时候雅虎会给出最好的答案。

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

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

您还可以尝试使用 OpenStreetMap NameFinder,它包含(潜在地)整个世界的开源、类似 wiki 的街道数据。NameFinder 将在8月底停止使用,但是 提名将取代它。

您也可以使用微软的 MapPointWeb 服务来完成这项工作。

这里有一篇博客文章解释了如何: Http://www.codestrider.com/blogread.aspx?b=b5e8e275-cd18-4c24-b321-0da26e01bec5

Google 要求你显示一个带有数据的 Google 地图,每天最多2.5 k (原来是25k) HTTP 请求。很有用,但你得注意用法。

确实有

Http://groups.google.com/group/google-maps-api/web/resources-non-google-geocoders

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

我找到了 地名它有一个可下载的数据库,免费的网络服务和一个商业的网络服务。

适合与 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;
}

获取街道地址经纬度的代码

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

如果你想在 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 密钥。

我有一批100,000条记录是地理编码,遇到了谷歌 API 的限制(因为它是一个内部企业应用程序,我们不得不升级到他们的溢价服务,这是10000美元以上)

所以,我用这个代替: http://geoservices.tamu.edu/Services/Geocode/BatchProcess/——他们也有一个 API。(总成本约为200美元)

你可以在像 Kohat这样的城市的 JavaScript 中尝试

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);
}
});

enter image description here

在 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')

提名-一些地址不能工作,所以我只是尝试 < strong > 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)

希望能有帮助。

我知道这是一个老问题,但谷歌改变了获得定期经纬度的方式。

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>