我正在尝试编写一个简单的方法,该方法已馈入CLLocationDegrees
并返回CLPlacemark
。查看Apple的文档,这似乎很简单。
以下是我丢到操场上的东西:
import CoreLocation
// this is necessary for async code in a playground
import PlaygroundSupport
// this is necessary for async code in a playground
PlaygroundPage.current.needsIndefiniteExecution = true
func geocode(latitude: CLLocationDegrees, longitude: CLLocationDegrees) -> CLPlacemark? {
let location = CLLocation(latitude: latitude, longitude: longitude)
let geocoder = CLGeocoder()
var placemark: CLPlacemark?
geocoder.reverseGeocodeLocation(location) { (placemarks, error) in
if error != nil {
print("something went horribly wrong")
}
if let placemarks = placemarks {
placemark = placemarks.first
}
}
return placemark
}
let myPlacemark = geocode(latitude: 37.3318, longitude: 122.0312)
就目前而言,我的方法返回nil。我不确定我的错误在哪里,但是我可以放心,这对我来说是愚蠢的。感谢您的阅读。
import UIKit
import CoreLocation
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
func geocode(latitude: Double, longitude: Double, completion: @escaping (_ placemark: [CLPlacemark]?, _ error: Error?) -> Void) {
CLGeocoder().reverseGeocodeLocation(CLLocation(latitude: latitude, longitude: longitude)) { placemark, error in
guard let placemark = placemark, error == nil else {
completion(nil, error)
return
}
completion(placemark, nil)
}
}
或者简单地:
func geocode(latitude: Double, longitude: Double, completion: @escaping (_ placemark: [CLPlacemark]?, _ error: Error?) -> Void) {
CLGeocoder().reverseGeocodeLocation(CLLocation(latitude: latitude, longitude: longitude), completionHandler: completion)
}
或扩展CLLocation:
extension CLLocation {
func geocode(completion: @escaping (_ placemark: [CLPlacemark]?, _ error: Error?) -> Void) {
CLGeocoder().reverseGeocodeLocation(self, completionHandler: completion)
}
}
要将地标格式化为邮寄地址,可以使用“联系人”框架CNPostalAddressFormatter
:
import Contacts
extension Formatter {
static let mailingAddress: CNPostalAddressFormatter = {
let formatter = CNPostalAddressFormatter()
formatter.style = .mailingAddress
return formatter
}()
}
extension CLPlacemark {
var mailingAddress: String? {
return postalAddress?.mailingAddress
}
}
extension CNPostalAddress {
var mailingAddress: String {
return Formatter.mailingAddress.string(from: self)
}
}
地标
包含CLPlacemark对象的数组。对于大多数地理编码请求,此数组应仅包含一个条目。但是,在无法将指定地址解析到单个位置的情况下,前向地理编码请求可能会返回多个地标html" target="_blank">对象。如果请求被取消或获取地标信息时出错,则此参数为nil。
有关CLPlacemark属性的更多信息,可以检查此CLPlacemark
用法:
let location = CLLocation(latitude: -22.963451, longitude: -43.198242)
location.geocode { placemark, error in
if let error = error as? CLError {
print("CLError:", error)
return
} else if let placemark = placemark?.first {
// you should always update your UI in the main thread
DispatchQueue.main.async {
// update UI here
print("name:", placemark.name ?? "unknown")
print("address1:", placemark.thoroughfare ?? "unknown")
print("address2:", placemark.subThoroughfare ?? "unknown")
print("neighborhood:", placemark.subLocality ?? "unknown")
print("city:", placemark.locality ?? "unknown")
print("state:", placemark.administrativeArea ?? "unknown")
print("subAdministrativeArea:", placemark.subAdministrativeArea ?? "unknown")
print("zip code:", placemark.postalCode ?? "unknown")
print("country:", placemark.country ?? "unknown", terminator: "\n\n")
print("isoCountryCode:", placemark.isoCountryCode ?? "unknown")
print("region identifier:", placemark.region?.identifier ?? "unknown")
print("timezone:", placemark.timeZone ?? "unknown", terminator:"\n\n")
// Mailind Address
print(placemark.mailingAddress ?? "unknown")
}
}
}
这将打印
name: Morro da Saudade
address1: Rua Casuarina
address2: 597
neighborhood: Lagoa
city: Rio de Janeiro
state: RJ
subAdministrativeArea: unknown
zip code: 22011-040
country: Brazil
isoCountryCode: BR
region identifier: <-22.96345100,-43.19824200> radius 141.83
timezone: America/Sao_Paulo (current)
Rua Casuarina,597
拉哥亚
里约热内卢
22011-040
巴西
问题内容: 关闭。 这个问题不能重现,或者是由错别字引起的。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 5年前关闭。 改善这个问题 我输入的是纬度和经度。我需要使用swift 的功能,以便向我提供位置信息的输出。我尝试使用的代码是 在我得到的日志中 似乎该函数正在失败,然后导致该函数中的致命错误。我是否在某处修改了格式? 问题答案: 您永远不会
例如,我访问了APIhttps://nominatim.openstreetmap.org/reverse?format=json&lat=24.9128455&lon=67.002839&zoom=18&addressdetails=1 没有显示address29字段,但当我点击此url时 http://nominatim.openstreetmap.org/reverse?format=jso
问题内容: 我正在开发其中要求之一是能够基于GPS数据执行实时反向地理编码操作的应用程序。特别是,我必须能够确定纬度,经度对映射到的州/省,并检测何时从一个州/省迁移到另一个州/省。 到目前为止,我有两个想法,但想知道是否有人对以下两个方面有任何想法: 有效解决此问题的最佳方法是什么? 在哪里可以找到一个好地方,北美州/省边界的合适格式是什么 首先,这是我的两个主要想法: 将北美分成一个网格,网格
我试图在HMS(Huawei Mobile Services)设备上使用对lat/long坐标进行地理编码,但结果总是得到一个空列表。 为了验证这实际上应该起作用,我检查了,它返回。 如何在HMS设备上使用对lat/long进行地理编码?哪些配置/设置是必要的,以避免达到这个限制? 我已经看到了使用位置/站点工具包的解决方案,但如果可能的话,我更喜欢使用“普通”的Android API。
问题内容: 我正在尝试从Google json获取$ street,$ city和$ country字符串。它适用于我的家庭住址:http : //maps.googleapis.com/maps/api/geocode/json?latlng=52.108662,6.307370&sensor=true 但是,对于像这样的示例中数组中包含更多数据的其他地址:http : //maps.googl
什么是反向代理 反向代理(Reverse Proxy)方式是指用代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。 举个例子,一个用户访问 http://www.example.com/readme,但是 www.example.com 上并不存在