2010-03-05 9 views
10

He creado una aplicación que obtiene un conjunto de direcciones de un servicio web y quiero asignarlas. Sé que Apple dejó esto en MapKit, incluyendo solo un Geocoder inverso. Me preguntaba cuál era la mejor manera de abordar este problema. ¿Servicio web? API de Google Maps (¿Cómo funcionan las claves de API?)? CloudMade?El mejor servicio de geocodificación para desarrolladores de iPhone

¿Cuál es su opinión sobre qué servicio es el más rápido, el más fácil de usar y el más económico (con suerte gratis)?

Respuesta

5

La API de Google Maps versión 3 ya no requiere una clave de API.

Lea esto: http://blog.sallarp.com/ipad-iphone-forward-geocoding-api-google/

+0

¡Muchas gracias! nunca hubiera sabido que salió la nueva versión. Finalmente encontré una buena solución. – conradev

+0

¿Hay alguna forma de geocodificar varias direcciones en una sola solicitud? Tengo una variedad de lugares que necesito asignar, y la cantidad de lugares puede subir a los años cincuenta. Sigo recibiendo el error de "demasiadas consultas" después de la e alrededor del décimo uno – conradev

+0

No estoy seguro de eso. Creo que debes explorar la API de Maps con respecto a varias solicitudes. Estoy bastante dudoso de que acepten solicitudes posteriores. Pero, pueden tener un método para aceptar múltiples direcciones. Sugiero contactar a Google para su problema. –

1

Utilizo un "servicio web reparador" para geocodificación inversa utilizando Google Maps y una vez que obtengo las coordenadas, las almacena en SQLite para referencia futura. El servicio devuelve una cadena JSON que luego analizaré en el iPhone.

Algo así como:

// Initialize call to REST Webservice 
- (void) initCall 
{ 
    // Service 
    RESTClient *client = [[[RESTClient alloc] initWithDelegate:self] autorelease]; 
    NSString *serviceHost = @"http://www.site.com/service/maps"; 
    [client get:serviceHost]; 
    [serviceHost release]; 
} 

- (void)RESTRequestDidSucceed:(RESTClient*)sender 
{ 

     // Search 
    NSString *data = [[[NSString alloc] init] autorelease]; 
    data = [[NSString alloc] initWithData:sender.receivedData encoding:NSUTF8StringEncoding]; 

    // Now you have the DATA in and NSString which you can pass as an argument to a method 
    // something like 

} 
5

IANAL, pero si la aplicación que estamos construyendo será libre, entonces creo que se puede utilizar la API de Google Maps de forma gratuita. Se limita a 15,000 solicitudes de geocodificación por día, pero de acuerdo con los documentos, eso está ligado a IP, no a la clave de API. Puede obtener una clave API immediately - no se requiere aprobación. (Si su aplicación no estará disponible libremente, deberá registrarse en Google Maps Premier.)

GMaps ahora tiene un REST-based geocoding API over HTTP (solía ser que tenía que usar su JavaScript API, que era una dolor en iPhone). Puede volver en JSON, lo que es trivial analizar usando TouchJSON si necesita los datos adicionales, o CSV, que será aún más fácil si todo lo que necesita es lat/lon. Por lo tanto, puede crear un objeto que cumpla con el MKAnnotation protocol que obtendrá el JSON/CSV de la API usando NSURLConnection o ASIHTTPRequest, lo analizará y devolverá la variable Point como propiedad coordinate y construirá su MapView según sea necesario.

+0

Eso no es del todo cierto con compañías de telefonía móvil, que a menudo utilizan puerta de enlace/proxies que finalmente trae el * * mismo IP ** para miles de usuarios, que en zonas urbanas con mucha gente, como yo, París, Francia, supera los límites de Google ... y alrededor de las 5 p.m., 503 errores para muchos usuarios ... –

0

De acuerdo con Google y Yahoo, sus respectivos servicios de geocodificación no permiten "de almacenamiento para uso futuro." A menos que lo haya entendido mal, no puede almacenar los resultados de la consulta en ninguna forma de base de datos. De lo contrario, sería muy fácil simplemente Google (ahora 50,000 solicitudes por día).

4

Uso de Apple API de codificación geográfica para esta "La clase CLGeocoder

http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/LocationAwarenessPG/UsingGeocoders/UsingGeocoders.html

proporciona servicios para la conversión entre una coordenada (especificada como una latitud y longitud) y la representación fácil de usar de esa coordenada. Un usuario La representación amigable de la coordenada generalmente consiste en la información de calle, ciudad, estado y país correspondiente a la ubicación dada, pero también puede contener un punto de interés relevante, puntos de referencia u otra información de identificación. Un objeto de geocodificador es un único objeto de disparo que funciona con un servicio basado en red para buscar información de marca de posición para su valor de coordenada especificado ue.

Para usar un objeto de geocodificador, créelo y llame a uno de sus métodos de geocodificación directa o inversa para comenzar la solicitud. Las solicitudes de geocodificación inversa toman un valor de latitud y longitud y encuentran una dirección legible por el usuario. Las solicitudes de geocodificación hacia adelante toman una dirección legible por el usuario y encuentran el valor de latitud y longitud correspondiente. Las solicitudes de geocodificación hacia adelante también pueden devolver información adicional sobre la ubicación especificada, como un punto de interés o la construcción en esa ubicación. Para ambos tipos de solicitud, los resultados se devuelven utilizando un objeto CLPlacemark.En el caso de solicitudes con visión de geocodificación, varios objetos de marcas de posición pueden ser devueltos si la información proporcionada produjo varias ubicaciones posibles."

CLGeoCoder geocoder = [[CLGeocoder alloc] init]; 
[geocoder geocodeAddressString:@"1 Infinite Loop" 
    completionHandler:^(NSArray* placemarks, NSError* error){ 
     for (CLPlacemark* aPlacemark in placemarks) 
     { 
      // Process the placemark. 
     } 
}]; 
+0

¡Gracias por la sugerencia, me siento mucho más cómodo de usar CLGeoCoder en lugar del enfoque de Google Maps de "terceros"! – Raffael

Cuestiones relacionadas