2015-05-26 11 views
8

Desidero consentire agli utenti di cercare il nome di una via e visualizzare i risultati in UITableView. Per il momento la regione non è importante, può provenire da qualsiasi regione.Objective-C - Ricerca di strade in base alla query immessa dall'utente

Non ho trovato nessun esempio pertinente nelle mie ricerche e non so se dovrei usare CLLocation o MKLocalSearch.

Sulla base di documenti, dovrei usare MKLocalSearch:

Anche se la ricerca locale e geocodifica sono simili, supportano diversi casi d'uso. Utilizzare la geocodifica quando si desidera convertire tra le coordinate della mappa e un indirizzo strutturato, ad esempio l'indirizzo della Rubrica . Utilizzare la ricerca locale quando si desidera trovare un set di posizioni corrispondenti all'ingresso dell'utente.

Ma ho provato entrambi i metodi e mi dà solo 1 risultato (anche-se c'è restituito un NSArray

Questo è l'approccio CLGeocoder:.

CLGeocoder *geocoding = [[CLGeocoder alloc] init]; 
[geocoding geocodeAddressString:theTextField.text completionHandler:^(NSArray *placemarks, NSError *error) { 
    if (error) { 
     NSLog(@"%@", error); 
    } else { 
     NSLog(@"%i", [placemarks count]); 
     for(CLPlacemark *myStr in placemarks) { 
      NSLog(@"%@", myStr); 
    } 
    } 
}]; 

E questo è il mio MKLocalSearch provare:

MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc] init]; 
request.naturalLanguageQuery = theTextField.text; 
request.region = self.region; 

localSearch = [[MKLocalSearch alloc] initWithRequest:request]; 

[localSearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error){ 

    if (error != nil) { 
     [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Map Error",nil) 
            message:[error localizedDescription] 
            delegate:nil 
          cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil] show]; 
     return; 
    } 

    if ([response.mapItems count] == 0) { 
     [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"No Results",nil) 
            message:nil 
            delegate:nil 
          cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil] show]; 
     return; 
    } 
    self.streets = response; 
    [self.streetsTableView reloadData]; 
}]; 

MKLocalSearch sembra tornare più di 1 risposta in alcuni casi, ma questi sono legati alla pla ces non ricerche di nomi di strade.

Grazie in anticipo.

+0

hai provato a impostare la regione su zero? o puoi condividere più dettagli sulla tua self.region? –

+0

Ho un MapView e sto usando MapView.region come self.region – CristiC

+0

dalla mia esperienza MKLocalSearch è molto primitivo. Ti opporresti all'utilizzo dell'API di Google Places per qualsiasi motivo? –

risposta

4

Questo è il più vicino ho potuto ottenere. Ciò comporta l'utilizzo di google places API Web Service.

Nota: Probabilmente potresti utilizzare le API di Google Maps, ecc. Sono certo che ci sono altri modi per ottenere queste informazioni dalle varie API di Google.

NSURL *googlePlacesURL = [NSURL URLWithString:[NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/place/autocomplete/json?input=%@&location=%f,%f&sensor=true&key=API_KEY", formattedSearchText, location.coordinate.latitude, 
                location.coordinate.longitude]]; 

La risposta è un oggetto JSON. Convertilo in un dizionario.

NSDictionary *response = [NSJSONSerialization JSONObjectWithData:_googlePlacesResponse 
                    options:NSJSONReadingMutableContainers error:&error]; 

if([[response objectForKey:@"status"] isEqualToString:@"OK"]) 
{ 
    NSArray *predictions = [response objectForKey:@"predictions"]; 
    for(NSDictionary *prediction in predictions) 
    { 
     NSArray *addressTypes = [prediction objectForKey:@"types"]; 
     if([addressTypes containsObject:@"route"]) 
     { 
      //This search result contains a street name. 
      //Now get the street name. 
      NSArray *terms = [prediction objectForKey:@"terms"]; 
      NSDictionary *streetNameKeyValuePair = [terms objectAtIndex:0]; 
      NSLog(@"%@",[streetNameKeyValuePair [email protected]"value"]); 
     } 
    } 
} 

L'eventuale types sembrano essere

  • percorso -> Nome Via
  • Località -> nome della città/luogo
  • politico -> Stato, ecc
  • Geocode -> lat/long disponibili
  • È possibile popolare la vista tabella con quelli predictions che SOLO co numero route come tipo di indirizzo. Questo potrebbe funzionare.

    +1

    Sì, è così. Ho fatto lo stesso, prima di leggere la tua risposta :). Questo mi ha aiutato: http://stackoverflow.com/a/25318167/347807 – CristiC

    2

    CLGeocoder restituisce semplicemente il formato dell'indirizzo. Slap questo nel codice e giocare con i contenuti della mapitems

    MKLocalSearchRequest *request = [MKLocalSearchRequest new]; 
    request.naturalLanguageQuery = @"Pizza"; 
    request.region = MKCoordinateRegionMake(location.coordinate, MKCoordinateSpanMake(.01, .01)); 
    MKLocalSearch *search = [[MKLocalSearch alloc]initWithRequest:request]; 
    [search startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) { 
        NSArray *mapItems = response.mapItems; 
        for (MKMapItem *mapItem in mapItems) { 
         MKPointAnnotation *point = [MKPointAnnotation new]; 
         point.coordinate = mapItem.placemark.coordinate;` 
        } 
    }]; 
    
    +0

    Il problema con questo codice è che restituisce luoghi, non strade. .. – CristiC

    1

    la matrice restituita contiene mapItems, è possibile iterare l'array a tirare fuori tutte le mapItems come questo:

    myMatchingItems = [[NSMutableArray alloc] init]; 
    for (MKMapItem *item in response.mapItems){ 
            [myMatchingItems addObject:item]; 
        } 
    

    Ogni mapItem.placemark.thoroughfare contiene la Via del luogo che è stato trovato.