7

He encontrado el código en este sitio para obtener el estado de un código postal, pero también necesito obtener el nombre de la ciudad.Obtener el nombre de la ciudad del código postal google geocoding

Aquí está mi código para conseguir el estado: (Tenga en cuenta también que utilizo jQuery)

var geocoder = new google.maps.Geocoder(); 

    $('.zip').bind('change focusout', function() { 
     var $this = $(this); 
     if ($this.val().length == 5) { 
      geocoder.geocode({ 'address': $this.val() }, function (result, status) { 
       var state = "N/A"; 
       //start loop to get state from zip 
       for (var component in result[0]['address_components']) { 
        for (var i in result[0]['address_components'][component]['types']) { 
         if (result[0]['address_components'][component]['types'][i] == "administrative_area_level_1") { 
          state = result[0]['address_components'][component]['short_name']; 
          // do stuff with the state here! 
          $this.closest('tr').find('select').val(state); 
         } 
        } 
       } 
      }); 
     } 
    }); 
+0

¿Me puede compartir los demás códigos de jQuery para obtener el nombre del lugar usando postal code.I también estoy en la búsqueda ...... – Techy

Respuesta

8

Sólo añadir result[0]['address_components'][1]['long_name']

Así que sería

var geocoder = new google.maps.Geocoder(); 

$('.zip').bind('change focusout', function() { 
    var $this = $(this); 
    if ($this.val().length == 5) { 
     geocoder.geocode({ 'address': $this.val() }, function (result, status) { 
      var state = "N/A"; 
      var city = "N/A"; 
      //start loop to get state from zip 
      for (var component in result[0]['address_components']) { 
       for (var i in result[0]['address_components'][component]['types']) { 
        if (result[0]['address_components'][component]['types'][i] == "administrative_area_level_1") { 
         state = result[0]['address_components'][component]['short_name']; 
         // do stuff with the state here! 
         $this.closest('tr').find('select').val(state); 
         // get city name 
         city = result[0]['address_components'][1]['long_name']; 
         // Insert city name into some input box 
         $this.closest('tr').find('.city').val(city); 
        } 
       } 
      } 
     }); 
    } 
}); 
+1

¡¡Eres el total de MAAAAN !!!! ¡¡Muchas gracias!! – boruchsiper

+0

Jeje ... En cualquier momento :) –

+2

Tenga cuidado al usar los índices de los componentes de la dirección ¡YA QUE NO SON COMPATIBLES! –

6

He reescrito solución anterior para que se vea más elegante:

var zipCode = '48201'; 
var country = 'United States';    

var geocoder = new google.maps.Geocoder(); 

geocoder.geocode({ 'address': zipCode + ',' + country }, function (result, status) { 

    var stateName = ''; 
    var cityName = ''; 

    var addressComponent = result[0]['address_components']; 

    // find state data 
    var stateQueryable = $.grep(addressComponent, function (x) { 
     return $.inArray('administrative_area_level_1', x.types) != -1; 
    }); 

    if (stateQueryable.length) { 
     stateName = stateQueryable[0]['long_name']; 

     var cityQueryable = $.grep(addressComponent, function (x) { 
      return $.inArray('locality', x.types) != -1; 
     }); 

     // find city data 
     if (cityQueryable.length) { 
      cityName = cityQueryable[0]['long_name']; 
     } 
    } 
}); 
+1

Parece que hay algunos problemas con el código geográfico de google para encontrar ciudades desde el código postal. Por ejemplo, preguntar por "59650, France" devuelve Wattrelos en lugar de Villeneuve d'Ascq. Lo mismo para (algunas) otras ciudades probadas en Francia y Alemania. No sé por qué, no sé cómo solucionarlo. –

6

A continuación se muestra el código para verificar el nombre de la ciudad desde el código postal con googleapis.

<html> 
    <head> 
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> 
    <meta charset="utf-8"> 
    <title>Geocoding service</title>  
    <script src="https://maps.googleapis.com/maps/api/js?v=3.exp"></script>  
<script>  
     var geocoder; 
     var map;   
     function codeAddress() { 
      geocoder = new google.maps.Geocoder(); 
      var address = document.getElementById('address').value; 
      geocoder.geocode({ 'address': address }, function (results, status) { 
       if (status == google.maps.GeocoderStatus.OK) {      

        for (var component in results[0]['address_components']) { 
         for (var i in results[0]['address_components'][component]['types']) { 
          if (results[0]['address_components'][component]['types'][i] == "administrative_area_level_1") { 
           state = results[0]['address_components'][component]['long_name']; 
           alert(results[0]['address_components'][1]['long_name'] + ' , ' + state); 
          } 
         } 
        }           
       } else { 
        alert('Invalid Zipcode'); 
       } 
      }); 
     }   

    </script> 
    </head> 
    <body> 
    <div id="panel"> 
     <input id="address" type="textbox" value="Sydney, NSW"> 
     <input type="button" value="Geocode" onclick="codeAddress()"> 
    </div> 
    <div id="map-canvas"></div> 
    </body> 
