2010-03-05 15 views
10

Ho creato un'app che ottiene una serie di indirizzi da un servizio Web e desidero mapparli. So che Apple ha lasciato questo fuori in MapKit, incluso solo un Geocoder inverso. Mi stavo chiedendo quale fosse il modo migliore per affrontare questo problema. Servizio web? API di Google Maps (come funzionano le chiavi API?)? CloudMade?Miglior servizio di geocodifica per sviluppatori iPhone

Quali sono le vostre opinioni su quale servizio sia più veloce, più facile da usare e più economico (si spera che sia gratuito)?

risposta

5

L'API di Google Maps versione 3 non richiede più una chiave API.

Leggi questo: http://blog.sallarp.com/ipad-iphone-forward-geocoding-api-google/

+0

Grazie mille! non avrei mai saputo che la nuova versione è uscita Ho finalmente trovato una buona soluzione – conradev

+0

C'è comunque un modo per geocodificare più indirizzi in una richiesta? Ho una serie di luoghi che devo mappare, e la quantità di posti può salire in anni Cinquanta. Continuo a ricevere l'errore per "troppe domande" dopo e intorno al decimo – conradev

+0

Non ne sono sicuro. Penso che tu abbia bisogno di esplorare l'API di Maps riguardo a più richieste. Sono abbastanza dubbi che accetterebbero richieste successive. Ma potrebbero avere un metodo per accettare più indirizzi. Suggerisco di contattare Google per il tuo problema. –

1

Uso un "WebService restful" per Geocoding inverso utilizzando Google Maps e una volta ottenute le coordinate li memorizzo in SQLite per riferimento futuro. Il servizio restituisce una stringa JSON che analizzerò in seguito nell'iPhone.

Qualcosa di simile:

// 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, ma se l'applicazione si sta costruendo sarà libero, allora credo che si può utilizzare l'API di Google Maps gratuitamente. È limitato a 15.000 richieste di geocodifica al giorno, ma secondo i documenti, è legato all'IP, non alla chiave API. È possibile ottenere una chiave API immediately - non è richiesta alcuna approvazione. (Se la tua app non sarà disponibile gratuitamente, dovrai registrarti a Google Maps Premier.)

GMaps ora ha uno geocoding API over HTTP basato su REST (in passato era necessario utilizzare la loro API JavaScript, che era un dolore su iPhone). Può tornare in JSON, che è banale da analizzare usando TouchJSON se hai bisogno dei dati extra, o CSV, che saranno ancora più facili se tutto ciò di cui hai bisogno è lat/lon. Pertanto, è possibile creare un oggetto conforme allo standard MKAnnotation protocol che recupera JSON/CSV dall'API utilizzando un NSURLConnection o ASIHTTPRequest, analizzarlo e restituire la variabile Point come proprietà coordinate e creare il MapView come richiesto.

+0

Questo non è del tutto vero con operatori di telefonia mobile, che spesso usano gateway/proxy che porta finalmente il * * stesso IP ** per migliaia di utenti, che in aree urbane molto affollate come dove sono io, Parigi, Francia supera i limiti di Google ... e intorno alle 17:00, 503 errori per molti utenti ... –

0

Secondo a Google e Yahoo, i loro rispettivi servizi di geocodifica non consentono di "archiviazione per un utilizzo futuro." A meno che non abbia frainteso, non è possibile archiviare i risultati della query in alcuna forma di database. Altrimenti sarebbe davvero semplice Google (ora 50.000 richieste al giorno).

4

utilizzare Apple Geocoding API per questo

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

"La classe CLGeocoder fornisce servizi per la conversione tra una coordinata (specificata come latitudine e longitudine) e la rappresentazione user-friendly di che coordinano. Un utente La rappresentazione amichevole della coordinata consiste tipicamente delle informazioni su strada, città, stato e paese corrispondenti alla posizione data, ma può anche contenere un punto di interesse, punti di riferimento o altre informazioni di identificazione rilevanti. Un oggetto geocoder è un singolo oggetto di ripresa che funziona con un servizio di rete per cercare informazioni sul segnaposto per il suo valore di coordinate specificato ue.

Per utilizzare un oggetto geocoder, crearlo e chiamare uno dei suoi metodi di geocodifica diretta o inversa per iniziare la richiesta. Le richieste di geocoding inverso prendono un valore di latitudine e longitudine e trovano un indirizzo leggibile dall'utente. Le richieste di geocoding in avanti prendono un indirizzo leggibile dall'utente e trovano il valore di latitudine e longitudine corrispondente. Le richieste di geocodifica in avanti possono anche restituire ulteriori informazioni sulla posizione specificata, come un punto di interesse o la costruzione in quella posizione. Per entrambi i tipi di richiesta, i risultati vengono restituiti utilizzando un oggetto CLPlacemark.In caso di richieste di andata-geocoding, più oggetti segnaposto possono essere restituiti se le informazioni fornite prodotto più posizioni possibili."

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

Grazie per il suggerimento, mi sento molto più a mio agio nell'usare CLGeoCoder al posto dell'approccio di Google Maps di "terze parti"! – Raffael

Problemi correlati