2009-08-21 31 views
11

Me preguntaba si es posible geocodificar algo usando googlemaps api de forma síncrona, así que en lugar de esperar a que se llame una función de devolución de llamada, esperaría a que se devolviera un valor. Alguien ha encontrado una manera de hacer algo como esto.Google Maps API Geocode Sincrónicamente

P.S .: Estoy usando la versión 3 de la API

Respuesta

1

El Geocoder llama a su función de devolución de llamada con el valor. Esa es la única forma de hacerlo. Si fuera sincrónico, su script se congelaría mientras esperaba que se procesara el Geocode. Realmente no hay ninguna razón para hacerlo así.

¿Qué es exactamente lo que estás tratando de lograr?

+1

Tengo un formulario que incluye una dirección. Como parte de la validación de los datos del formulario, estaba pensando en utilizar el geocodificador de Google para verificar la dirección. También necesito los valores de latitud y longitud para ingresar en mi base de datos. Sé que puedo hacer esto usando la función de devolución de llamada, pero eso parece un truco y sería más complicado. – giroy

+1

El Geocoder está destinado exclusivamente para ser utilizado con la función de devolución de llamada. No te preocupes, no es un truco. :) Es realmente tu única opción. Tenga en cuenta, sin embargo, que romperá las Condiciones de Servicio de Google Maps si está utilizando el Geocoder sin mostrar de alguna manera los resultados en un Mapa de Google. –

+0

Hasta donde yo sé, no puede usar la API de Google en un sistema interno o con un público selecto. Su página que usa Maps debe estar abierta a todo Internet, lea los términos del contrato. Buena @B Chris @Chris B –

7

Sí, lo que está tratando de lograr es posible, aunque no se necesita una solicitud sincrónica.

mirada a este código

function StoreGeo() 
{ 
     var address = $('input[name=zipcode]').val() + ', ' + $('input[name=city]').val(); 
geocoder.geocode({ 'address': address}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
     var ll = results[0].geometry.location.toString(); 

      llarr = ll.replace(/[\(\) ]/g, '').split(','); 

       for(i = 0; i < llarr.length;i++) 
       { 
        $('#form').append($('<input type="hidden" name="'+(i == 0 ? 'lat' : 'long')+'">').val(llarr[i])); 
       } 

       $('#form').submit(); 
     } 
     else 
     { 
     alert(status); 
     } 
    }); 

    $('#form').unbind('submit'); 
    return false; 
} 

$(document).ready(function() { 

    //init maps 
    geocoder = new google.maps.Geocoder(); 

    $('#form').bind('submit',function() { 
     StoreGeo(); 
    }); 

}); 

Así, adjunte presentar manejador a la forma, cuando se presentó la solicitud de hacer geo basado en la información de direcciones de su formulario. Pero, al mismo tiempo, posponga la entrega devolviendo false en el controlador. El controlador de respuesta creará 2 campos de texto ocultos 'lat' y 'long' y almacenará la respuesta. finalmente el formulario es enviado por el script del cliente, incluidos los dos nuevos campos. En el lado del servidor, puedes almacenarlos en la base de datos.

!! Tenga en cuenta que esto es posible, pero probablemente esté en contra de los términos de Google, como se indicó anteriormente.

+1

¡excelente respuesta! Añadiría que puede hacer la solicitud geográfica tan pronto como el usuario proporcione la información necesaria (o con un tiempo de espera después de eso). Entonces, mientras completa el resto del formulario, el Geocoder tiene tiempo para enviar la respuesta. Harás más solicitudes geográficas como esta, si el usuario cambia constantemente de opinión. – GoTo

+0

En cuanto a los términos de Google, no creo que los rompa si simplemente almacena las respuestas en una base de datos. Prácticamente cualquier tipo de aplicación web que va más allá de un simple ejemplo requerirá que almacene las respuestas en una base de datos. Los rompes si usas las respuestas sin Google Maps, o en un sistema cerrado/interno. – GoTo

1

Simplemente uso un indicador durante el envío del formulario para saber cuándo debe pasar el envío o cuándo debe esperar la geocodificación. Cuando se realiza la geocodificación, volverá a enviar el formulario nuevamente.

var hasGeocoded = false; 

    searchFrom.on('submit', function(){ 
     //If not geocoded yet 
     if (!hasGeocoded) { 
      var geocoder = new google.maps.Geocoder(); 
      var location = locationEl.val(); 
      geocoder.geocode({'address': location}, function (results, status) { 
       hasGeocoded = true; 

       if (status == google.maps.GeocoderStatus.OK) { 
        $('#coords').val(
         results[0].geometry.location.lat() + ',' + results[0].geometry.location.lng() 
        ); 
       } 

       searchFrom.submit(); 
      }); 

      return false; //wait for geocoder to finish and re-submit the form 
     } 

     return true; 
    });