25 votos

Creación de polígonos de Thiessen (Voronoi) utilizando líneas (en lugar de puntos) como características de entrada?

Tengo un conjunto de características de línea dentro de un límite poligonal particular. Para cada línea, me gustaría generar un polígono dentro del cual cada punto posible está más cerca de la línea dada que de cualquier otra línea en la capa. He hecho esto en el pasado para las características de entrada de puntos utilizando la triangulación de Delaunay, pero si hay un proceso similar para hacerlo con las características de línea no he sido capaz de encontrarlo.

ETA: Se me había ocurrido la solución de Geogeek, pero en los tramos más rectos donde las líneas de entrada tienen menos vértices, los polígonos resultantes se acercan demasiado (incluso se superponen) a una línea que no deberían. Aquí, las líneas rojas son mis entradas, puedes ver los vértices y los polígonos de Thiessen generados a partir de ellas.

enter image description here

Tal vez una solución rápida y (muy) sucia podría ser convertir cada línea en un conjunto abundante de puntos espaciados uniformemente (en lugar de los vértices de la línea solamente), generar polígonos Thiessen a partir de ellos, y luego disolverlos basándose en el ID de la línea de origen.

5 votos

Los diagramas de Voronoi que incluyen segmentos de línea junto con puntos no están compuestos por "polígonos", sino que sus celdas tienen límites que pueden incluir porciones de parábolas. Por este motivo, una de las formas más eficaces y precisas de crear teselaciones de Voronoi es utilizar una representación rasterizada. ESRI llama a este procedimiento Asignación euclidiana .

12voto

cjstehno Puntos 131

Para ilustrar una solución de procesamiento de imágenes/raster, Empecé con la imagen publicada. Su calidad es mucho menor que la de los datos originales, debido a la superposición de puntos azules, líneas grises, regiones coloreadas y texto; y al engrosamiento de las líneas rojas originales. Como tal, supone un reto: no obstante, podemos obtener células de Voronoi con gran precisión.

Extraje las partes visibles de los rasgos lineales rojos restando el verde del canal rojo y luego dilatando y erosionando las partes más brillantes en tres píxeles. Esto se utilizó como base para el cálculo de la distancia euclidiana:

i = Import["http://i.stack.imgur.com/y8xlS.png"];
{r, g, b} = ColorSeparate[i];
string = With[{n = 3}, Erosion[Dilation[Binarize[ImageSubtract[r, g]], n], n]];
ReliefPlot[Reverse@ImageData@DistanceTransform[ColorNegate[string]]]

Relief plot

(Todo el código mostrado aquí es Mathematica 8.)

La identificación de las "crestas" evidentes -que deben incluir todos los puntos que separan dos células de Voronoi adyacentes- y su recombinación con la capa de líneas proporciona la mayor parte de lo que necesitamos para proceder:

ridges = Binarize[ColorNegate[
   LaplacianGaussianFilter[DistanceTransform[ColorNegate[string]], 2] // ImageAdjust], .65];
ColorCombine[{ridges, string}]

Combined images

La banda roja representa lo que pude salvar de la línea y la banda cian muestra las crestas en la transformación de la distancia. (Estas crestas deben limpiarse y cerrarse mediante una nueva dilatación -dos píxeles bastarán- y entonces podremos identificar las regiones conectadas determinadas por las líneas originales y las crestas entre ellas (algunas de las cuales deben recombinarse explícitamente):

Dilation[MorphologicalComponents[
  ColorNegate[ImageAdd[ridges, Dilation[string, 2]]]] /. {2 -> 5, 8 -> 0, 4 -> 3} // Colorize, 2]

Lo que se ha conseguido, en efecto, es identificar cinco orientado características lineales. Podemos ver tres rasgos lineales separados que emanan de un punto de confluencia. Cada uno tiene dos lados. He considerado que el lado derecho de los dos rasgos más a la derecha es el mismo, pero he distinguido todo lo demás, dando los cinco rasgos. Las áreas coloreadas muestran el diagrama de Voronoi de estas cinco características.

Result

Un comando de Asignación Euclidiana basado en una capa que distingue los tres rasgos lineales (que no tenía disponible para esta ilustración) no distinguiría los diferentes lados de cada rasgo lineal, por lo que combinaría las regiones verde y naranja que flanquean la línea más a la izquierda; dividiría el rasgo verde azulado más a la derecha en dos; y combinaría esas piezas divididas con los correspondientes rasgos beige y magenta en sus otros lados.

Evidentemente, este enfoque rasterizado tiene la capacidad de construir teselaciones de Voronoi de características arbitrarias -puntos, piezas lineales e incluso polígonos, independientemente de sus formas- y puede distinguir los lados de las características lineales.

1 votos

Una solución similar se ilustra en mathematica.stackexchange.com/questions/20696/ .

5voto

kwutchak Puntos 232

Creo que sí:

  • Convierte los vértices de las líneas en puntos(puntos_línea).
  • Hacer polígonos de voronoi utilizando los puntos(puntos_línea).
  • Disuelve los polígonos resultantes utilizando un atributo de identificación que ha sido guardado desde la capa de líneas, o mediante una unión espacial con la capa de líneas.

Espero haber entendido bien tu pregunta, si no es así puedes aportar un dibujo para explicar mejor tus necesidades.

2 votos

Creo que lo has entendido, y se me ha ocurrido esa solución, pero te encuentras con problemas cuando las líneas tienen menos vértices. Voy a actualizar mi pregunta con una captura de pantalla.

3 votos

Esto funcionaría bien si los puntos fueran más densos a lo largo de la línea. Aunque un enfoque basado en la trama (como whuber menciona en los comentarios de la pregunta) sospecho que sería mucho más eficiente que esto.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X