2016-11-05 56 views
9

Używam mapView.showUserLocation = true do wykreślenia położenia użytkownika i wyświetlania go jako adnotacji na moim obiekcie MKMapView.Jak obrysować Kierunki między dwoma lokalizacjami w iOS Swift przy użyciu mapView i CLLocationManager

Teraz, kiedy uzyskaliśmy lokalizację użytkowników, chcę wykreślić ścieżkę z tego zestawu coords do mojego przeznaczenia. Próbowałem za pomocą MKDirections tego

Oto jak starałem się to zrobić:

func mapView(mapView: MKMapView, didUpdateUserLocation userLocation: MKUserLocation) { 
    mapView.showsUserLocation = true 
    print("test") 
    //Setting Up Source Location 
    let sourceLocation = self.mapView.userLocation.coordinate 
    let sourcePlacemark = MKPlacemark(coordinate: sourceLocation, addressDictionary: nil) 
    let sourceMapItem = MKMapItem(placemark: sourcePlacemark) 
    let sourceAnnotation = MKPointAnnotation() 
    sourceAnnotation.title = "You are Here" 

    if let location = sourcePlacemark.location { 
     sourceAnnotation.coordinate = location.coordinate 
    } 

    //Setting Up Destination Location 
    let destinationLocation = CLLocationCoordinate2D(latitude: 28.6621292, longitude: 77.30198310000003) 
    let destinationPlacemark = MKPlacemark(coordinate: destinationLocation, addressDictionary: nil) 
    let destinationMapItem = MKMapItem(placemark: destinationPlacemark) 
    let destinationAnnotation = MKPointAnnotation() 
    destinationAnnotation.title = "Conclave is Here" 

    if let location = destinationPlacemark.location { 
     destinationAnnotation.coordinate = location.coordinate 
    } 


    self.mapView.removeAnnotations(self.mapView.annotations) 
    self.mapView.showAnnotations([sourceAnnotation,destinationAnnotation], animated: true) 


    //Plotting a course from Source to Destination 
    let directionRequest = MKDirectionsRequest() 
    directionRequest.source = sourceMapItem 
    directionRequest.destination = destinationMapItem 
    directionRequest.transportType = .Automobile 

    // Calculate the direction 
    let directions = MKDirections(request: directionRequest) 

    // 8. 
    directions.calculateDirectionsWithCompletionHandler { 
     (response, error) -> Void in 

     guard let response = response else { 
      if let error = error { 
       //print("Error: \(error)") 
      } 

      return 
     } 

     let route = response.routes[0] 
     self.mapView.addOverlay((route.polyline), level: MKOverlayLevel.AboveRoads) 

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

} 

Jednak gdy próbowałem debugowania go, pojawia się następujący błąd: Error: Error Domain=MKErrorDomain Code=5 "Directions Not Available" UserInfo=0x1742f7600 {NSLocalizedFailureReason=A route could not be determined between these locations., MKErrorGEOError=-403, MKDirectionsErrorCode=1, NSLocalizedDescription=Directions Not Available}

Zrobiłem kilka badania i okazało się, że MKDirections w niedostępny w Indie, więc zastanawiałem się, w jaki sposób można obejść pokazując wskazówki nawigacyjne do użytkownika.

Dzięki za pomoc!

+0

najlepszym rozwiązaniem, aby korzystać GOOGLEPLACEAPI dla kierunku uzyskania i placeinformation. –

Odpowiedz

4
Error Domain=MKErrorDomain Code=5 "Directions Not Available" 

Jesteś najbardziej prawdopodobne, aby uzyskać ten błąd, jeśli lokalizacja nie należy do żadnego z krajów do tej listy: http://www.apple.com/ios/feature-availability/#maps-directions

Choć na symulatorze iOS możesz łatwo dostosować swoją bieżącą lokalizację. Dwa sposoby, aby to zrobić:

iOS Simulator - Tab> 'debug' -> Lokalizacja -> {Wybierz}

Xcode -> zakładka 'debug' -> Symulacja lokalizacja -> {Wybierz}

więc proponuję używać. SDK GoogleMaps i trasa rysowania.

https://gist.github.com/himanshu-benzatine/10670936c8f16ea1ae482bc6bb684adc

+0

Dzięki! To było naprawdę pomocne. Zastanawiam się tylko, czy gdybym miał przesłać ten kod z C# do Swifta, czy jakiekolwiek zmiany będą musiały zostać wykonane niezależnie od składni? –

+0

Tak, jeśli zmienia kodu z C# do szybkiej następnie składnię i sposób jej będzie zmian. –

+0

Dobra dzięki! –

3

Lepiej użyć google api narysować łamaną od źródła & przeznaczenia. Można użyć API

https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=%@&destinations=%@&key=

następnie dostać się do danych JSON łac długo (y), gdzie ścieżka można wyciągnąć. Dekodowania danych json i narysować polilinię w MKMapkit

+0

Mapy Google i mapy Apple nie mają tych samych bazowych danych. Jeśli to zrobisz, twoja trasa może narysować nieistniejące drogi na mapach Apple lub znajdować się kilka metrów od miejsca, w którym droga jest rysowana na mapach Apple. –

+0

Jeśli masz zamiar to zrobić, należy użyć Google Maps SDK zamiast korzystania z firmy Apple Maps. –