2009-05-09 9 views
6

Quiero utilizar el código geográfico de google a través de la funcionalidad HTTP para traducir un nombre de ciudad en longitud y latitud en mi aplicación web AJAX.Google Geocode a través de la función de devolución de llamada HTTP?

Sin embargo, parece que no existe ninguna llamada de retorno para la funcionalidad geocodificador HTTP

http://code.google.com/apis/maps/documentation/geocoding/index.html

¿Es eso cierto, no existe una función de devolución?

Porque si eso es cierto, significa esencialmente que el código de Google a través de HTTP api es inútil cuando se utiliza con AJAX porque JavaScript lanzará un error de excepción de dominio cruzado.

¿Alguna idea sobre cómo puedo usar el geocódigo a través de la API HTTP en mi aplicación web AJAX en JavaScript?

Nota: hago no desea utilizar el API de Google Maps soplado completo, que se aprox descargar 200kb (es decir GClientGeocoder). Quiero utilizar el HTTP api b/c de su capacidad de respuesta súper rápida y la falta de necesidad de que los usuarios de mi web tengan que descargar la gran API interactiva completa de google maps.

E.g. http://maps.google.com/maps/geo?output=json&sensor=false&key= {API_KEY} & q = {CITY, STATE} & CALLBACK = ????

Gracias

+0

No hay JSONP sin procesar. Puede usar la API REST (con un proxy si es necesario) o puede usar GClientGeocoder. –

+0

Cómo se dijo, usar un proxy es tonto y crudo, pero sí, funcionaría. Si esto es cierto, JSONP no existe para HTTP y solo para GClientGeocoder ... eso sería muy triste –

Respuesta

3

hmm .... creo que tendría que tener su AJAX llamar de nuevo a su propio servidor, y luego llamar de códigos geográficos de Google desde su servidor.

Así es como hago geocodificación AJAX, todo pasa por mi código ASP.NET.

EDIT:

En el entorno de formularios web ASP.NET que podría implementa como un archivo ASHX ligero, pero a los efectos de simplicidad, he aquí un ejemplo ASPX:

public partial class GoogleHandler : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) { 
     Response.Write(GetGoogleXML("http://pseudo_googlegeocode?parameter=" + parametersFromQuerystring); 
    } 
} 

En el ejemplo anterior , la página .NET solo está aprobando la solicitud.

Pero en un entorno real, prefiero que mi código .NET haga algo más que pasar los datos. De esta forma puedo manejar errores, filtrar, validar, lógica de negocios, todo en el servidor, antes de enviar esos datos al cliente.

Además, esto permite una mayor abstracción. es decir, podría cambiar de Google a la geocodificación de yahoo. De esta forma, solo tendría que cambiar mi lógica de servidor y dejar que el cliente simplemente reciba un conjunto genérico de coordenadas/datos de ubicación.

Además, usando esa abstracción podría agregar datos múltiples de varias fuentes de datos de geocodificación. De nuevo, el servidor se encarga de agregar, el cliente simplemente recibe y muestra los datos filtrados.

+0

Parece una pérdida terrible tener que crear un paso de intermediario en su sitio web para simplemente descargar el contenido y volver a publicar el resultado para eludir la excepción de dominio cruzado. Es curioso si hay otra forma de evitarlo o una rutina de devolución de llamada no documentada. –

+0

Te escucho Tim. Supongo que es solo seguridad. Ya sabes lo que dicen, no puedes entrar en una casa que no tiene puertas ... ¿lo dicen? Ya sabes lo que quiero decir – andy

+0

@tim: solo un rápido comentario sobre lo que dijiste. Si hace una llamada AJAX a su servidor, como si estuviese haciendo una llamada directamente a Google, y luego solo tiene su servidor Ping de Google con los parámetros anteriores, entonces sí, está usando un intermediario, pero no está publicando o descargando cualquier contenido superfluo – andy

3

Aquí se muestra un ejemplo que utiliza el Google Maps Geocoder. La función de geocodificador getLocation toma una función de devolución de llamada como segundo argumento.

function findAddress(street, city, state, zip) { 
    var address = [ 
    street, 
    city.toLowerCase(), 
    state.toLowerCase(), 
    zip 
    ].join(', '); 

    if (!geocoder) { 
    geocoder = new GClientGeocoder(); 
    } 

    if (geocoder) { 
    geocoder.getLocations(
     address, 
     function(result) { 
     var dialog, len, point; 
     if (result.Status.code != G_GEO_SUCCESS) { 
      alert("Error: "+result.Status.code) 
     } else { 
      len = result.Placemark.length; 
      if (len > 1) { 
      alert("Multiple matches were found. I'll leave it as an exercise to handle this condition"); 
      } else { 
      point = new GLatLng(
       result.Placemark[0].Point.coordinates[1], 
       result.Placemark[0].Point.coordinates[0] 
      ); 
      } 
     } 
     } 
    ); 
    } 
} 
+1

Gracias, pero no quiero usar la completa API de Google Maps. Quiero usar el geocodificador HTTP. –

2

Como han notado otros, no ha leído la página completa. Quiere lo que esa página llama al JavaScript Client Geocode.

