75

据说,可以从谷歌地图或一些类似的服务中得到这个。(仅美国地址是不够的。)

4

15 回答 15

70

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

于 2008-10-01T16:24:29.633 回答
22

除了前面提到的谷歌地理编码网络服务,还有雅虎提供的竞争服务。在最近一个通过用户交互完成地理编码的项目中,我包含了对两者的支持。原因是我发现,尤其是在美国以外,他们对更隐蔽地点的处理差异很大。有时谷歌会有最好的答案,有时是雅虎。

需要注意的一个问题:如果 Google 真的认为他们不知道您的位置在哪里,他们将返回一个 602 错误指示失败。另一方面,如果雅虎可以从您的错误地址中剔除一个城市/省/州/等,它将返回该城镇中心的位置。所以你必须注意你得到的结果,看看它们是否真的是你想要的。一些结果中的辅助字段可以告诉您这一点:雅虎称此字段为“精确度”,而谷歌称其为“准确度”。

于 2008-10-01T16:34:19.627 回答
15

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

您查找您感兴趣的街道,它将有几个路段。每个段将有一个起始地址和结束地址,您可以沿该段进行插值以找到您的门牌号所在的段。

这将为您提供 lon/lat 对。

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

另请注意,尽管免费数据很好,但它并不完美 - 最新的街道不在其中(它们可能在 Google 使用的数据中),并且由于调查不准确,街道可能在一定程度上偏离其真实位置。但是对于 98% 的地理编码需求,它可以完美运行,是免费的,并且您可以控制一切,因此您可以减少应用程序中的依赖性。

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

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

如果您必须对大量数据进行地理编码,那么最好从主要供应商那里租用地图数据,例如 teleatlas。

-亚当

于 2008-10-01T16:31:45.903 回答
9

您还可以尝试OpenStreetMap NameFinder,它包含(可能)整个世界的开源、类似 wiki 的街道数据。NameFinder 将在 8 月底停止存在,但Nominatim是它的替代品。

于 2009-01-15T09:36:06.350 回答
7

Google 要求您使用他们的数据显示 Google 地图,每天最多 2.5k(原为 25k)HTTP 请求。有用,但您必须注意使用情况。

他们确实有

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

(谷歌已经删除了这个。如果你看到重复或缓存,我会链接到那个。)

...我在其中找到了具有可下载数据库、免费网络服务和商业网络服务的GeoNames 。

于 2009-09-29T16:49:42.337 回答
4

如果您的网站反过来供消费者免费使用,Google 的服务条款将允许您免费使用他们的地理编码 API。如果没有,您将必须获得 Enterprise Maps 的许可证。

于 2008-10-01T16:42:27.877 回答
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;
}
于 2013-03-26T19:20:03.343 回答
2

您可以在此处查看 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

于 2008-10-01T16:26:49.583 回答
2

您也可以使用 Microsoft 的 MapPoint Web 服务来做到这一点。

这是一篇解释如何的博客文章:http: //www.codestrider.com/BlogRead.aspx? b=b5e8e275-cd18-4c24-b321-0da26e01bec5

于 2009-03-04T06:51:28.860 回答
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"
于 2015-05-13T09:15:26.393 回答
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 密钥。

于 2015-07-21T17:36:55.430 回答
1

我有一批 100,000 条记录要进行地理编码并遇到了 Google API 的限制(由于它是用于内部企业应用程序,我们不得不升级到他们的高级服务,即 1 万美元以上)

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

于 2016-02-18T22:16:12.680 回答
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);
  } 
});

在此处输入图像描述

于 2016-11-21T10:45:24.223 回答
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)

希望能帮助到你。

于 2019-01-31T10:22:30.593 回答
0

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

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>
于 2019-02-21T06:03:51.930 回答