2017-12-03 113 views
1

CurrentLocation之間畫一條路線,以SearchedLocation中的MKMapView我需要的當前位置作爲源和搜索的位置作爲目標,但我得到了當前的位置,但在這裏我無法從帶座標(經度和緯度)搜索位置到目的地。 這裏我的目的地顯示零爲什麼? 下面是代碼請幫助我。如何斯威夫特

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() FUNC在searchBarSearchButtonClicked卻是越來越來這裏之前爲什麼叫?

+0

對於上述代碼的任何建議.. – Swift

回答

0

方向請求是異步執行的。這意味着您的其他應用程序不會等待提取方向。

您的showDirection函數既獲取方向並將其添加到mapView。最好將這些功能分開。你可以獲取方向,更新一個路線變量,並有一個觀察者,一旦它被提取,它將把路線添加到地圖上。

@IBOutlet weak var mapView: MKMapView! 

var route: MKRoute? { 
didSet { 
    mapView.add((route?.polyline)!, level:.aboveRoads) } 
}