使用 MapView 从 swift 中的一个位置到另一个位置的路线
Directions from one location to another in swift using MapView
MapView Image with 2 Textfields如何使用 swift 中的 MapView 将 directions/route 从一个位置绘制到另一个在 UITextfield 中输入的位置?
用户应在源文本字段中输入一个位置,在目标文本字段中输入一个位置。通过代码,我们应该能够获取这些位置的坐标,并且当按下按钮时,应该从源到目标创建一个 direction/route。
我是 swift 的新手,所以我还没有办法处理这个问题。我会感谢一些帮助。
谢谢
基本思路是获取“从”和“到”文本字段的坐标,然后计算 MKDirections
:
let geocoder = CLGeocoder()
func getDirections() {
guard
let from = fromTextField.text,
!from.isEmpty,
let to = toTextField.text,
!to.isEmpty
else {
print("need to and from locations")
return
}
geocoder.geocodeAddressString(from) { placemarks, error in
guard let fromPlacemark = placemarks?.first else {
print("from", error ?? "Unknown error")
return
}
self.geocoder.geocodeAddressString(to) { placemarks, error in
guard let toPlacemark = placemarks?.first else {
print("to", error ?? "Unknown error")
return
}
self.calculateDirections(from: fromPlacemark, to: toPlacemark)
}
}
}
现在,我使用 geocodeAddressString
,但如果您想将搜索限制在地图的当前可见部分,您可以使用 MKLocalSearch
。
要计算方向并将路线添加到地图:
func calculateDirections(from fromPlacemark: CLPlacemark, to toPlacemark: CLPlacemark) {
let request = MKDirections.Request()
request.source = MKMapItem(placemark: MKPlacemark(placemark: fromPlacemark))
request.destination = MKMapItem(placemark: MKPlacemark(placemark: toPlacemark))
MKDirections(request: request).calculate { response, error in
guard let route = response?.routes.first else {
print("route", error ?? "Unknown error")
return
}
self.mapView.addOverlay(route.polyline)
self.mapView.setVisibleMapRect(route.polyline.boundingMapRect, animated: true)
}
}
这显然假设您已经为地图视图指定了委托并实现了 mapView(_:rendererFor:)
:
extension ViewController: MKMapViewDelegate {
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
let renderer = MKPolylineRenderer(overlay: overlay)
renderer.lineWidth = 5
renderer.strokeColor = UIColor.blue.withAlphaComponent(0.5)
return renderer
}
}
显然还有很多其他内容(在 UI 中显示错误消息,处理地理编码请求或路线请求返回多个结果的情况,呈现 UIActivityIndicatorView
而所有这些 searching/calculating 正在发生,等等)但这说明了如何在地图上计算和显示方向的一些基本移动部分。
MapView Image with 2 Textfields如何使用 swift 中的 MapView 将 directions/route 从一个位置绘制到另一个在 UITextfield 中输入的位置? 用户应在源文本字段中输入一个位置,在目标文本字段中输入一个位置。通过代码,我们应该能够获取这些位置的坐标,并且当按下按钮时,应该从源到目标创建一个 direction/route。 我是 swift 的新手,所以我还没有办法处理这个问题。我会感谢一些帮助。 谢谢
基本思路是获取“从”和“到”文本字段的坐标,然后计算 MKDirections
:
let geocoder = CLGeocoder()
func getDirections() {
guard
let from = fromTextField.text,
!from.isEmpty,
let to = toTextField.text,
!to.isEmpty
else {
print("need to and from locations")
return
}
geocoder.geocodeAddressString(from) { placemarks, error in
guard let fromPlacemark = placemarks?.first else {
print("from", error ?? "Unknown error")
return
}
self.geocoder.geocodeAddressString(to) { placemarks, error in
guard let toPlacemark = placemarks?.first else {
print("to", error ?? "Unknown error")
return
}
self.calculateDirections(from: fromPlacemark, to: toPlacemark)
}
}
}
现在,我使用 geocodeAddressString
,但如果您想将搜索限制在地图的当前可见部分,您可以使用 MKLocalSearch
。
要计算方向并将路线添加到地图:
func calculateDirections(from fromPlacemark: CLPlacemark, to toPlacemark: CLPlacemark) {
let request = MKDirections.Request()
request.source = MKMapItem(placemark: MKPlacemark(placemark: fromPlacemark))
request.destination = MKMapItem(placemark: MKPlacemark(placemark: toPlacemark))
MKDirections(request: request).calculate { response, error in
guard let route = response?.routes.first else {
print("route", error ?? "Unknown error")
return
}
self.mapView.addOverlay(route.polyline)
self.mapView.setVisibleMapRect(route.polyline.boundingMapRect, animated: true)
}
}
这显然假设您已经为地图视图指定了委托并实现了 mapView(_:rendererFor:)
:
extension ViewController: MKMapViewDelegate {
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
let renderer = MKPolylineRenderer(overlay: overlay)
renderer.lineWidth = 5
renderer.strokeColor = UIColor.blue.withAlphaComponent(0.5)
return renderer
}
}
显然还有很多其他内容(在 UI 中显示错误消息,处理地理编码请求或路线请求返回多个结果的情况,呈现 UIActivityIndicatorView
而所有这些 searching/calculating 正在发生,等等)但这说明了如何在地图上计算和显示方向的一些基本移动部分。