2009-02-16 7 views
14

Actualización: iPhone SDk 3.0 ahora resuelve la pregunta aquí, sin embargo, la NDA evita cualquier discusión en profundidad. Inicie sesión en el iPhone Dev Center si necesita más información.Integre la API de Google Maps en una aplicación para iPhone

Ok, tengo que admitir que estoy un poco perdido aquí.

Estoy bastante cómodo con Cocoa, pero tengo problemas para recoger el bit de javascript necesario para resolver este problema.

Estoy tratando de enviar una solicitud a Google para un código geográfico inverso.

He mirado sobre la documentación de Google que he visto aquí: http://code.google.com/apis/maps/documentation/index.html http://code.google.com/apis/maps/documentation/geocoding/

Incluso después de una lectura aproximada, me falta un concepto básico:

¿Cómo hablar a Google? En algunos ejemplos, muestran que se está enviando una URL a google (lo que parece bastante fácil), pero en otros muestran javascript. Parece que para la geocodificación inversa, la solicitud puede ser más difícil que enviar la URL con algunos parámetros (pero espero estar equivocado).

¿Alguien me puede indicar la forma correcta de hacer una solicitud? (En el objetivo C, para que pueda abarcarlo)

Respuesta

9

ACTUALIZACIÓN - iPhone 0.3 incluye MapKit, que esperamos que sea significativamente más rápido que usar la API de JS. La propaganda dice que incluirá geocodificación inversa.

No puede realizar una solicitud directamente en el objetivo C, al menos no dentro de los términos de la API de Google. La API de Google está escrita en Javascript. Puedes usar un puente de objetivo-c a JS, como lo hace el Google Maps Component, pero eso realmente no resuelve el problema, ¡aún estás haciendo llamadas JS!

Por desgracia, eso significa que a) necesita utilizar una vista web b) que tenga que utilizar la API de JS que es lento ... Comparar con la aplicación de Google Maps que utiliza un protocolo OTA completamente diferente (intenta que la detección de paquetes)

El componente Google Maps es, sin embargo, un útil tutorial sobre cómo hacer llamadas simples a la API.

+0

Gracias, parecía que era algo así como tedioso que. Confirma mis temores, ya que solo quiero revertir el geocodificador de una dirección. Parece que sería trivial. –

3

La forma más fácil de obtener un mapa de Google utilizando Cocoa es utilizar la "API de mapas estáticos". En la práctica, debe preparar un NSURL que use para contactarse con Google. Usted recupera su mapa como NSData, que transforma a un NSImage. Tenga en cuenta que puede hacer tanto geocodificación como geocodificación inversa. También puede insertar marcadores en el mapa. Sin embargo, pierde los controles completos a los que tiene acceso si usa su API de JavaScript.

Tome un vistazo a su guía de referencia aquí:

http://code.google.com/apis/maps/documentation/staticmaps/

1

Para su información: La API de geocodificación inversa de Google para las solicitudes de XML no es pública, por lo que es ilegal utilizar. La única forma legal es pasar por su JavaScript-API, que como descubriste es más difícil de hacer en Cocoa que simplemente enviar una solicitud HTTP.

Alternativas: La geocodificación inversa con solicitudes XML/JSON simples también está disponible en Geonames o Yahoo.

0

En realidad, no me refería a la geocodificación inversa como "traducir un punto a una dirección legible por humanos", sino a visualizar un punto usando Google Map (que también, según el nivel de precisión, puede mostrar una lectura humana dirección). Esta es la funcionalidad básica que se requería.

En la práctica, sólo quería sugerir la API de mapas estáticos como una forma limpia y rápida:

1) dadas las coordenadas obtenidas desde el sensor GPS iPhone, recuperar un mapa de Google que muestra el punto

2) dada una dirección, transformarlo en las coordenadas geográficas correspondientes y luego usar las coordenadas para recuperar un mapa de Google que muestra la dirección indicada

Ambos son posibles utilizando NSURLs simples que involucran la staticmap y servicios geo

http://maps.google.com/staticmap? http://maps.google.com/maps/geo?

pasando, por supuesto, los parámetros necesarios para proporcionar una cadena de consulta adecuada.

Saludos cordiales

2

Ahora que Apple han liberar la API MapKit para OS 3.0, creo que tu pregunta ha sido contestada. ¡Después de haber mirado los documentos API, puedo ver muchísimo potencial! Todavía me gustaría ver el servicio web de geocodificación inversa de Google, pero Yahoo lo hará mientras tanto.

0

El gran problema, por supuesto, es que el acuerdo de licencia de ambos estados, google y yahoo, no puede usar estas API en "aplicaciones comerciales". odiaría publicar una aplicación en la tienda de aplicaciones solo para que sea desactivada y demandada por Yahoo o Google. Al leer la API api del iPhone 3.0 y la licencia asociada, esto no se menciona, pero si desea que una aplicación se ejecute en teléfonos no actualizados ...

¿Hay alguna respuesta para esto que no la ponga en problemas?

4

He creado SVGeocoder, un simple hacia adelante y clase geocoder inverso para iOS. Utiliza la API de geocodificación de Google, devuelve objetos SVPlacemark (una subclase MKPlacemark con una propiedad coordinate) y utiliza bloques.

Así es como se geocode una cadena de dirección:

[SVGeocoder geocode:addressString 
     completion:^(NSArray *placemarks, NSError *error) { 
      // do something with placemarks, handle errors 
     }]; 

También puede invertir geocode una coordenada como esto:

[SVGeocoder reverseGeocode:CLLocationCoordinate2DMake(45.53264, -73.60518) 
       completion:^(NSArray *placemarks, NSError *error) { 
        // do something with placemarks, handle errors 
       }]; 
+0

Aprecio el "SVGeocoder" que ha creado. Funciona bien excepto seis advertencias azules después del análisis. Tres advertencias azules en "SVGeocoder.m ": 1) Posible fuga de un objeto asignado en la línea 135: self.request = ... 2) Posible fuga de un objeto asignado en la línea 211: self.responseData = ... 3) Posible fuga de un objeto asignado en línea 214: self.connection = ... Y tres advertencias azules en "JSONKit.m", 1) Código muerto en la línea 744: anObject = [an Object retener]; 2) Código muerto en la línea 791: anObject = [anObject retain]; 3) Error de lógica en la línea 865: encodeState-> serializeOptionFlags = optionFlags; –

+0

Mi versión de xcode es 4.2 –

+0

Debería publicar ese tipo de cosas en GitHub, no en un comentario de SO. – samvermette

1

Desde IOS5 tenemos las siguientes opciones como se indica en el documento de desarrollo : * "Un objeto geocodificador utiliza un servicio de red para convertir entre valores de latitud y longitud y una marca de posición fácil de usar, que es una recopilación de datos como la calle, la ciudad, el estado y la información del país.La geocodificación inversa es el proceso de convertir una latitud y longitud en una marca de posición. La geocodificación de reenvío es el proceso de conversión de información de nombre de lugar a un valor de latitud y longitud. geocodificación inversa es compatible con todas las versiones de iOS, pero geocodificación hacia adelante sólo se admite en iOS 5.0 y posterior. "*

ahora se puede utilizar un objeto CLGeocoder.

Cuestiones relacionadas