2009-02-16 7 views
14

Aggiornamento: iPhone SDk 3.0 ora affronta la domanda qui, tuttavia l'NDA impedisce una discussione approfondita. Accedi a iPhone Dev Center se hai bisogno di maggiori informazioni.Integrare l'API di Google Maps in un'app per iPhone

Ok, devo ammettere che sono un po 'perso qui.

Sono abbastanza a mio agio con Cocoa, ma sto avendo problemi a raccogliere il bit di javascript necessario per risolvere questo problema.

Sto tentando di inviare una richiesta a Google per un codice geografico inverso.

Ho preso visione della documentazione di Google che ho visto qui: http://code.google.com/apis/maps/documentation/index.html http://code.google.com/apis/maps/documentation/geocoding/

Anche dopo una lettura approssimativa, mi manca un concetto di base:

Come faccio a parlare con Google? In alcuni esempi, mostrano un URL inviato a google (che sembra abbastanza facile), ma in altri mostrano javascript. Sembra che per il geocoding inverso, la richiesta potrebbe essere più difficile rispetto all'invio dell'URL con alcuni parametri (ma spero di sbagliarmi).

Qualcuno può indicarmi il modo corretto di fare una richiesta? (Nell'obiettivo-C, così posso girarci intorno)

risposta

9

UPDATE - iPhone 0.3 include MapKit, che si spera sia significativamente più veloce dell'utilizzo dell'API JS. Il blurb dice che includerà il geocoding inverso.

Non è possibile effettuare una richiesta direttamente in obiettivo-C, almeno non entro i termini dell'API di Google. L'API di Google è scritta in Javascript. È possibile utilizzare un bridge da obiettiva-c a JS, come fa lo Google Maps Component, ma questo non risolve il problema: si effettuano ancora chiamate JS!

Sfortunatamente, questo significa che a) è necessario utilizzare un WebView b) necessità di utilizzare l'API JS che è lento ... confrontare con l'applicazione Google Maps, che utilizza un protocollo completamente diverso OTA (provare packet sniffing esso).

Il componente Google Maps è, tuttavia, un utile tutorial su come effettuare chiamate semplici all'API.

+0

Grazie, sembrava come se fosse una cosa del genere noioso che. Conferma le mie paure, poiché desidero solo invertire geocodificare un indirizzo. Sembra che sarebbe banale –

3

Il modo più semplice per ottenere una mappa di Google utilizzando Cocoa è utilizzare "l'API di mappe statiche". In pratica, devi preparare un NSURL che usi per contattare Google. Ritirerai la tua mappa come NSData, che trasformerai in NSImage. Si noti che è possibile eseguire sia la geocodifica che il geocoding inverso. Puoi anche incorporare i marcatori sulla mappa. Tuttavia, perdi tutti i controlli a cui hai accesso se usi la loro API JavaScript.

Date un'occhiata alla loro guida di riferimento qui:

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

1

Per vostra informazione: Il geocodifica inversa API da parte di Google per le richieste di XML non è pubblico, quindi è illegale usare. L'unico modo legale è passare attraverso la loro JavaScript-API, che come hai scoperto è più difficile da fare in Cocoa che semplicemente inviare una richiesta HTTP.

Alternative: il geocoding inverso con semplici richieste XML/JSON è disponibile anche da Geonames o Yahoo.

0

In realtà, non intendevo il georeferenziamento inverso come "tradurre un punto in un indirizzo leggibile dall'uomo", ma piuttosto visualizzare un punto utilizzando una mappa di Google (che può anche, a seconda del livello di precisione, mostrare una lettura leggibile dall'uomo indirizzo). Questa è la funzionalità di base che è stata richiesta.

In pratica, volevo solo suggerire l'API mappe statiche come un modo pulito e veloce per:

1) date le coordinate ottenute dal sensore GPS iPhone, recuperare una mappa di Google che mostra il punto di

2) dato un indirizzo, trasformarlo nelle corrispondenti coordinate geografiche e quindi utilizzare le coordinate per recuperare una mappa di Google che mostra l'indirizzo indicato

Entrambi sono possibili utilizzando NSURLs semplici che coinvolgono lo staticmap e servizi geo

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

passando ovviamente i parametri necessari per fornire una stringa di query adeguata.

Cordiali saluti

2

Ora che Apple ha rilasciare le API MapKit per OS 3.0, penso che la tua domanda è stato risposto. Dopo aver esaminato i documenti API, posso vedere un gran potenziale! Mi piacerebbe ancora vedere il webservice di geocoding inverso da Google, ma Yahoo lo farà nel frattempo.

0

Il grosso problema, naturalmente, è che il contratto di licenza di google e yahoo afferma che non è possibile utilizzare queste API in "applicazioni commerciali". odieresti pubblicare un'app sull'app store solo per averla smontata e citata da yahoo o google. Nella lettura dell'API della mappa dell'iPhone 3.0 e della licenza associata questo non è menzionato ma se si desidera che un'applicazione venga eseguita sui telefoni non aggiornati ....

C'è una risposta per questo che non ne avrà uno in difficoltà?

4

ho creato SVGeocoder, un semplice avanti e classe di geocoding inverso per iOS. Utilizza l'API di Google Geocoding, restituisce oggetti SVPlacemark (una sottoclasse MKPlacemark con una proprietà coordinate) e utilizza i blocchi.

Questo è come si geocode una stringa indirizzo:

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

È inoltre possibile invertire geocode una coordinata come questo:

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

Apprezzo lo "SVGocoder" che hai creato. Funziona bene tranne sei avvisi blu dopo l'analisi. Tre avvisi blu in "SVGeocoder.m ": 1) Perdita potenziale di un oggetto allocato sulla linea 135: self.request = ... 2) Perdita potenziale di un oggetto allocato sulla linea 211: self.responseData = ... 3) Perdita potenziale di un oggetto allocato sulla linea 214: self.connection = ... E tre avvisi blu in "JSONKit.m", 1) Codice morto sulla linea 744: anObject = [an Oggetto conservare]; 2) Codice morto sulla linea 791: anObject = [anObject retain]; 3) Errore logico sulla riga 865: encodeState-> serializeOptionFlags = optionFlags; –

+0

La mia versione xcode è 4.2 –

+0

Dovresti postare quel tipo di cose su GitHub, non in un commento SO. – samvermette

1

Dal iOS5 abbiamo le seguenti opzioni come indicato nel documento di sviluppo : * "Un oggetto geocoder utilizza un servizio di rete per convertire tra valori di latitudine e longitudine e un segnaposto di facile utilizzo, che è una raccolta di dati come le informazioni su strada, città, stato e paese.Il geocoding inverso è il processo di conversione di latitudine e longitudine in un segnaposto. La geocoding in avanti è il processo di conversione delle informazioni sul nome del luogo in un valore di latitudine e longitudine. geocodifica inversa è supportata in tutte le versioni di iOS, ma geocoding in avanti è supportata solo in iOS 5.0 e versioni successive. "*

è ora possibile utilizzare un oggetto CLGeocoder.