我的大型数据库中有邮政编码,其中包含 SL5 9JH,LU1 3TQ 等值。
现在,当我将上述邮政编码粘贴到maps.google.com时,它指向一个完美的位置..
我的要求是,我想将邮政编码传递给maps.google.com,它应该返回该指向位置的相关纬度和经度,我想存储在我的数据库中。
所以,很可能应该有一些javascript ...如果有人对此有另一个想法请提供..
提前致谢...
答案 0 :(得分:13)
发现这个SO答案的人的快速说明。 Daniel Vassallo的回答使用了Google Geocoding API V2,现已弃用。新的v3 API使用如下的请求格式:
http://maps.googleapis.com/maps/api/geocode/output?parameters
邮政编码查找示例,以JSON格式返回数据:
http://maps.googleapis.com/maps/api/geocode/json?address=SL59JH,+UK&sensor=false
这将返回一个JSON数组,其中包括lat和long in results-> geometry-> location-> lat和results-> geometry-> location-> lng
回复示例:
{
"results" : [
{
"address_components" : [
{
"long_name" : "SL5 9JH",
"short_name" : "SL5 9JH",
"types" : [ "postal_code" ]
},
{
"long_name" : "Windsor and Maidenhead",
"short_name" : "Windsor and Maidenhead",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"long_name" : "United Kingdom",
"short_name" : "GB",
"types" : [ "country", "political" ]
},
{
"long_name" : "Ascot",
"short_name" : "Ascot",
"types" : [ "postal_town" ]
}
],
"formatted_address" : "Ascot, Windsor and Maidenhead SL5 9JH, UK",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 51.39655490000001,
"lng" : -0.66024660
},
"southwest" : {
"lat" : 51.39457330,
"lng" : -0.6624574999999999
}
},
"location" : {
"lat" : 51.39539040,
"lng" : -0.66096740
},
"location_type" : "APPROXIMATE",
"viewport" : {
"northeast" : {
"lat" : 51.39691308029150,
"lng" : -0.6600030697084980
},
"southwest" : {
"lat" : 51.39421511970851,
"lng" : -0.6627010302915021
}
}
},
"types" : [ "postal_code" ]
}
],
"status" : "OK"
}
此处提供了API规范:https://developers.google.com/maps/documentation/geocoding/
答案 1 :(得分:11)
您描述的流程的技术术语称为reverse geocoding。 Google提供 The Google Geocoding Web Service New working Google Geocoding Link,您可以在服务器端执行反向地理编码,而不是在客户端使用JavaScript。
例如,如果您在浏览器中尝试以下网址,则会以CSV格式返回q
参数中传递的邮政编码的纬度和经度:
http://maps.google.com/maps/geo?q=SL59JH,+UK&output=csv&sensor=false
http://maps.google.com/maps/geo?q=LU13TQ,+UK&output=csv&sensor=false
这就是你可以在php中反转地理编码你的邮政编码的方式,例如:
$url = 'http://maps.google.com/maps/geo?q=SL59JH,+UK&output=csv&sensor=false';
$data = @file_get_contents($url);
$result = explode(",", $data);
echo $result[0]; // status code
echo $result[1]; // accuracy
echo $result[2]; // latitude
echo $result[3]; // longitude
请注意,作为Pekka suggested in another answer,Google Maps API Terms of Use似乎prohibit the storage of the results,除非商店充当Google地图中使用的数据的缓存。您可能希望与Google取得联系并咨询Google Maps API Premier,以便为您的地理编码要求提供更灵活的使用条款。
答案 2 :(得分:9)
军械测量有released the postcode locations的知识共享许可证(CC-BY v3,IIRC)。
。使用它会减少麻烦(并且在法律上更清晰)。甚至还有一个由mySociety镜像的WGS84(a.k.a.GPS)坐标的版本
答案 3 :(得分:2)
Google Geocoding API会这样做,但如果我没记错的话,他们的服务条款禁止本地存储地理编码结果。
答案 4 :(得分:1)
我知道这是一个老问题,但只是在这里切入我如何设法实现同样的事情(在PHP中,但应该相当简单):
我有一个包含数千个不同格式的邮政编码的数据库。我使用此功能和批量更新均匀地清理了每一个,然后完成了每个操作:
function clean_postcode($postcode)
{
$out = preg_replace("/[^a-zA-Z0-9]/", '',strtoupper($postcode));
if(strlen($out)>3)
{
$out = substr($out, 0, (strlen($out) -3)).' '.substr($out, -3);
}
return $out;
}
既然所有邮政编码都是统一格式化的,我下载并导入了军械测量局的代码点数据集(免费) - https://www.ordnancesurvey.co.uk/opendatadownload/products.html
我在单独的codepoint
表格中将所有CSV导入我的数据库。我从每个CSV导入了邮政编码,以及Eastings和Northings值。
我在我的数据库中的所有Ordnance Survey数据上再次批量运行clean_postcode()
功能。大约50%的邮政编码有空格,50%没有 - 在此之后统一设置。
我在codepoint
表中的每个邮政编码上运行了以下PHP脚本,并保存了返回到此表中的纬度和经度值:http://bramp.net/blog/os-easting-northing-to-lat-long
全部完成!您现在可以根据格式良好的邮政编码匹配并拉出Lat / Lon值。
进一步阅读:http://www.deepbluesky.com/blog/-/converting-os-coodinates-into-longitude-latitude_7/
答案 5 :(得分:-1)
查看ALgolia地点will hide。超快,开源和MIT