¿Cómo dividir la matriz de coordenadas de ruta, en partes de igual distancia?

3 minutos de lectura

avatar de usuario de brócoli
brócoli

Estoy trabajando con la API de Google Maps en la aplicación iOS. Tengo una ruta entre el punto A y el punto B. Esta ruta está codificada en String, que he decodificado en una matriz de coordenadas, a partir de la cual, de hecho, se crea la ruta.

Y ahora ocurre el problema: necesito dividir esta ruta de alguna manera, que me permita obtener las coordenadas de los puntos, que están separados entre sí por una distancia dada, digamos 20 kilómetros. Sé que los puntos no aparecen regulares en la distancia, por lo que debe ser de +/- 20 km, depende de la densidad de puntos en la sección de la carretera. Por ejemplo:

let decodedPolylinePoints = 
[(22.3456, 23.3232), (32.3232, 32.3332), (33.4555,34.466), ….]

Y después de los cálculos, el resultado es una matriz, en la que los siguientes elementos tienen +/- 20 km entre sí.

¿Algunas ideas? Estoy implementando la aplicación Swift, pero el idioma es libre de elegir. Se trata del algoritmo.

ruta con todos los marcadores de coordenadas

pantalla de ruta con puntos ampliados

  • ¿Desea obtener la misma distancia “a vuelo de pájaro” entre los puntos, o desea que la distancia acumulada entre los segmentos sea aproximadamente la misma? Entonces, ¿quieres: 1. La distancia punto a punto entre el punto A y el punto K es aproximadamente la misma y la distancia punto a punto entre K y N, ignorando los puntos intermedios. 2. La suma de AB, BC, CD, DE, EF, FG es aproximadamente igual a la suma de GH, HI, IJ, JK, LM Donde la opción 2 le daría la distancia de conducción para la ruta. (Supongo que quieres la opción 2).

    – Duncan C.

    4 de enero de 2019 a las 2:57

  • Sí, la segunda opción es definitivamente lo que quiero.

    – brócoli

    4 de enero de 2019 a las 3:07

  • ¡El punto 32.3232, 32.3332, está en medio del Mediterráneo! (Puede ser un poco difícil conducir).

    – Duncan C.

    4 de enero de 2019 a las 19:13

Avatar de usuario de Duncan C
duncan c

Suponiendo que desea que la suma de las distancias punto a punto sea la misma:

Convierta la matriz de tuplas en una matriz de CLLocation objetos.

Asigne la matriz de objetos CLLocation a una matriz de estructuras donde cada estructura contiene el punto inicial y final de un par de puntos (AB, BC, CD, DE, etc.) y la distancia calculada entre esos puntos (Uso de CLLocation distance(from:) método.) Llame a eso un Segment.

Definir un tipo PolyLine eso es una matriz de Segment objetos.

Ahora defina un tipo que sea del tipo matriz de PolyLines. (Llamar a la matriz de Polylinesa Route.

Crea una instancia de una variable de ruta vacía (trip). (var trip = Route()) Crear un vacío PolyLine variable currentPolyLine. (var currentPolyLine = Polyline().)

Ahora recorra la gran matriz de segmentos de origen. Si la suma de las distancias en la polilínea actual, más el nuevo segmento, es ≤ el umbral deseado, agregue el segmento a currentPolyLine. Si el nuevo segmento hace que la polilínea actual sea demasiado larga, agregue la polilínea actual a la ruta, vacíe la polilínea actual y reemplácela con el nuevo segmento. cuando te quedas sin Segments, agregue el último restante PolyLine al Route.

Eso debería darle una matriz de PolyLines que son ≤ su distancia deseada. La última PolyLine puede ser más corta que todas las demás.

Si quieres aceptar PolyLines eso podría ser un poco más largo o un poco más corto que la distancia deseada, se vuelve más complicado.

Asumiendo tu Segments son lo suficientemente cortos, y su deseado PolyLines distancia es lo suficientemente larga, debe obtener PolyLines que tienen aproximadamente la misma longitud. Como tu más larga Segment la longitud se acerca a tu PolyLine longitud la variación en PolyLine la longitud será mayor.

¿Ha sido útil esta solución?