2012-04-17 25 views
5

Tengo una base de datos con las direcciones exactas (calle, no, ciudad, región/área, país). Sin embargo, me preguntaba si había una forma de utilizar Google API para obtener el distrito de una ciudad (por ejemplo, "Manhattan") si estamos en Nueva York.Dirección de codificación geográfica: obtener el distrito de una determinada dirección (Google API)

toda la otra información que ya tengo en la base de datos, por lo que sólo necesitaría el distrito si hay uno (por supuesto, esto será sólo en las grandes ciudades) ...

ACTUALIZACIÓN:

Encontré esta función en http://www.techques.com/question/1-3151450/Google-geolocation-API---Use-longitude-and-latitude-to-get-address y traté de cambiar formatted_address a sublocality (incluso otros como short_name etc.) pero no devuelve nada ... ¡cualquier ayuda sería muy apreciada! ¡¡Gracias!!

function reverse_geocode($lat, $lon) { 
    $url = "http://maps.google.com/maps/api/geocode/json?latlng=$lat,$lon&sensor=false"; 
    $data = json_decode(file_get_contents($url)); 
    if (!isset($data->results[0]->formatted_address)){ 
     return "unknown Place"; 
    } 
    return $data->results[0]->formatted_address; 
} 

Respuesta

5

Puede acceder a la Sublocalidad así:

function reverse_geocode($lat, $lon) { 
    $url = "http://maps.google.com/maps/api/geocode/json?latlng=$lat,$lon&sensor=false"; 
    $data = json_decode(file_get_contents($url)); 
    if (!isset($data->results[0]->address_components)){ 
     return "unknown Place"; 
    } 

    if ($data->results[0]->address_components[2]->types[0]=="sublocality") { 

     $return_array['type']="sublocality"; 
     $return_array['sublocality_long_name']=$data->results[0]->address_components[2]->long_name; 
     $return_array['sublocality_short_name']=$data->results[0]->address_components[2]->short_name; 

     return $return_array; 
     } 

} 
+0

gracias, esto es lo que estaba buscando ... – Helmut

3

Encontrará esta información dentro de un código geográfico-petición, cuando existe un resultado con el conjunto types a

[ "sublocality", "political" ] 

Ejemplo: 317 Madison Ave,New York City


Modificación de la función arriba para un fácil acceso de los componentes de respuesta:

/** 
    * @param $a mixed latitude or address 
    * @param $b mixed optional longitude when $a is latitude 
    * @return object geocoding-data 
    **/ 

    function geocode($a, $b=null) { 
    $params=array('sensor'=>'false'); 
    if(is_null($b)) 
    { 
     $params['address']=$a; 
    } 
    else 
    { 
     $params['latlng']=implode(',',array($a,$b)); 
    } 
    $url = 'http://maps.google.com/maps/api/geocode/json?'.http_build_query($params,'','&'); 
    [email protected]_get_contents($url); 

    $response=new StdClass; 
    $response->street_address    = null; 
    $response->route      = null; 
    $response->country      = null; 
    $response->administrative_area_level_1 = null; 
    $response->administrative_area_level_2 = null; 
    $response->administrative_area_level_3 = null; 
    $response->locality     = null; 
    $response->sublocality     = null; 
    $response->neighborhood    = null; 
    $response->postal_code     = null; 
    $response->formatted_address   = null; 
    $response->latitude     = null; 
    $response->longitude     = null; 
    $response->status      = 'ERROR'; 

    if($result) 
    { 
     $json=json_decode($result); 
     $response->status=$json->status; 
     if($response->status=='OK') 
     { 
     $response->formatted_address=$json->results[0]->formatted_address; 
     $response->latitude=$json->results[0]->geometry->location->lat; 
     $response->longitude=$json->results[0]->geometry->location->lng; 

     foreach($json->results[0]->address_components as $value) 
     { 
      if(array_key_exists($value->types[0],$response)) 
      { 
      $response->{$value->types[0]}=$value->long_name; 
      } 
     } 
     } 
    } 
    return $response; 
} 

//sample usage 
echo '<hr/>'.geocode('317 Madison Ave,New York City')->sublocality; 
    //Manhattan 

echo '<hr/>'.geocode('foobar')->status; 
    //ZERO_RESULTS 

echo '<hr/>'.geocode('40.689758, -74.04513800000001')->formatted_address; 
    //1 Liberty Is, Brooklyn, NY 11231, USA 
+0

Gracias Dr. Molle para su Anser y su ayuda! Encontré esta función (ver la actualización de mi publicación), pero si simplemente cambio formatted_address a cualquier otra cosa, devuelve "dirección desconocida" ... ¿tiene alguna idea de cómo obtener la sublocalidad solo con esta función? – Helmut

+0

agregó una función modificada para acceder fácilmente a los componentes individuales de la respuesta. –

0

me ocurrió lo siguiente.

function geocode() { 
 
    var geocoder = new google.maps.Geocoder(); 
 
    var lat = $('#latitude').val() 
 
    var lng = $('#longitude').val() 
 
    var latlng = {lat: parseFloat(lat), lng: parseFloat(lng)}; 
 

 
    geocoder.geocode(
 
    {'location': latlng}, 
 
    function(results, status) { 
 
     if (status === 'OK') { 
 
     for (var i = 0; i < results[0].address_components.length; i++) 
 
     { 
 
      if (status == google.maps.GeocoderStatus.OK) { 
 
    \t \t \t \t if (results[0]) { 
 
    \t \t \t \t \t for (var i = 0; i < results.length; i++) { 
 
       //alert(results[i].types[0]+','+results[i].types[1]+','+results[i].address_components[0].long_name) 
 
       //district 
 
       if (results[i].types[0]=='political' && results[i].types[1]=='sublocality'){ 
 
        alert(results[i].address_components[0].long_name); 
 
       } 
 
       //City 
 
       if (results[i].types[0]=='locality' && results[i].types[1]=='political'){ 
 
        alert(results[i].address_components[0].long_name); 
 
       } 
 
       //country 
 
       if (results[i].types[0]=='country' && results[i].types[1]=='political'){ 
 
        alert(results[i].address_components[0].long_name); 
 
       } 
 
    \t \t \t \t \t } 
 
    \t \t \t \t } 
 
    \t \t \t \t else {console.log("No reverse geocode results.")} 
 
    \t \t \t } 
 
    \t \t \t else {console.log("Geocoder failed: " + status)} 
 

 

 
     } 
 
    }}) 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

función latlng() { var geocoder = new google.maps.Geocoder(); var address = 'Lindwurmstraße, Munich, Germany' // $ ('# location'). Val() geocoder.geocode ({'dirección': dirección}, función (resultados, estado) { if (estado == google.maps.GeocoderStatus.OK) { var latitude = results [0] .geometry.location.lat(); var longitud = resultados [0] .geometry.location.lng(); $ ('# latitude '). val (latitud) $ (' # longitud '). val (longitud) geocode() } }); } // end –

+0

¿Qué se supone que significa este comentario? –

Cuestiones relacionadas