CLGeocoder reverseGeocodeLocation 正在返回具有不同 lat/long 的地标? (附游乐场示例)
CLGeocoder reverseGeocodeLocation is returning placemark with different lat/long? (playground example attached)
为什么 CLGeocoder 在查找地址时会反转 GeocodeLocation return 具有不同 lat/long 的地标?
背景:就用户 "long pressing" 在地图上放置一个 pin 而言,但我的代码反向地理编码这能够在 Pin 上放置一个区域名称,但随后放置的 PIN 在不同的位置(即不好的用户体验)。所以我正在寻找一种方法来利用用户实际选择的 lat/long,但随后只需查找位置名称。
示例:使用下面的代码,我看到:
- 输入:-28.7780218895614、152.978574011267
- 输出:-28.864405、153.0001191
代码:
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
这是正确的行为。地标将 returns 它的关联位置。这显然可能与输入的不同。当您向地理编码器提供一个位置时,这个将 "infer" 您想要获取的地标。
假设这样:
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|
-------
你的假设是对的。 :)
为什么 CLGeocoder 在查找地址时会反转 GeocodeLocation return 具有不同 lat/long 的地标?
背景:就用户 "long pressing" 在地图上放置一个 pin 而言,但我的代码反向地理编码这能够在 Pin 上放置一个区域名称,但随后放置的 PIN 在不同的位置(即不好的用户体验)。所以我正在寻找一种方法来利用用户实际选择的 lat/long,但随后只需查找位置名称。
示例:使用下面的代码,我看到:
- 输入:-28.7780218895614、152.978574011267
- 输出:-28.864405、153.0001191
代码:
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
这是正确的行为。地标将 returns 它的关联位置。这显然可能与输入的不同。当您向地理编码器提供一个位置时,这个将 "infer" 您想要获取的地标。
假设这样:
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| -------
你的假设是对的。 :)