Aquí hay una versión simplificada de un script que escribí hace un tiempo. También utiliza un control Google Map, pero no dude en ignorarlo. El hack de la función de demora se debe a que parecía que Google ocasionalmente devolvía el nulo cuando golpeaba sus servidores demasiado rápido. No sé si esto todavía es un problema, así que no lo pongas a menos que tengas que hacerlo.

<script type="text/javascript"> 

    //<![CDATA[ 

    var freezeLocations; 
    var coder; 
    var map; 

    function load() { 
     if (GBrowserIsCompatible()) { 
     map = new GMap2(document.getElementById("map")); 
     map.setCenter(new GLatLng(38.479395, -98.349609), 4); 
     map.addControl(new GLargeMapControl()); 
     } 

     coder = new GClientGeocoder(); 

     missionLocations = new Array(); 
     missionLocationsDelayed = new Array(); 
     addMissionLocation("Atlanta, Georgia", "http://improveverywhere.ning.com/group/atlanta"); 
     //etc. 
    } 

    function addMissionLocation(newLocation, url) 
    { 
     var successful = false; 
     var counter = 0; 

     while(!successful && counter < 3) 
     { 
      coder.getLatLng(
       newLocation, 
       function(point) { 
        if (!point) { 
         //alert(newLocation + " not found"); 
         successful = false; 
        } else { 
         missionLocations.push(new GMarker(point, { title:newLocation})); 
         //alert(missionLocations.length); 
         map.addOverlay(missionLocations[missionLocations.length - 1]); 
         missionLocations[missionLocations.length - 1].bindInfoWindowHtml("<a href='" + url + "'>" + newLocation + "</a>"); 
         successful = true; 
        } 
       } 
      ); 

      if(!successful) 
      { 
       delayGeocode(); 
      } 

      counter++; 
     } 
    } 

    function delayGeocode() 
    { 
     for(var i = 0; i < 2000000; i++) 
     { 
     } 
    } 


    //]]> 
    </script> 
+0

Gracias, pero no quiero usar la completa API de Google Maps. Quiero usar el geocodificador HTTP. –

1

Se podría utilizar un lenguaje Yahoo de consulta como se describe en mi blog http://jawtek.blogspot.com/2009/03/unwritten-guide-to-yahoo-query-langauge.html

Usted sería capaz de usar una declaración yql como:

select * from json where 
    url="http://maps.google.com/maps/geo?output=json&sensor=false&q=Indianapolis,In"

continuación, se añade una etiqueta de secuencia de comandos para su html (se puede hacer con document.createElement ('script')) con un src http://query.yahooapis.com/v1/public/yql?q= {su yql aquí} & format = json & callback = {su función aquí} donde {su yql aquí} se reemplaza con una versión URI Encoded de usted yql statment.

+0

¿No sería esto una excepción de dominio cruzado, que AJAX previene? –

+0

Si estabas tratando de usar una solicitud XMLHTTP, entonces sí, sería derribado. Entonces, en su lugar, lo carga como una etiqueta de script y con la devolución de llamada llamará a una de sus funciones con los resultados. – jasonincode

0

En segundo lugar, sugiero crear una página del lado del servidor para acceder al geocodificador. Estoy haciendo algo similar y funciona genial. Hay un buen artículo sobre cómo trabajar con el geocodificador en PHP here.

También tenga en cuenta que técnicamente you're not permitted para utilizar el geocodificador de Google a menos que vaya a mostrar los datos en un mapa de Google, pero no sé si realmente lo controlarán.

1

Si usted ha mirado la documentación y no encontrado, y tanto Andrew y Mike no han dicho "sí", y le ha dicho cómo hacerlo, me sospecha que tiene su respuesta.

lol

y deja todo como leído la documentación del servicio:

10,13 cuero o la máscara de Google la identidad de su servicio, ya que utiliza el Servicio, incluyendo al no seguir el las convenciones de identificación que figuran en la documentación de las API de Maps; o 10.14 violan las políticas en la documentación API de Google Maps o violan los principios de Google Software (...)

también

Este servicio está diseñado para la codificación geográfica estática (conocido) trata utilizando una interfaz REST, por ubicación del contenido de la aplicación en un mapa.Para geocodificación dinámica de direcciones definidas por el usuario (por ejemplo, dentro de un elemento de la interfaz de usuario ), consulte la documentación para el Geocoder cliente JavaScript o la API de Maps para flash Cliente Geocoder. La codificación geográfica es una tarea que requiere mucho tiempo y recursos . Siempre que sea posible, prefijo el código de las direcciones conocidas (utilizando el servicio de geocodificación descrito aquí u otro servicio de geocodificación ) y almacene los resultados en un caché temporal de su propio diseño.

Pero, de nuevo podría intentar Google Maps API V3 Geocoder

0

también me encontré con los retos a los que se ha descrito anteriormente. Como usted ha indicado, Google impide el acceso HTTP a varios dominios a la URL de la API de geocodificación:

Esto disminuye gravemente su utilidad cuando se utilizan secuencias de comandos del lado del cliente. La única solución que encontré para este desafío fue crear un servicio proxy del lado del servidor que transmite las respuestas de la API de Google Maps Geocode a mi script del lado del cliente.

I wrote an extremely long-winded blog post describing this process.

Cuestiones relacionadas