Как нарисовать маршрут между CurrentLocation к SearchedLocation в MkMapView в Swift

Мне нужно текущее местоположение в качестве источника и поиск местоположения в качестве пункта назначения, но я получил текущее местоположение, но здесь я не могу перенести координаты (широту и долготу) из искомого местоположения в пункт назначения. здесь мой пункт назначения показывает ноль, почему? Ниже приведен код, пожалуйста, помогите мне.

import UIKit
import MapKit
import CoreLocation
class MapSampViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate, UISearchBarDelegate {


    //Privacy - Location When In Use Usage Description, Privacy - Location Always Usage Description-------these two add in info.plist


    @IBOutlet weak var searchBar: UISearchBar!
    @IBOutlet weak var mapView: MKMapView!

    var source: CLLocationCoordinate2D!
    var destination: CLLocationCoordinate2D!

    var myaddress:String!
    var mycity:String!
    var mystate:String!
    var mycountry:String!
    var mytitle:String!
    var mylongitude:String!
    var mylatitude:String!
    var locationtoSearch:String!
    let locationManager = CLLocationManager()

    var currentlocationPlacemark: CLPlacemark!

    override func viewDidLoad() {

        super.viewDidLoad()
        searchBar.delegate = self
        mapView.delegate = self
        mapView.showsScale = true
        mapView.showsPointsOfInterest = true
        mapView.showsUserLocation = true

        if CLLocationManager.locationServicesEnabled()
        {
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyBest
            locationManager.startUpdatingLocation()
        }
        // self.showDirection()
        }

    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {

        locationtoSearch = self.searchBar.text
        var geocoder:CLGeocoder = CLGeocoder()
        geocoder.geocodeAddressString(locationtoSearch!, completionHandler: {(placemarks, error) -> Void in
            if((error) != nil)
            {
            print("Error", error)
            }
            else if let placemark = placemarks?[0] as? CLPlacemark {

            var coordinates:CLLocationCoordinate2D = placemark.location!.coordinate
            var pointAnnotation:MKPointAnnotation = MKPointAnnotation()
                pointAnnotation.coordinate = coordinates
                print(coordinates)
              //  pointAnnotation.title = "\(String(describing: placemark.name)),\(String(describing: placemark.locality)), \(String(describing: placemark.administrativeArea)), \(String(describing: placemark.country))"

                self.myaddress = placemark.name

                self.mycity = placemark.locality

                self.mystate = placemark.administrativeArea

                self.mycountry = placemark.country

                pointAnnotation.title = "\(self.myaddress),\(self.mycity),\(self.mystate),\(self.mycountry)"

                self.mylongitude = String(stringInterpolationSegment: placemark.location?.coordinate.longitude)

                self.mylatitude = String(stringInterpolationSegment: placemark.location?.coordinate.latitude)

                self.mapView?.addAnnotation(pointAnnotation)

                self.mapView?.centerCoordinate = coordinates

                print("coordinates \(coordinates)")
                print("The latitude \(self.mylatitude)")
                print("The longitude \(self.mylongitude)")

              self.mapView?.selectAnnotation(pointAnnotation, animated: true)
            }
        })
        self.showDirection()//i called here or in view viewDidLoad
        let annotationsToRemove = mapView.annotations.filter { $0 !== self.mapView.userLocation

        }
        mapView.removeAnnotations( annotationsToRemove )
        }


       func showDirection()
       {
        source = locationManager.location?.coordinate//17.6881° N, 83.2131° E

       // let destination = CLLocationCoordinate2DMake(24.9511, 121.2358 )//If i give like this its working

        destination = CLLocationCoordinate2DMake(Double(mylongitude)!, Double(mylongitude)!)//fatal error: unexpectedly found nil while unwrapping an Optional value

        let sourcePlacemark = MKPlacemark(coordinate: source!)
        let destinationPlacemark = MKPlacemark(coordinate: destination)
        let sourceItem = MKMapItem(placemark: sourcePlacemark)
        let destinationItem = MKMapItem(placemark: destinationPlacemark)

        let directionReq = MKDirectionsRequest()
        directionReq.source = sourceItem
        directionReq.destination = destinationItem
        directionReq.transportType = .automobile

        let directions = MKDirections(request: directionReq)
        directions.calculate(completionHandler: {(response, error) in
            if error != nil {
                print("Error getting directions")
            }
            else {
                let route = response?.routes[0]
                self.mapView.add((route?.polyline)!, level:.aboveRoads)

                let rekt = route?.polyline.boundingMapRect
                self.mapView.setRegion(MKCoordinateRegionForMapRect(rekt!), animated: true)
                }
          })
      }

    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {

        let rendrer = MKPolylineRenderer(overlay: overlay)
        rendrer.strokeColor = UIColor.blue
        rendrer.lineWidth = 3
        return rendrer
     }
}

здесь я позвонил showDirection() Функ в searchBarSearchButtonClicked но это вызывается до приезда сюда, почему?

1 ответ

Запросы направления выполняются асинхронно. Это означает, что остальная часть вашего приложения не ждет получения направления.

Ваша функция showDirection одновременно выбирает направление и добавляет его в mapView. Было бы лучше отделить эти функции. Вы можете выбрать направление, обновить переменную маршрута и иметь наблюдателя, который добавит маршрут к карте после ее получения.

@IBOutlet weak var mapView: MKMapView!

var route: MKRoute? {
didSet {
    mapView.add((route?.polyline)!, level:.aboveRoads) }
}
Другие вопросы по тегам