2012-10-10 8 views
0

J'ai un formulaire sur mon site Web où un utilisateur entre une adresse d'un lieu. Quand ils soumettent le formulaire, je convertis cet emplacement en latitude/longitude et le stocke dans une base de données MySQL. J'utilise le service Geocode de Google pour cette conversion. Le problème est que je ne peux trouver ni une classe ni un service pour convertir cette latitude/longitude en une adresse et pour autant que je sache, le service de géocodage de Google est une conversion unidirectionnelle. Je me rends compte que je pourrais stocker l'adresse physique dans la base de données, mais au fil du temps c'est un espace gaspillé quand il pourrait être stocké dans un format plus simple. Quelqu'un sait-il soit une classe/service pour convertir de la latitude/longitude à une adresse ou si je me trompe et que je peux utiliser le système de géocodage de Google? J'ai cherché la réponse ces derniers jours mais je n'ai rien trouvé. Merci de votre aide!PHP Latitude Longitude à Adresse

Répondre

3

Vous recherchez Google (ou quelqu'un d'autre) reverse geocoding service.

+0

Ok génial, cela fonctionne parfaitement. J'ai essayé de trouver ceci pour les derniers jours, merci! –

+1

Tenez-vous au fait des règles d'utilisation de Google (Remarque: l'API de géocodage ne peut être utilisée qu'avec une carte Google, le géocodage des résultats sans les afficher sur une carte est interdit.) Https://developers.google.com/maps/documentation/ geocoding/ – puddleglum

5
<?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>"; 
} 

Ne hésitez pas à regarder my blog pour un exemple de code de la façon dont utilisant le code ci-dessus et le résultat de l'échantillon.

+0

J'utilise le code ci-dessus en PHP et généralement cela fonctionne très bien - cependant parfois Get_Address_From_Google_Maps ($ lat, $ lon) renvoie null pour $ address. Avez-vous déjà vu ce problème et des suggestions? C'est très intermittent mais cela arrive. Le lat, lon est valide et précédemment retourné une adresse valide mais sur un deuxième appel, ou un troisième appel, ou un nième appel pour le même lat, lon retournera une adresse nulle? Des pensées sur pourquoi? –

4

La conversion de coordonnées géographiques en adresse est connue sous le nom de géocodage inverse. Dans ce script, nous utilisons l'API Google Map car c'est gratuit, rapide et aucune clé API requise. Limite de taux de réversion Google Le géocodage est de 2500 appels API par IP par jour.

fonction PHP pour Reveres géocodage

<? 
    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; 
    } 
    } 
?> 

latitude et la longitude du col en fonction getAddress(). Il retournera la chaîne d'adresse en cas de succès sinon retourner booléen faux.

Exemple

<?php 
    $lat= 26.754347; //latitude 
    $lng= 81.001640; //longitude 
    $address= getaddress($lat,$lng); 
    if($address) 
    { 
    echo $address; 
    } 
    else 
    { 
    echo "Not found"; 
    } 
?>