2015-03-09 3 views
1

Я пытаюсь выяснить, как получить адрес улицы для MKPlacemark. Я печатаю элемент на консоли, и я вижу информацию там, но я получаю только информацию о thoroughfare без номера уличного адреса.Как получить адрес MKPlacemark для выноски

Вот мой код:

- (void)performSearch { 
    MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc]init]; 
    request.naturalLanguageQuery = _searchText.text; 
    request.region = _mapView.region; 

    _matchingItems = [[NSMutableArray alloc]init]; 

    MKLocalSearch *search = [[MKLocalSearch alloc]initWithRequest:request]; 
    NSLog(@"MKLocalSearch array created"); 

    [search startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) { 
     if (response.mapItems.count == 0) { 
      NSLog(@"No Matches Found"); 
     } else { 
      for (MKMapItem *item in response.mapItems) { 
       [_matchingItems addObject:item]; 
       MKPointAnnotation *annotation = [[MKPointAnnotation alloc]init]; 
       annotation.coordinate = item.placemark.coordinate; 

       // Pull out address info from MKMapItem 
       MKPlacemark *placemark = item.placemark; 
       NSLog(@"Placemark info: %@", item.placemark); 
       // Address details 
       NSDictionary *address = placemark.addressDictionary; 
       NSString *titleString = @""; 
       NSString *subtitleString = @""; 
       NSString *name = @""; 
       NSString *thoroughfare = @""; 
       NSString *state = @""; 
       NSString *city = @""; 
       NSString *country = @""; 

       name = [address objectForKey:@"Name"] ? [address objectForKey:@"Name"] : @""; 
       thoroughfare = [address objectForKey:@"Thoroughfare"] ? [address objectForKey:@"Thoroughfare"] : @""; 
       state = [address objectForKey:@"State"] ? [address objectForKey:@"State"] : @""; 
       city = [address objectForKey:@"City"] ? [address objectForKey:@"City"] : @""; 
       country = [address objectForKey:@"Country"] ? [address objectForKey:@"Country"] : @""; 

       titleString = [NSString stringWithFormat:@"%@ %@", name, thoroughfare]; 
       subtitleString = [NSString stringWithFormat:@"%@ %@ %@ %@", thoroughfare, state, city, country]; 

       // Strings for annotation 
       annotation.title = item.name; 
       annotation.subtitle = subtitleString; 

       [_mapView addAnnotation:annotation]; 
      } 
     } 
    }]; 
} 
+1

MKPlacemark подкласс CLPlacemark. CLPlacemark имеет удобные свойства, определенные для каждого элемента адреса (поэтому вам не нужно напрямую обращаться к словарю с помощью имен ключей). Улица № должна быть в методе mark.subThoroughfare. Но не все элементы адреса гарантированы. – Anna

+0

Спасибо! Если вы ответите, я отвечу вам. – Adrian

ответ

1

MKPlacemark подкласс CLPlacemark.

CLPlacemark имеет удобные свойства, определенные для каждого элемента адреса, поэтому вам не нужно обращаться к словарю напрямую с помощью имен ключей. (Если вы хотите получить доступ к прямому словарю, попробуйте использовать предварительно определенный ABPerson Address Property key name constants documented here.)

Используя удобный доступ к объекту, номер улицы должен быть в placemark.subThoroughfare.

Обратите внимание, что не все элементы адреса должны быть установлены в зависимости от точности данных координат и страны.

1

Вы можете найти адрес, как это:

 geocoder.reverseGeocodeLocation(location, completionHandler: {(placemarks, error)->Void in 
     var placemark:CLPlacemark! 

     if error == nil && placemarks!.count > 0 { 
      placemark = placemarks![0] as CLPlacemark 


      var addressString : String = "" 
      if placemark.ISOcountryCode == "TW" /*Address Format in Chinese*/ { 
       if placemark.country != nil { 
        addressString = placemark.country! 
       } 
       if placemark.subAdministrativeArea != nil { 
        addressString = addressString + placemark.subAdministrativeArea! + ", " 
       } 
       if placemark.postalCode != nil { 
        addressString = addressString + placemark.postalCode! + " " 
       } 
       if placemark.locality != nil { 
        addressString = addressString + placemark.locality! 
       } 
       if placemark.thoroughfare != nil { 
        addressString = addressString + placemark.thoroughfare! 
       } 
       if placemark.subThoroughfare != nil { 
        addressString = addressString + placemark.subThoroughfare! 
       } 
      } else { 
       if placemark.subThoroughfare != nil { 
        addressString = placemark.subThoroughfare! + " " 
       } 
       if placemark.thoroughfare != nil { 
        addressString = addressString + placemark.thoroughfare! + ", " 
       } 
       if placemark.postalCode != nil { 
        addressString = addressString + placemark.postalCode! + " " 
       } 
       if placemark.locality != nil { 
        addressString = addressString + placemark.locality! + ", " 
       } 
       if placemark.administrativeArea != nil { 
        addressString = addressString + placemark.administrativeArea! + " " 
       } 
       if placemark.country != nil { 
        addressString = addressString + placemark.country! 
       } 

       print (placemark.postalCode) 

       let new_placemark: MKPlacemark = MKPlacemark (placemark: placemark) 

      print(placemark.description)  

      } 


     } 
    }) 
Смежные вопросы