2012-05-02 10 views
5

Qualsiasi sia l'indirizzo che fornisco al geocoder ([geocoder geocodeAddressString: completionHandler :), mette sempre un solo oggetto nell'array dei segnaposto.Come ottenere più segnaposto da CLGeocoder

C'è un modo per ottenere più risultati (come nell'app Maps) da cui l'utente può selezionarne uno?

risposta

1

Ho fatto un po 'di sniffing sui pacchetti e sembra che CLGeocoder non si colleghi al servizio di geocodifica di Google, ma a quello di Apple. Ho anche notato che ottengo solo un segnaposto da lì ogni volta.

Se si desidera qualcosa di più sofisticato, è necessario utilizzare Google o altre geocodifiche. Io uso SVGeocoder (https://github.com/samvermette/SVGeocoder), che ha un'API molto simile a CLGeocoder.

+0

abbiamo usato il Forward Geaocoder da http://blog.sallarp.com invece di SVGeocoder – johsem

+0

Perché accade questo? Da Apple Docs: in caso di richieste di geocoding in avanti, possono essere restituiti più oggetti segnaposto se le informazioni fornite hanno prodotto più posizioni possibili. – prince

+0

Suppongo che il servizio di geocodifica di Apple sia al momento abbastanza limitato. Mi aspetto che cambi presto. Puoi vedere che Apple si sta solo affrettando ad abbandonare la dipendenza da Google qui. –

9

Il servizio di geocoding nativo di Apple è fornito dallo MapKit framework. L'oggetto importante in questo framework è MKLocalSearch, che può geocodificare gli indirizzi e restituire più risultati.

MKLocalSearch restituisce 10 risultati in mapItems di tipo MKMapItem. Ogni MKMapItem contiene un oggetto MKPlacemark, che è una sottoclasse di CLPlacemark.

Ecco un esempio di utilizzo di MKLocalSearch MapKit:

MKLocalSearchRequest* request = [[MKLocalSearchRequest alloc] init]; 
request.naturalLanguageQuery = @"Calgary Tower"; 
request.region = MKCoordinateRegionMakeWithDistance(loc, kSearchMapBoundingBoxDistanceInMetres, kSearchMapBoundingBoxDistanceInMetres); 

MKLocalSearch* search = [[MKLocalSearch alloc] initWithRequest:request]; 
[search startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) { 
    yourArray = response.mapItems; // array of MKMapItems 
    // .. do you other logic here 
}]; 
Problemi correlati