使用 MapView 快速从一个位置到另一个位置的路线

Posted

技术标签:

【中文标题】使用 MapView 快速从一个位置到另一个位置的路线【英文标题】:Directions from one location to another in swift using MapView 【发布时间】:2020-06-08 03:23:16 【问题描述】:

MapView Image with 2 Textfields如何在 swift 中使用 MapView 绘制从一个位置到另一个在 UITextfield 中输入的方向/路线? 用户应在源文本字段中输入一个位置,在目标文本字段中输入一个位置。通过代码,我们应该能够获取这些位置的坐标,并且应该在按下按钮时创建从源到目的地的方向/路线。 我是 swift 新手,所以我还没有工作的情况。我会很感激一些帮助。 谢谢你

【问题讨论】:

【参考方案1】:

基本思想是获取“from”和“to”文本字段的坐标,然后为此计算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 等)但这说明了如何在地图上计算和显示方向的一些基本移动部分。

【讨论】:

以上是关于使用 MapView 快速从一个位置到另一个位置的路线的主要内容,如果未能解决你的问题,请参考以下文章

从 mapView 中检索当前用户位置,而地图不在屏幕上

侧菜单无法在 mapView 上快速正常工作

如何在 Android 的 MapView 中更新当前位置的蓝点标记

如何使用 phonegap 将文件从一个位置移动/复制到另一个位置

我想知道是不是使用(fs)我可以将文件夹从一个位置复制到另一个位置

当 mapView 请求用户权限时,使用 iOS 访问他们的位置