我的网站上有一个表单,用户输入地址。当他们提交表单时,我将此位置转换为纬度/经度并将其存储在MySQL数据库中。我正在使用Google的Geocode服务进行此转换。问题是我无法找到将纬度/经度转换回地址的类或服务,据我所知,谷歌的地理编码服务是单向转换。我意识到我可以将物理地址存储在数据库中,但随着时间的推移,当它可以以更简单的格式存储时,这是浪费的空间。有没有人知道从纬度/经度转换为地址的类/服务,或者我是否错了,我可以使用谷歌的地理编码系统?过去几天我找了答案但找不到任何东西。谢谢你的帮助!
答案 0 :(得分:6)
<?php
/*
* Given longitude and latitude in North America, return the address using The Google Geocoding API V3
*
*/
function Get_Address_From_Google_Maps($lat, $lon) {
$url = "http://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$lon&sensor=false";
// Make the HTTP request
$data = @file_get_contents($url);
// Parse the json response
$jsondata = json_decode($data,true);
// If the json data is invalid, return empty array
if (!check_status($jsondata)) return array();
$address = array(
'country' => google_getCountry($jsondata),
'province' => google_getProvince($jsondata),
'city' => google_getCity($jsondata),
'street' => google_getStreet($jsondata),
'postal_code' => google_getPostalCode($jsondata),
'country_code' => google_getCountryCode($jsondata),
'formatted_address' => google_getAddress($jsondata),
);
return $address;
}
/*
* Check if the json data from Google Geo is valid
*/
function check_status($jsondata) {
if ($jsondata["status"] == "OK") return true;
return false;
}
/*
* Given Google Geocode json, return the value in the specified element of the array
*/
function google_getCountry($jsondata) {
return Find_Long_Name_Given_Type("country", $jsondata["results"][0]["address_components"]);
}
function google_getProvince($jsondata) {
return Find_Long_Name_Given_Type("administrative_area_level_1", $jsondata["results"][0]["address_components"], true);
}
function google_getCity($jsondata) {
return Find_Long_Name_Given_Type("locality", $jsondata["results"][0]["address_components"]);
}
function google_getStreet($jsondata) {
return Find_Long_Name_Given_Type("street_number", $jsondata["results"][0]["address_components"]) . ' ' . Find_Long_Name_Given_Type("route", $jsondata["results"][0]["address_components"]);
}
function google_getPostalCode($jsondata) {
return Find_Long_Name_Given_Type("postal_code", $jsondata["results"][0]["address_components"]);
}
function google_getCountryCode($jsondata) {
return Find_Long_Name_Given_Type("country", $jsondata["results"][0]["address_components"], true);
}
function google_getAddress($jsondata) {
return $jsondata["results"][0]["formatted_address"];
}
/*
* Searching in Google Geo json, return the long name given the type.
* (If short_name is true, return short name)
*/
function Find_Long_Name_Given_Type($type, $array, $short_name = false) {
foreach( $array as $value) {
if (in_array($type, $value["types"])) {
if ($short_name)
return $value["short_name"];
return $value["long_name"];
}
}
}
/*
* Print an array
*/
function d($a) {
echo "<pre>";
print_r($a);
echo "</pre>";
}
请随时查看my blog,了解如何使用上述代码和示例结果的示例代码。
答案 1 :(得分:6)
将地理坐标转换为地址称为反向地理编码。在此脚本中,我们使用Google地图API,因为它是免费的,快速的,无需API密钥。
Google尊重限制地理编码每天每个IP有2500个API调用。
用于Reveres地理编码的PHP函数
<?
function getaddress($lat,$lng)
{
$url = 'http://maps.googleapis.com/maps/api/geocode/json?latlng='.trim($lat).','.trim($lng).'&sensor=false';
$json = @file_get_contents($url);
$data=json_decode($json);
$status = $data->status;
if($status=="OK")
{
return $data->results[0]->formatted_address;
}
else
{
return false;
}
}
?>
在getaddress()函数中传递纬度和经度。它会在成功时返回地址字符串,否则返回布尔值假。
示例强>
<?php
$lat= 26.754347; //latitude
$lng= 81.001640; //longitude
$address= getaddress($lat,$lng);
if($address)
{
echo $address;
}
else
{
echo "Not found";
}
?>
答案 2 :(得分:3)
您正在寻找Google(或其他任何人)reverse geocoding service。
答案 3 :(得分:1)
地理位置PHP将纬度经度转换为地址。 首先,您需要使用以下链接获取Google Map API的API密钥:
https://developers.google.com/maps/documentation/geocoding/start#ReverseGeocoding
将以下函数放入您的帮助器类中,然后在您希望简单地传递经纬度的地方调用该函数。通过lat long后,它们返回有关lat long值的地址。整个过程称为反向地理编码。
/**
* find address using lat long
*/
public static function geolocationaddress($lat, $long)
{
$geocode = "https://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$long&sensor=false&key=AIzaSyCJyDp4TLGUigRfo4YN46dXcWOPRqLD0gQ";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $geocode);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXYPORT, 3128);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$response = curl_exec($ch);
curl_close($ch);
$output = json_decode($response);
$dataarray = get_object_vars($output);
if ($dataarray['status'] != 'ZERO_RESULTS' && $dataarray['status'] != 'INVALID_REQUEST') {
if (isset($dataarray['results'][0]->formatted_address)) {
$address = $dataarray['results'][0]->formatted_address;
} else {
$address = 'Not Found';
}
} else {
$address = 'Not Found';
}
return $address;
}
有关更多详细信息,请在以下链接中查看: Geolocation PHP Latitude Longitude to Address - Lelocode