据说,可以从谷歌地图或一些类似的服务中得到这个。(仅美国地址是不够的。)
15 回答
您正在寻找的术语是地理编码,是的,谷歌确实提供了这项服务。
除了前面提到的谷歌地理编码网络服务,还有雅虎提供的竞争服务。在最近一个通过用户交互完成地理编码的项目中,我包含了对两者的支持。原因是我发现,尤其是在美国以外,他们对更隐蔽地点的处理差异很大。有时谷歌会有最好的答案,有时是雅虎。
需要注意的一个问题:如果 Google 真的认为他们不知道您的位置在哪里,他们将返回一个 602 错误指示失败。另一方面,如果雅虎可以从您的错误地址中剔除一个城市/省/州/等,它将返回该城镇中心的位置。所以你必须注意你得到的结果,看看它们是否真的是你想要的。一些结果中的辅助字段可以告诉您这一点:雅虎称此字段为“精确度”,而谷歌称其为“准确度”。
如果您想在不依赖服务的情况下执行此操作,则可以从美国人口普查局下载TIGER Shapefile 。
您查找您感兴趣的街道,它将有几个路段。每个段将有一个起始地址和结束地址,您可以沿该段进行插值以找到您的门牌号所在的段。
这将为您提供 lon/lat 对。
但是请记住,在线服务使用了大量的地址检查和更正,您也必须复制这些内容才能获得良好的结果。
另请注意,尽管免费数据很好,但它并不完美 - 最新的街道不在其中(它们可能在 Google 使用的数据中),并且由于调查不准确,街道可能在一定程度上偏离其真实位置。但是对于 98% 的地理编码需求,它可以完美运行,是免费的,并且您可以控制一切,因此您可以减少应用程序中的依赖性。
Openstreetmaps 的目标是映射世界上的所有事物,尽管它们并不完全存在,但值得密切关注,因为它们根据 CC 许可提供数据
但是,许多(大多数?)其他国家仅由您需要付费的政府或服务绘制。如果您不需要对大量数据进行地理编码,那么使用 Google、Yahoo 或其他一些免费的全球地图服务可能就足够了。
如果您必须对大量数据进行地理编码,那么最好从主要供应商那里租用地图数据,例如 teleatlas。
-亚当
您还可以尝试OpenStreetMap NameFinder,它包含(可能)整个世界的开源、类似 wiki 的街道数据。NameFinder 将在 8 月底停止存在,但Nominatim是它的替代品。
Google 要求您使用他们的数据显示 Google 地图,每天最多 2.5k(原为 25k)HTTP 请求。有用,但您必须注意使用情况。
他们确实有
http://groups.google.com/group/Google-Maps-API/web/resources-non-google-geocoders
(谷歌已经删除了这个。如果你看到重复或缓存,我会链接到那个。)
...我在其中找到了具有可下载数据库、免费网络服务和商业网络服务的GeoNames 。
如果您的网站反过来供消费者免费使用,Google 的服务条款将允许您免费使用他们的地理编码 API。如果没有,您将必须获得 Enterprise Maps 的许可证。
用于 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;
}
您可以在此处查看 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
您也可以使用 Microsoft 的 MapPoint Web 服务来做到这一点。
这是一篇解释如何的博客文章:http: //www.codestrider.com/BlogRead.aspx? b=b5e8e275-cd18-4c24-b321-0da26e01bec5
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"
如果您想在 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 条记录要进行地理编码并遇到了 Google API 的限制(由于它是用于内部企业应用程序,我们不得不升级到他们的高级服务,即 1 万美元以上)
所以,我改用这个:http ://geoservices.tamu.edu/Services/Geocode/BatchProcess/——他们也有一个 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 中使用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)
希望能帮助到你。
我知道这是一个老问题,但谷歌改变了定期获取纬度和经度的方式。
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>