2016-06-30 8 views
1

Ich baue eine kleine App für mich selbst - im Moment hat es eine Funktion namens performSearch, die eine Suche in Ihrem lokalen Bereich durchführt von allen in der Nähe befindlichen Kaffees, Fitnessstudios und Restaurants fallen dann an jedem dieser Orte Stifte. Ich bin jedoch verwirrt, wie ich die Anmerkung erhalten kann, um den Namen des Ortes anzuzeigen, der auf der tatsächlichen Kartenansicht gezeigt wird. Hat jemand Erfahrung?iOS Reverse-Geocodierung (NAME eines Ortes aus seinen Koordinaten, nicht nur die Adresse)

Grundsätzlich stattdessen die Adresse der Anzeige nur, möchte ich die Anmerkung sagen: „Starbucks Adresse ...“

Beispielcode:

Dies macht eine Suche mit jedem Suchfeld gegeben und fällt Pins auf ein Kartenansicht aller Orte in dem angegebenen Gebiet mit diesem Suchfeld.

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.") 
      } 
     } 
    }) 
} 

Antwort

0

Zuerst reverseGeocodeLocation läuft asynchron, so müssten Sie Abschluss-Handler-Muster verwenden.

Aber zweitens ist die umgekehrte Geocodierung unnötig, da die item in der response.mapItems eine name Eigenschaft hat. So nutzen Sie das als Titel Ihrer Anmerkung.

Zum Beispiel:

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) 
     } 
    } 
}