2015-05-26 45 views
8

Chcę umożliwić użytkownikom wyszukanie nazwy ulicy i wyświetlenie wyników w widoku UITableView. Na razie region nie jest ważny, może pochodzić z dowolnego regionu.Objective-C - Wyszukiwanie ulic na podstawie wprowadzonego przez użytkownika zapytania

Nie mogłem znaleźć żadnego istotnego przykładu w moich wyszukiwaniach i nie wiem, czy powinienem użyć CLLocation lub MKLocalSearch.

podstawie Dokumentów, należy użyć MKLocalSearch:

Chociaż wyszukiwanie lokalne i geokodowanie są podobne, wspierają one różne przypadki użycia. Użyj geokodowania, aby przekonwertować między współrzędnymi mapy i adresem strukturalnym, takim jak adres książki adresowej Adres: . Użyj wyszukiwania lokalnego, jeśli chcesz znaleźć zestaw lokalizacji pasujących do danych wprowadzonych przez użytkownika.

Ale Próbowałem obu sposobów i to daje mi tylko 1 wynik (nawet chociaż istnieje NSArray powrócił

To podejście 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); 
    } 
    } 
}]; 

i to jest mój MKLocalSearch spróbować:

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 wydaje się powrót więcej niż 1 odpowiedź w niektórych przypadkach, ale są one związane z PLA nie szuka nazw ulic.

Z góry dziękuję.

+0

Czy próbowałeś ustawić region na zero? lub możesz udostępnić więcej szczegółów na temat self.region? –

+0

Mam MapView i używam MapView.region jako self.region – CristiC

+0

z mojego doświadczenia MKLocalSearch jest bardzo prymitywne. Czy byłbyś przeciwny używaniu interfejsu Google Places API z dowolnego powodu? –

Odpowiedz

4

To jest najbliżej mogę dostać. Obejmuje to użycie google places API Web Service.
Uwaga: Prawdopodobnie możesz użyć ich interfejsu Google Maps API itp. Jestem pewien, że istnieją inne sposoby na uzyskanie tych informacji z różnych interfejsów Google API.

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]]; 

Odpowiedź jest obiektem JSON. Przekonwertuj go do słownika.

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"]); 
     } 
    } 
} 

Ewentualny types wydają się być

  • Route -> nazwa
  • Miejscowość Ulica -> Nazwa miasta/lokalizacja
  • polityczna -> State itp
  • przetwarzania danych geograficznych -> lat/long dostępny
  • Można wypełnić widok tabeli tymi predictions, które TYLKO ntain route jako typ adresu. To może działać.

    +1

    Tak, właśnie tak. Zrobiłem to samo, zanim przeczytałem twoją odpowiedź :). Ten pomógł mi: http://stackoverflow.com/a/25318167/347807 – CristiC

    2

    CLGeocoder po prostu zwraca format adresu. Slap to w kodzie i bawić się z treścią 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

    Problem z tym kodem polega na tym, że zwraca on miejsca, a nie ulice. .. – CristiC

    1

    tablicy zwróconej zawiera mapItems można iteracyjne nad tablicy wyciągnąć wszystkie mapItems tak:

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

    Każdy mapItem.placemark.thoroughfare zawiera ulicy w miejscu, w którym został znaleziony.