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.
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 PolyLine
s. (Llamar a la matriz de Polyline
sa 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 Segment
s, 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 Segment
s son lo suficientemente cortos, y su deseado PolyLine
s distancia es lo suficientemente larga, debe obtener PolyLine
s 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.
¿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