Líneas a polígonos

11

No he podido encontrar el "nombre" del algoritmo que permitiría convertir líneas en polígonos. Dado que este problema cruza los SIG y los campos de la geometría computacional y la informática. No estoy seguro de qué más agregar a la mezcla. Soy reacio a proporcionar una lista de lo que he buscado, ya que también me gustaría saber qué otras personas considerarían su primera opción de criterio de búsqueda.

El escenario ... Tengo líneas (se necesitan dos puntos para construir una línea) ... cada línea está conectada al menos a otra línea. El espacio intermedio entre las líneas conectadas formaría un polígono. El escenario más simple sería un triángulo ... un rectángulo ... y uno podría ir más allá de las características multisegmentadas.

Perdón por cualquier descripción vaga, pero como dije, no quiero guiar las posibles soluciones por un camino que ya he visitado, ya que estoy interesado tanto en el "primer pensamiento" como en la solución final.

Germán Carrillo
fuente
¿Pueden coincidir las líneas? ¿Se pueden cruzar las líneas? (es decir, ¿está limpio?) Si es así, espero llamar a este proceso Build no sería demasiado específico de la aplicación.
Kirk Kuykendall
Las líneas coincidentes de Kirk y otros "defectos" se habrían eliminado antes de construir los polígonos ... Estoy tratando de encontrar el "nombre del algoritmo" que estoy seguro se ha implementado en varios paquetes SIG (por ejemplo, arcgis). En resumen, considere que se han tratado todas las condiciones degeneradas y le quedan líneas limpias (líneas de 2 puntos) que coinciden en los nodos en los que debería poder construir polígonos. La clave es que las líneas existen, no hay condiciones degeneradas y el espacio intermedio necesita convertirse en polígonos. Gracias
¿Están los puntos en un plano o en una esfera?
Kirk Kuykendall
Kirk ... En un plano, coordenadas métricas x, y, no coordenadas esféricas. Por ejemplo, supongamos que tiene los segmentos de línea que formarían un diagrama de voronoi, pero todo lo que tiene son los segmentos que lo forman, pero no la estructura de datos real que lo condujo. En resumen, cada segmento está conectado y cada segmento es único.

Respuestas:

4

¿Quizás "relleno de área"? Mira aquí y aquí .

Editar

Otra posibilidad es la triangulación restringida . (El enlace es a un applet de Java que le permite dibujar un gráfico con el mouse y luego ilustra un algoritmo de barrido plano para triangularlo). El resultado de cualquier triangulación, sin importar cómo se lleve a cabo, puede procesarse fácilmente para cree los polígonos deseados: simplemente combine todos los triángulos vecinos que comparten un borde recién creado.

Ejemplo

Gráfico original:

Gráfico original

Gráfico triangulado:

ingrese la descripción de la imagen aquí

whuber
fuente
Bill Voy a votar porque no me he encontrado con eso ... sin querer limitar otros comentarios de personas en varias disciplinas.
Aunque, en gran medida, se trata de rellenos de trama, esta es la respuesta más cercana. Todavía no tengo un nombre de algoritmo a menos que esté adjunto a un ráster o un vector, pero un algoritmo de "barrido" podría ser suficiente, pero no puedo entender de por vida por qué las coordenadas se ordenarían por Y en lugar de X ( que es fácil de implementar en la mayoría de los idiomas).
@Dan Ordenar por y o x es irrelevante, como sugiere. También tiene razón en que están involucrados los algoritmos de barrido de plano o de barrido de línea, pero desafortunadamente esta es una técnica general que cubre casi todos los procedimientos de geometría computacional, por lo que no es un término adecuado para buscar específicamente su algoritmo. Tenga en cuenta que este problema en particular no es puramente teórico de grafos, porque implica una incrustación del complejo de polilínea en un plano (o esfera), por lo que un buen algoritmo debe mantener información sobre la incrustación: es por eso que realmente es un problema de relleno de área en el corazón.
whuber
5

En la teoría de grafos , esta operación se llama cálculo de caras . Está relacionado con el cálculo del dual de un gráfico dado.

Por ejemplo, en la biblioteca GeOxygène java, un gráfico (llamado CarteTopo ) tiene un método getFaces para recuperar su cara .

Esto se llama poligonalización en JTS

julien
fuente
Buenos enlaces. Sin embargo, todos suponen que el problema de @ Dan ya se ha resuelto: poder llamar a un gráfico "plano" significa que ya ha identificado las caras poligonales. Él quiere saber cómo se convierte una colección arbitraria de arcos (en el plano) en un gráfico plano honesto a bondad en primer lugar. Esto requiere construir una representación de su "topología", como un DCEL.
whuber
Muchas gracias whuber, eres una fuente de conocimiento! Me pregunto cómo alguien puede ser tan brillante.
julien
4

El software host RepRap convierte una lista de segmentos de línea (en un orden aleatorio desconocido) en una lista de polígonos, que suena similar a lo que está tratando de hacer.

En particular, el algoritmo de "coincidencia final" RepRap maneja un montón de casos patológicos.

Por desgracia, el software RepRap supone que cada esquina tiene un número par de bordes que van hacia ella: 2 líneas que van a una esquina en un objeto normal; 4 líneas que van juntas cuando la esquina de un objeto toca la esquina de otro objeto, etc. No sé lo difícil que sería adaptar este algoritmo para manejar diagramas voronoi, que generalmente tienen 3 bordes que van a cada esquina.

