ios - 将坐标转换为城市名称?

标签 ios swift mapkit clgeocoder clplacemark

如何使用 MapKit 从坐标获取地址?

我在 map 上长按它获取坐标时有这段代码:

func didLongPressMap(sender: UILongPressGestureRecognizer) {

    if sender.state == UIGestureRecognizerState.Began {
        let touchPoint = sender.locationInView(self.mapView)
        let touchCoordinate = self.mapView.convertPoint(touchPoint, toCoordinateFromView: self.mapView)
        var annotation = MKPointAnnotation()
        annotation.coordinate = touchCoordinate
        annotation.title = "Your position"
        self.mapView.addAnnotation(annotation) //drops the pin
        println("lat:  \(touchCoordinate.latitude)")
        var num = (touchCoordinate.latitude as NSNumber).floatValue
        var formatter = NSNumberFormatter()
        formatter.maximumFractionDigits = 4
        formatter.minimumFractionDigits = 4
        var str = formatter.stringFromNumber(num)
        println("long: \(touchCoordinate.longitude)")
        var num1 = (touchCoordinate.longitude as NSNumber).floatValue
        var formatter1 = NSNumberFormatter()
        formatter1.maximumFractionDigits = 4
        formatter1.minimumFractionDigits = 4
        var str1 = formatter1.stringFromNumber(num1)
        self.adressLoLa.text = "\(num),\(num1)"
                }
}

我想在 annotation.title 中打印完整地址(街道、城市、邮政编码、国家/地区)。

最佳答案


SWIFT 4.2:编辑


MapKit 框架确实提供了一种从坐标获取地址详细信息的方法。

您需要使用 map 工具包的反向地理编码CLGeocoder 类用于从地址获取位置和从位置(坐标)获取地址。 reverseGeocodeLocation 方法将从坐标返回地址详细信息。

该方法接受CLLocation作为参数,返回包含地址字典的CLPlacemark

所以现在上面的方法将更新为:

@objc func didLongPressMap(sender: UILongPressGestureRecognizer) {

    if sender.state == UIGestureRecognizer.State.began {
        let touchPoint = sender.location(in: mapView)
        let touchCoordinate = mapView.convert(touchPoint, toCoordinateFrom: self.mapView)
        let annotation = MKPointAnnotation()
        annotation.coordinate = touchCoordinate
        annotation.title = "Your position"
        mapView.addAnnotation(annotation) //drops the pin
        print("lat:  \(touchCoordinate.latitude)")
        let num = touchCoordinate.latitude as NSNumber
        let formatter = NumberFormatter()
        formatter.maximumFractionDigits = 4
        formatter.minimumFractionDigits = 4
        _ = formatter.string(from: num)
        print("long: \(touchCoordinate.longitude)")
        let num1 = touchCoordinate.longitude as NSNumber
        let formatter1 = NumberFormatter()
        formatter1.maximumFractionDigits = 4
        formatter1.minimumFractionDigits = 4
        _ = formatter1.string(from: num1)
        self.adressLoLa.text = "\(num),\(num1)"

        // Add below code to get address for touch coordinates.
        let geoCoder = CLGeocoder()
        let location = CLLocation(latitude: touchCoordinate.latitude, longitude: touchCoordinate.longitude)
        geoCoder.reverseGeocodeLocation(location, completionHandler:
            {
                placemarks, error -> Void in

                // Place details
                guard let placeMark = placemarks?.first else { return }

                // Location name
                if let locationName = placeMark.location {
                    print(locationName)
                }
                // Street address
                if let street = placeMark.thoroughfare {
                    print(street)
                }
                // City
                if let city = placeMark.subAdministrativeArea {
                    print(city)
                }
                // Zip code
                if let zip = placeMark.isoCountryCode {
                    print(zip)
                }
                // Country
                if let country = placeMark.country {
                    print(country)
                }
        })
    }
}

关于ios - 将坐标转换为城市名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27735835/

相关文章:

ios - autoresize = RM+BM 是什么意思?

linux - 在 Linux 上构建 Swift SourceKit

swift - 如何使枚举中的变异函数具有不同的返回值

iphone - 通过标签栏访问 MKMapView

ios - 是否有可能永久访问从 DocumentPicker 导入的文件?

ios - 存储在 FireBase 存储中的 ImageURL 未存储在 FireBase 数据库中

ios - 我怎样才能得到一个只在下一个 View 中计算的值?

iphone - MapKit 无法在设备上运行,但可以在模拟器中运行

ios - 检查用户是否连接到 wifi 或蜂窝网络

ios - 在 UIScrollView 中滚动期间启用 UITableView 滚动