2016-06-30 4 views
1

Я создаю небольшое маленькое приложение для себя - прямо сейчас у него есть функция, называемая performSearch, которая выполняет поиск в вашей локальной области из всех близлежащих кофейных мест, спортивных залов и ресторанов, затем бросает булавки в каждом из этих мест. Однако я смущен тем, как я могу получить аннотацию, чтобы отобразить имя местоположения, как показано на фактическом виде карты. У кого-нибудь есть опыт?iOS Обратное геокодирование (получение имени пользователя из его координат, а не только адреса)

В принципе, вместо того, чтобы отображать только адрес, я хочу аннотацию сказать «Старбакс Адреса ...» Код

Примера:

Это делает поиск с любым заданным полем поиска и каплями штырьков на отображение всех местоположений в данной области с этим полем поиска.

var matchingItems: [MKMapItem] = [MKMapItem]() 
@IBOutlet weak var map: MKMapView! 

func performSearch(searchField: String) { 

    matchingItems.removeAll() 

    //search request 
    let request = MKLocalSearchRequest() 
    request.naturalLanguageQuery = searchField 
    request.region = self.map.region 

    // process the request 
    let search = MKLocalSearch(request: request) 
    search.startWithCompletionHandler { response, error in 
     guard let response = response else { 
      print("There was an error searching for: \(request.naturalLanguageQuery) error: \(error)") 
      return 
     } 

     for item in response.mapItems { 
      // customize your annotations here, if you want 
      var annotation = item.placemark 
      self.reverseGeocoding(annotation.coordinate.latitude, longitude: allData.coordinate.longitude) 

      self.map.addAnnotation(annotation) 
      self.matchingItems.append(item) 
     } 

    } 
} 


func reverseGeocoding(latitude: CLLocationDegrees, longitude: CLLocationDegrees) { 
    let location = CLLocation(latitude: latitude, longitude: longitude) 
    CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placemarks, error) -> Void in 
     if error != nil { 
      print(error) 
      return 
     } 
     else if placemarks?.count > 0 { 
      let pm = placemarks![0] 
      let address = ABCreateStringWithAddressDictionary(pm.addressDictionary!, false) 
      print("\n\(address)") 
      if pm.areasOfInterest?.count > 0 { 
       let areaOfInterest = pm.areasOfInterest?[0] 
       print(areaOfInterest!) 
      } else { 
       print("No area of interest found.") 
      } 
     } 
    }) 
} 

ответ

0

Во-первых, reverseGeocodeLocation работает асинхронно, так что вам придется использовать завершающие шаблон обработчика.

Но, во-вторых, обратное геокодирование не требуется, поскольку item в response.mapItems имеет свойство name. Поэтому используйте это как название своей аннотации.

Например:

func performSearch(searchField: String) { 
    matchingItems.removeAll() 

    //search request 
    let request = MKLocalSearchRequest() 
    request.naturalLanguageQuery = searchField 
    request.region = map.region 

    // process the request 
    let search = MKLocalSearch(request: request) 
    search.startWithCompletionHandler { response, error in 
     guard let response = response else { 
      print("There was an error searching for: \(request.naturalLanguageQuery) error: \(error)") 
      return 
     } 

     for item in response.mapItems { 
      let annotation = MKPointAnnotation() 
      annotation.title = item.name 
      annotation.subtitle = item.placemark.title 
      annotation.coordinate = item.placemark.coordinate 
      self.map.addAnnotation(annotation) 
      self.matchingItems.append(item) 
     } 
    } 
}