如何使用MapKit从坐标获取地址?
当在地图上长按时,我得到了以下代码:
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用完整的地址(街道,城市,邮政编码,国家)打印。
annotation.title
MapKit 框架确实提供了一种从坐标获取地址详细信息的方法。
MapKit
您需要使用地图套件的 反向地理编码 。CLGeocoder类用于从地址获取位置,并从位置(坐标)获取地址。该方法reverseGeocodeLocation将从坐标返回地址详细信息。
CLGeocoder
reverseGeocodeLocation
此方法接受CLLocation作为参数并返回CLPlacemark,其中包含地址字典。
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) } }) } }