El proceso podría dividirse en dos partes
- Seleccione las líneas que formarán las polilíneas (elimine las líneas innecesarias).
- Forma las polilíneas.
La primera parte es la más delicada:
Es necesario crear una condición (o varias), que debe poder formalizarse matemáticamente en términos de teoría de conjuntos, y que decidirá si una línea debe ser seleccionada o no.
El enfoque más práctico, aunque probablemente el menos sólido, es que la condición se establezca en términos de rangos de acimut que la geometría debe tener para ser seleccionada.
Presento un ejemplo de un conjunto de líneas trazadas a propósito para esta respuesta, que fueron etiquetadas con su acimut correspondiente. Las etiquetas se basan en la expresión round( degrees( azimuth( start_point( $geometry), end_point( $geometry))), 1)
.
Se seleccionan dos líneas conflictivas:
Evidentemente, el acimut depende de la dirección (hacia delante o hacia atrás) en la que se hayan digitalizado. Así que la condición se establecerá sobre rangos de acimut opuestos.
Si se puede establecer una condición basada en rangos de acimut para toda (o casi toda) la imagen, pensaría que algunas líneas conflictivas que se seleccionen en primera instancia no serían un problema, ya que sería relativamente fácil eliminarlas manualmente después.
En mi caso, como no quiero seleccionar la línea de acimut 171,9, uno de los bordes de mis rangos será de 170 grados (y su opuesto 350). El otro borde lo elegí ancho porque no vi ningún inconveniente (100 grados y su opuesto 280).
Los rangos más bajos serían más restrictivos, pero preferiría elegir más líneas (y luego eliminarlas), pero que todas las líneas que me interesan estén seleccionadas. Igualmente, en algunas iteraciones por ensayo y error, se puede determinar un rango conveniente. Además, ¿qué condición podría imponer para que la línea de 179,1 grados de acimut no fuera seleccionada si estuviera dentro de mi rango? Por supuesto que hay una respuesta, pero no la conozco.
He seleccionado por la expresión:
(
( ( azimuth( start_point ( $geometry), end_point( $geometry))) >= ( radians( 100)))
AND
( ( azimuth( start_point ( $geometry), end_point( $geometry))) <= ( radians( 170)))
)
OR
(
( ( azimuth( start_point ( $geometry), end_point( $geometry))) >= ( radians( 280)))
AND
( ( azimuth( start_point ( $geometry), end_point( $geometry))) <= ( radians( 350)))
)
Y exportar las características seleccionadas como una nueva capa.
Formar polilíneas es mucho más sencillo ahora.
Tenga en cuenta que las polilíneas deben ser topológicamente correcto . Cada línea debe comenzar en el punto exacto en el que termina otra. Por su procedimiento expuesto en la pregunta no tengo ninguna duda de que esto es así. Pero si es necesario, deberías limpiarlas primero con v.limpiar .
Las polilíneas se forman con v.construir.polilíneas .
Ambas herramientas de GRASS están integradas en QGIS.
Si ha quedado alguna línea no deseada (no ha sido eliminada antes de construir las polilíneas), entonces tres líneas saldrán de un nodo, y la interpretación correcta de la topología es que habrá tres polilíneas diferentes que comparten ese nodo.
Si es así, elimine la línea (o polilínea) no deseada y reconstruya.