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?

È stato utile?

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
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top