Aggiunta di un percorso a un mkmapview
-
01-10-2019 - |
Domanda
Sto cercando di aggiungere una funzione di routing a un'app su cui sto lavorando. Ho trovato Craig Spitzkoff articolo su come disegnare linee su un MKMapView
che funziona abbastanza bene. Ma dal momento che non ho le coordinate dei punti sulle strade che non mi aiutano come previsto. Esiste un modo per determinare le coordinate tra determinati punti, diciamo la mia posizione attuale e un altro indirizzo?
Soluzione
Fondamentalmente dovrai fare un Richiesta HTTP al API di Google Indicazioni. I termini di servizio indicano che devi visualizzare i risultati su una mappa di Google, ma penso che perché stai usando un MKMAPVIEW, starai bene:
L'API delle indicazioni può essere utilizzata solo insieme alla visualizzazione di risultati su una mappa di Google; È vietato utilizzare i dati delle direzioni senza visualizzare una mappa per la quale è stato richiesto i dati delle direzioni.
Dai un'occhiata al Richiesta di indicazioni Per i dettagli sui parametri è necessario trasmettere l'URL:
http://maps.google.com/maps/api/directions/output?parameters
I dati che riceverai saranno JSON o XML a seconda di ciò che hai chiesto (produzione), quindi dovrai analizzarlo per ottenere il set di punti che descrivono le direzioni.
Altri suggerimenti
So che questa è una vecchia domanda, ma al giorno d'oggi puoi anche usare Mapkit MKDirections
. Ad esempio, ecco una routine per cercare alcuni searchString
e poi aggiungi indicazioni al primo colpo alla vista della mappa:
let request = MKLocalSearch.Request()
request.region = mapView.region
request.naturalLanguageQuery = searchString
let search = MKLocalSearch(request: request)
search.start { response, _ in
guard let mapItem = response?.mapItems.first else { return }
let request = MKDirections.Request()
request.source = MKMapItem.forCurrentLocation()
request.destination = mapItem
let directions = MKDirections(request: request)
directions.calculate { response, error in
guard let routes = response?.routes else { return }
let overlays = routes.map { $0.polyline }
self.mapView.addOverlays(overlays)
}
}
Per assicurarti che questo sia reso sulla tua mappa, ti assicureresti di impostare la vista della mappa delegate
Proprietà (in IB o programmaticamente) e quindi implementa mapView(_:rendererFor:)
:
extension MapViewController: MKMapViewDelegate {
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
let renderer = MKPolylineRenderer(overlay: overlay)
renderer.strokeColor = .init(red: 0, green: 0, blue: 1, alpha: 0.7)
return renderer
}
}