Pregunta

Estoy tratando de agregar una función de enrutamiento a una aplicación en la que estoy trabajando. Encontré el de Craig Spitzkoff artículo sobre cómo dibujar líneas en un MKMapView que funciona bastante bien. Pero dado que no tengo las coordenadas de los puntos en las carreteras que no me ayudan como se esperaba. ¿Hay alguna forma de determinar las coordenadas entre los puntos dados, digamos mi posición actual y otra dirección?

¿Fue útil?

Solución

Básicamente necesitarás hacer un Solicitud HTTP hacia API de Google Instrucciones. Los términos de servicio están bien que debe mostrar los resultados en un mapa de Google, pero creo que debido a que está utilizando un mkmapview, estará bien:

La API de instrucciones solo se puede usar junto con la visualización de resultados en un mapa de Google; Se prohíbe el uso de datos de instrucciones sin mostrar un mapa para el cual se solicitaron datos de instrucciones.

Revisar la Solicitud de instrucciones Para obtener detalles sobre los parámetros, deberá transmitir la URL:

http://maps.google.com/maps/api/directions/output?parameters

Los datos que obtengan serán Json o XML dependiendo de lo que pidiera (producción), por lo que deberá analizarlo para obtener el conjunto de puntos que describan las instrucciones.

Otros consejos

Sé que esta es una pregunta antigua, pero hoy en día también puedes usar Mapkit's MKDirections. Por ejemplo, aquí hay una rutina para buscar algunos searchString y luego agregue instrucciones al primer éxito en su vista de mapa:

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)
    }
}

Para asegurarse de que esto se represente en su mapa, se asegurará de establecer la vista de su mapa delegate propiedad (ya sea en IB o programáticamente) y luego 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
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top