Estoy tratando de usar QGIS 2.14 para ajustar una red de carreteras a una cuadrícula hexagonal, pero obtengo artefactos extraños.
He creado una cuadrícula hexadecimal con MMQGIS , las celdas miden aproximadamente 20 x 23 m. He amortiguado la red de carreteras en 1 my la he densificado para que haya un nodo cada pocos metros. Puedes ver lo que estoy tratando de lograr a continuación. Como puede ver, puedo hacer que funcione en algunos casos:
- azul es el camino densificado (una línea amortiguada)
- rojo es la versión 'hexificada': esto es lo que quiero encontrar
- el gris es la cuadrícula hexadecimal
Luego utilicé la nueva función de geometrías de ajuste para ajustar los nodos a la esquina hexagonal más cercana. Los resultados son prometedores, pero parece haber algunos casos extremos en los que la línea se expande para llenar el hexágono (o parte de él):
La razón del búfer es que las geometrías de ajuste no le permiten ajustar a una capa cuya geometría es diferente. Por ejemplo, no puede ajustar nodos en una capa LINE a puntos en una capa POINT). Parece ser más feliz al conectar POLYGON a POLYGON.
Sospecho que las carreteras se expanden cuando un lado de la línea de la carretera amortiguada salta a un lado de la celda hexagonal, y el otro lado salta al otro lado de la celda hexagonal. En mi ejemplo, las carreteras que cruzan oeste-este en un ángulo agudo parecen ser las peores.
Cosas que he intentado, sin éxito: -
- amortiguando la red de carreteras en una pequeña cantidad, por lo que sigue siendo un polígono pero es muy delgada.
- densificar las celdas hexadecimales (por lo que hay nodos a lo largo de los bordes, no solo en las esquinas)
- variando la distancia máxima de ajuste (esto tiene el mayor efecto, pero parece que no puedo encontrar un valor ideal)
- usando capas LINE, no POLYGONs
Me parece que si cambio a usar solo capas LINE, funciona por un tiempo, luego se bloquea. Parece guardar su trabajo a medida que avanza: algunas líneas se han procesado parcialmente.
¿Alguien sabe de alguna otra manera de ajustar puntos en una línea al punto más cercano en otra línea / capa de polígono, idealmente sin necesidad de usar postgres / postgis (aunque una solución con postgis también sería bienvenida)?
EDITAR
Para cualquiera que quiera probar, he puesto un proyecto QGIS de inicio aquí en Dropbox . Esto incluye las capas Hex Grid y Densified lines. (La red de carreteras es de OSM, por lo que se puede descargar usando QuickOSM, por ejemplo, si necesita obtener el original para descomprimir las carreteras).
Tenga en cuenta que está en OSGB (epsg: 27700) que es un UTM localizado para el Reino Unido, con unidades en metros.
Respuestas:
Mi solución involucra un script PyQGIS que es más rápido y más efectivo que un flujo de trabajo que involucra ajuste (también lo probé). Usando mi algoritmo obtuve estos resultados:
Puede ejecutar los siguientes fragmentos de código en secuencia desde QGIS (en la consola QGIS Python). Al final obtienes una capa de memoria con las rutas ajustadas cargadas en QGIS.
El único requisito previo es crear un Shapefile de carretera multiparte (uso
Processing->Singleparts to multipart
, usé el campofictitiuos
comoUnique ID field
parámetro). Esto nos dará unroads_multipart.shp
archivo con una sola característica.Aquí está el algoritmo explicado:
Obtenga los lados hexagonales más cercanos donde se cruzan las rutas. Para cada hexágono creamos 6 triángulos entre cada par de vértices vecinos y el centroide correspondiente. Si alguna carretera se cruza con un triángulo, el segmento compartido por el hexágono y el triángulo se agrega a la ruta ajustada final. Esta es la parte más pesada de todo el algoritmo, tarda 35 segundos en ejecutarse en mi máquina. En las dos primeras líneas hay 2 rutas de Shapefile, debe ajustarlas para que se ajusten a sus propias rutas de archivo.
Deshágase de los segmentos desconectados (o 'abiertos') utilizando listas, tuplas y diccionarios de Python . En este punto, quedan algunos segmentos desconectados, es decir, segmentos que tienen un vértice desconectado pero el otro conectado a al menos otros 2 segmentos (ver segmentos rojos en la siguiente figura). Necesitamos deshacernos de ellos.
Ahora podemos crear una capa vectorial a partir de la lista de coordenadas y cargarla en el mapa QGIS :
Otra parte del resultado:
Si necesita atributos en las rutas ajustadas, podríamos usar un Índice espacial para evaluar rápidamente las intersecciones (como en /gis//a/130440/4972 ), pero esa es otra historia.
¡Espero que esto ayude!
fuente
Lo hice en ArcGIS, seguramente se puede implementar usando QGIS o simplemente python con un paquete capaz de leer geometrías. Asegúrese de que las carreteras representan la red, es decir, se cruzan entre sí solo en los extremos. Estás tratando con OSM, supongo que es el caso.
Si no quieres ver esto:
No intente usar puntos de PK en las líneas de Voronoi. Me temo que solo empeorará las cosas. Por lo tanto, su única opción es crear una red a partir de líneas Voronoi y encontrar rutas entre los puntos finales de la carretera, eso tampoco es gran cosa
fuente
Me doy cuenta de que estás pidiendo un método QGIS, pero ten paciencia para obtener una respuesta clara:
Notas:
fuente
Si dividiera la línea de la carretera en segmentos donde cada segmento estuviera completamente contenido por el hexágono, su decisión sobre qué segmentos de línea de hexágono usar sería si la distancia desde el centroide del segmento de carretera dividido hasta el punto medio de cada lado del hexágono era inferior a la mitad del diámetro del hexágono (o menor que el radio de un círculo que se ajusta dentro del hexágono).
Por lo tanto, si tuviera que (un segmento a la vez) seleccionar segmentos de línea de hexágono (donde cada segmento es un lado del hexágono) que están dentro de una distancia del radio del hexágono, podría copiar esas geometrías de línea y fusionarlas en cualquier identificador único que utilice para su conjunto de datos de carretera
Si tiene problemas para fusionarse con el identificador único, puede aplicar el búfer y seleccionar por ubicación solo en esos segmentos para aplicar los atributos de su conjunto de datos de carretera; de esa manera no tendría que preocuparse por hacer coincidencias falsas con un búfer que es demasiado grande.
El problema con la herramienta de ajuste es que ajusta puntos indiscriminadamente; Es difícil encontrar esa tolerancia perfecta para usar. Con esta metodología, estaría identificando correctamente qué segmentos de línea hexagonales usaría, luego reemplazaría la geometría de sus datos de carretera (o insertaría las geometrías en un conjunto de datos diferente).
Además, si todavía tiene el problema con los segmentos de línea que saltan de un lado del hexágono al otro, puede dividir la línea en segmentos por vértices, calcular la longitud de cada línea y luego eliminar cualquier segmento de línea que sea más grande que La longitud promedio de un lado del hexágono.
fuente
El complemento de geometría en qgis 3.0 ha sido modificado y ahora permite el ajuste entre diferentes tipos de geometría. También tiene muchas correcciones. Puede probar una versión de "instantánea diaria" para obtener acceso al complemento mejorado antes de que se lance oficialmente 3.0.
fuente