</html> 
+0

no has usado jquery como op, esto es exactamente lo que quería +1 – Dheeraj

+0

Lo siento, no obtengo. – Nimesh

+0

dije que tu código me era útil – Dheeraj

0

Soy lo suficientemente generosa para proporcionar el módulo exacta Rodé a hacer esto por nosotros. Devuelve un objeto como:

{ 
    country : { long_name : "someString", short_name : "someStrong" }, 
    city : { long_name : "someString", short_name : "someString" }, 
    state : { long_name : "someString", short_name : "someString" } 
} 

y puede ser llamado usando el código: let test = new ZipCodeDeconstructor().deconstruct('20009');

Esto está escrito en TypeScript (subir a ese tren) y se utiliza en node.js (que ya debería estar en ese tren .

Si usted no tiene request-promise sin embargo, ejecutar npm i request-promise --save y asegúrese de que su configuración mecanografiado permite que los async/await palabras clave para ser usados.

Esto es básicamente usar todo "nuevo" a partir del momento en que esto se ha escrito, por lo que debería ser bastante útil durante algún tiempo.

let rp = require('request-promise'); 
enum IGoogleMapResultType { 
    COUNTRY = <any>'country', 
    LOCALITY = <any>'locality', 
    SUBLOCALITY_LEVEL_1 = <any>'sublocality_level_1', 
    ADMINISTRATIVE_AREA_LEVEL_1 = <any>'administrative_area_level_1', 
    // These may be used later, don't delete them, they're for reference 
    POSTAL_CODE = <any>'postal_code', 
    NEIGHBORHOOD = <any>'neighborhood', 
    POLITICAL = <any>'political', 
    ADMINISTRATIVE_AREA_LEVEL_2 = <any>'administrative_area_level_2', 
    ADMINISTRATIVE_AREA_LEVEL_3 = <any>'administrative_area_level_3' 
} 
interface IGoogleMapResult { 
    address_components : { 
    long_name? : string 
    short_name? : string 
    types : IGoogleMapResultType[] 
    }[], 
    formatted_address : string, 
    geometry: any, 
    place_id: string, 
    types: IGoogleMapResultType[] 
} 
type IGoogleMapResults = any[]; 
type ZipCodeDeconstructorProperty = { 
    long_name: string, 
    short_name: string 
} 
// What we return from this component 
export type ZipCodeDeconstructorResponse = { 
    city: ZipCodeDeconstructorProperty, 
    state: ZipCodeDeconstructorProperty, 
    country: ZipCodeDeconstructorProperty 
} 
export class ZipCodeDeconstructor { 
    static apiUrl = "http://maps.googleapis.com/maps/api/geocode/json?address="; 
    constructor() {} 
    // main entry point, deconstruct a 5 digit zip into city, state, zip into the corresponding properties 
    async deconstruct(zip):Promise<ZipCodeDeconstructorResponse> { 
    let response:any = await this._makeCall(zip); 
    let firstResult = response.results[0]; 
    let returnObject = { 
     city : this._extractCity(firstResult), 
     state : this._extractState(firstResult), 
     country : this._extractCountry(firstResult) 
    }; 
    console.log("[Zip Code Deconstructor] returning: ", returnObject); 
    return returnObject; 
    } 
    private _createZipcodeUrl(zip) { 
    return ZipCodeDeconstructor.apiUrl + zip + '&sensor=true'; 
    } 
    private async _makeCall(zip) { 
    return await rp({uri : this._createZipcodeUrl(zip), json : true }); 
    } 
    private _extractOfTypeFromResult(typesArray:IGoogleMapResultType[], result:IGoogleMapResult) { 
    for(let i = 0; i < result.address_components.length; i++) { 
     let addressComponentAtIndex = result.address_components[i]; 
     let type:IGoogleMapResultType = addressComponentAtIndex.types[0]; 
     if(typesArray.indexOf(type) !== -1) { 
     return { 
      long_name : addressComponentAtIndex.long_name, 
      short_name : addressComponentAtIndex.short_name 
     } 
     } 
    } 
    } 
    private _extractCity(result:IGoogleMapResult) { 
    return this._extractOfTypeFromResult([IGoogleMapResultType.SUBLOCALITY_LEVEL_1, 
     IGoogleMapResultType.LOCALITY], result) 
    } 
    private _extractState(result:IGoogleMapResult) { 
    return this._extractOfTypeFromResult([IGoogleMapResultType.ADMINISTRATIVE_AREA_LEVEL_1], result); 
    } 
    private _extractCountry(result:IGoogleMapResult) { 
    return this._extractOfTypeFromResult([IGoogleMapResultType.COUNTRY], result); 
    } 
} 
// let test = new ZipCodeDeconstructor().deconstruct('20009'); 

Las interfaces en la parte superior que deben ayudar a lo largo del camino de la inteligencia lo que se volvió y lo que debe ser aprobada en.

Cuestiones relacionadas