使用MapView从一个位置到另一个位置的方向

问题描述 投票:0回答:1

[MapView Image with 2 Textfields如何使用MapView快速绘制从一个位置到在UITextfield中输入的另一个位置的路线/路线?用户应在源文本字段中输入一个位置,在目标文本字段中输入一个位置。通过代码,我们应该能够获取这些位置的坐标,并在按下按钮时创建从源到目的地的方向/路线。我是新手,所以我还不适合为此工作。我将不胜感激。谢谢

uitextfield mkmapview swift4.2 mkdirection
1个回答
0
投票

基本思想是获取“从”和“到”文本字段的坐标,然后为其计算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
    }
}

enter image description here

显然还有很多(在UI中显示错误消息,处理地理编码请求或路线请求返回多个结果的情况,在所有搜索/计算都在进行时显示UIActivityIndicatorView等),但是这说明了如何在地图上计算和显示方向的一些基本运动部分。

© www.soinside.com 2019 - 2024. All rights reserved.