2017-02-27 3 views
4

Warum gibt CLGeocoder reverseGeocodeLocation eine Ortsmarke mit anderen Lat/Long zurück, wenn es nach Adresse sucht?CLGeocoder reverseGeocodeLocation gibt Ortsmarke mit anderem Breitengrad/Länge zurück? (Spielplatz Beispiel angefügt)

Hintergrund: In Bezug auf einen Benutzer "lange drücken" auf der Karte, um einen Pin fallen zu lassen, aber mein Code umgekehrt Geocoding dies in der Lage, einen Bereich Namen auf dem Pin, aber dann die PIN fällt in einem anderen Standort (dh keine gute Benutzererfahrung). Ich suche also nach einer Möglichkeit, den lat/long-Wert des tatsächlich ausgewählten Benutzers zu verwenden, aber suche dann einfach den Namen des Ortes nach.

Beispiel: Mit Code unten sehe ich:

  • Eingang: -28,7780218895614, 152,978574011267
  • OUTPUT: -28,864405, 153,0001191

Code:

import UIKit 
import CoreLocation 
import PlaygroundSupport 

// Initial Test Co-ordinate 
let locInput = CLLocation(latitude: -28.778021889561444, longitude: 152.97857401126666) 
print("Input: \(locInput.coordinate.latitude), \(locInput.coordinate.longitude)") 

// Initiate Reverse Geocoding 
let geocoder: CLGeocoder = CLGeocoder() 
print("About to call reverse geocoding function") 
geocoder.reverseGeocodeLocation(locInput) { placemarks, error in 
    guard let placemarks = placemarks else {fatalError("No Placemarks Provided \(error?.localizedDescription)")} 
    for p in placemarks { 
     print("OUTPUT: \(p.location!.coordinate.latitude), \(p.location!.coordinate.longitude)") 
    } 
} 

// Enable Asynch 
PlaygroundPage.current.needsIndefiniteExecution = true 
+0

PS. Oder ist der Ansatz in diesem Fall, die von reverseGeocodeLocation zurückgegebene Ortsmarkierung zu verwenden und die Lokalität, Unterlocation, Länderzeichenfolgen zu verwenden, aber NICHT deren Position/Koordinate, ABER stattdessen die Koordinate aus dem "langen Drücken" verwenden? – Greg

Antwort

1

Es ist ein richtiges Verhalten. Die Ortsmarkierung gibt den zugehörigen Standort zurück. Was offensichtlich von der Eingabe abweichen könnte. Wenn Sie dem Geocodierer einen Speicherort bereitstellen, "schließt" dieser die Ortsmarkierung ab, die Sie erhalten möchten.

Angenommen dies:

 
a: Associated location with the empire state building. 
b: Location you provided from an long press for instance. 

    ------- 
    |  | 
    | a | --> CLPlacemark: Empire state building, location: a 
    | b| 
    ------- 

Sie haben Recht in Ihren Annahmen. :)

Verwandte Themen