David Cary
fuente
+1 ¡Interesante hallazgo! Sin embargo, tenga cuidado: aunque este software parece capaz de resolver muchos problemas relacionados con la conexión de líneas en polígonos, puede hacer demasiado : parece que también trata de simplificar las características, lo que puede ser un efecto secundario indeseable. (Por ejemplo, puede destruir la integridad topológica.)
whuber
3

¿Ha explorado la base de código de GRASS para encontrar una solución a su problema? -> http://old.nabble.com/Polyline-to-Polygon-operation-td20257839.html

oeon
fuente
1
Gracias ... pero no estoy buscando una solución "empaquetada" específica, sino el algoritmo subyacente y / o su nombre que vendrían a las diversas áreas de SIG, Comp Geom y / o Comp Sci ... sigan llegando las ideas
Estaba pensando en mirar específicamente el código fuente detrás de los 2 procesos mencionados en mi enlace que pueden ayudarlo.
oeon
Supongo que tendría que instalar el software para ver el código, ya que no veo ningún listado en esas páginas a menos que me falte algo.
1
Puede navegar por la fuente de GRASS en línea: trac.osgeo.org/grass/browser
underdark
@underdark Gracias por el puntero. Por lo que puedo ver main.cen la v.typefuente, todo lo que sucede es que las características se vuelven a etiquetar como límites: no se produce un procesamiento real. En retrospectiva, esto no es demasiado sorprendente: si (no lo sé con certeza) las características se mantienen con información topológica 2D completa, entonces todo el cálculo para identificar regiones poligonales se ha llevado a cabo automáticamente durante la creación o importación de características y se conserva durante todo todas las operaciones de geoprocesamiento.
whuber
3

Hola

No creo que lo que estés buscando sea un algoritmo específico. La tarea puede ser bastante difícil o muy simple dependiendo de su conjunto de datos.

Debe dividir el problema en al menos 2 partes. 1) es más un problema de red, cómo encontrar anillos cerrados de cadenas lineales. 2) expresa la cadena lineal cerrada como un polígono

La segunda parte, que es "convertir líneas a polígonos" depende más del formato que la representación de polígonos / cadenas de líneas. Me refiero a ir de:

LINESTRING (1 1, 2 2)
LINESTRING (2 2, 2 1)
LINESTRING (2 1, 1 1)

a:
POLÍGONO ((1 1,2 2,2 1,1 1))

está convirtiendo la línea en polígono, pero no es de lo que estás hablando, supongo. La parte más difícil es la primera. Si tiene un espagueti de líneas, cómo ordenarlas como cadenas de líneas cerradas.

Supongo que la respuesta a esa pregunta depende mucho del conjunto de datos. Como Kirk pregunta, si las líneas pueden cruzar el problema es mucho más grande. Si sabe que todas las "colecciones de líneas" son parte de una cadena lineal cerrada, se está volviendo más fácil. Luego puedes tomar cualquier línea y caminar por el camino hasta que estés de vuelta nuevamente y luego continuar con el paso dos de arriba.

Mi punto es que la condición del conjunto de datos establece todas las reglas sobre cómo hacerlo. Si desea encontrar todos los polígonos posibles en un espagueti de cadenas lineales, supongo que tendrá que haber muchos algoritmos diferentes involucrados para colocar puntos de vértice en todos los cruces, buscar todas las rutas posibles, etc.

En PostGIS, la función se llama ST_Polygonize. Esa función crea todos los polígonos posibles a partir de las cadenas de líneas que le asigna .

GEOS lo realiza para que pueda encontrar los algoritmos detrás tanto en el código GEOS como en el JTS.

Solo algunos pensamientos

/ Nicklas

Nicklas Avén
fuente
1

Puede intentar buscar el algoritmo "Forward Star". Me han dicho que es genérico, pero las únicas discusiones al respecto que he leído siempre fueron en referencia a arcgis. Tal vez busque en las referencias citadas en estas notas de conferencia para la estrella delantera.

Kirk Kuykendall
fuente
1
Comentaré aquí, aunque este comentario también aborde algunas de las soluciones propuestas: el problema no puede representarse en una red (o gráfico). Requiere información sobre cómo se conectan las líneas dentro de una superficie bidimensional . Por lo tanto, las representaciones de estrellas hacia adelante / hacia atrás serían de poca utilidad; Se necesita un DCEL o algo similar.
whuber
@whuber: estaba asumiendo que el comentario de Dan de que se habían eliminado todos los "defectos" implicaba que las líneas estaban limpias. Como tal, debería ser posible reducir esto a un problema transversal del gráfico de encontrar todos los ciclos en un gráfico. Al principio pensé que Forward Star ayudaría en los algoritmos que caminan alrededor de un gráfico tomando el giro más preciso a la derecha en cada nodo. Sin embargo, mirando un poco más, parece que hay mejores formas. stackoverflow.com/questions/261573/… Pero aún así, esto supone que el problema se puede volver a establecer como un gráfico.
Kirk Kuykendall
1
Encontrar ciclos en un gráfico no es lo mismo que encontrar caras en un gráfico plano. Considere la gráfica abstracta con vértices {a, b, c, d} y aristas {a, b}, {a, c}, {b, c}, {b, d}, {c, d}. Una base para los ciclos consiste en a-> b-> d-> c-> a y a-> b-> c-> a. En la incrustación plana a -> (0,1), b -> (2,2), c -> (2,0), d -> (3,1) (donde todos los bordes son segmentos de línea), el ciclo a-> b-> d-> c-> a no es una cara, pero si movemos d a (1,1), es una cara. Esto muestra por qué el concepto de "cara" requiere que el gráfico esté incrustado en el plano y por qué las caras no pueden calcularse únicamente a partir de la estructura abstracta del gráfico.
whuber