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

据推测,可以从Google地图或某些此类服务获取此信息。 (美国地址只是不够好。)

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

  • 新的V3 API : http : //code.google.com/apis/maps/documentation/geocoding/

  • 旧版V2 API: http : //code.google.com/apis/maps/documentation/services.html#Geocoding

除了上述Google地理编码networking服务外 , 雅虎还提供了一项竞争性服务 。 在最近用户交互进行地理编码的项目中,我包含了对两者的支持。 原因是我发现,特别是在美国以外,他们处理比较模糊的地点差别很大。 有时候Google会有最好的答案,有时候是雅虎。

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

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

你看看你感兴趣的街道,这将有几个部分。 每个段将有一个起始地址和结束地址,并沿着这个段进行插值,以找出你的房屋号码在哪一段。

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

但请记住,在线服务需要大量的地址检查和更正,您必须重复以获得良好的结果。

另外要注意的是,免费数据虽然不错,但最新的街道并不在这里(可能在谷歌使用的数据中),由于调查不准确,街道可能会偏离真实位置。 但98%的地理编码需要它完美的工作,是免费的,你控制一切,所以你减less在你的应用程序的依赖。

Openstreetmaps的目标是映射世界上的所有东西,尽pipe它们不是很值得一看,因为它们在CC许可下提供数据

但是,许多(大多数?)其他国家/地区只能由您需要支付费用的政府部门或服务部门绘制。 如果您不需要对非常多的数据进行地理编码,那么使用Google,Yahoo或其他免费的全球地图服务就足够了。

如果您需要对很多数据进行地理编码,那么最好的办法是租用一个主要提供商(如teleatlas)的地图数据。

-亚当

您也可以尝试OpenStreetMap NameFinder ,其中包含开放源代码,可能是整个世界的类似wiki的街道数据。 NameFinder将在八月底停止存在,但是Nominatim是它的替代品。

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

他们确实有

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

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

…我发现GeoNames既有可下载的数据库,免费的Web服务和商业Web服务。

Google的服务条款将允许您免费使用地理编码API,前提是您的网站可以免费供消费者使用。 如果没有,您将不得不获得企业地图的许可证。

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

这也似乎是你可以使用实时地图的国际地址:

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​​密钥。

我有一批10万条logging需要进行地理编码,并且遇到了Google API的限制(因为这是一个内部企业应用程序,我们不得不升级到他们的额外服务,

所以,我用这个: 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); } }); 

在这里输入图像说明