17 votos

¿Crear polígonos ponderados de Thiessen?

Tengo un shapefile de puntos y creo polígonos de Thiessen (Voronoi) programáticamente usando esta sintaxis de scripting:

CreateThiessenPolygons_analysis (in_features, out_feature_class, fields_to_copy) 

Sin embargo, cada punto está relacionado con un área (es decir, el tamaño preferido de cada polígono) y deseo que los polígonos de Thiessen se ponderen en función de este campo.

¿Es eso posible y cómo?

¿Hay algún código relevante en VBA?

17voto

cjstehno Puntos 131

Hay muchos formas de ponderar las distancias para construir los polígonos de Thiessen. La idea básica para construirlos se basa en comparar la distancia entre un punto arbitrario x y dos puntos fijos p y q ; tiene que decidir si x está "más cerca" de p que a q o no. Para ello -al menos conceptualmente- consideramos las distancias dp = d( x , p ) y dq= d( x , q ). La ponderación suele producirse de dos maneras: los puntos pueden recibir ponderaciones numéricas positivas wp y wq y las propias distancias pueden transformarse.

Para que tenga sentido, la transformación (que escribiré como f ) debería aumentar a medida que aumentan las distancias; es decir, f(d') > f(d) siempre que d' > d >= 0. Ejemplos de estas transformaciones son f(d) = d+1, f(d) = d^2 (Ley de Gravitación Minorista de Reilly), f(d) = 1 - 1/d (suponiendo que todas las distancias son menores que 1), f(d) = log(d), f(d) = exp(d)-1.

Entonces diríamos x está "más cerca" de p que a q exactamente cuando

f(d( x , p )) / wp < f(d( x , q )) / wq.

Fíjese en la división por los pesos, en lugar de la multiplicación: esto significa que los pesos grandes tenderán a "atraer" puntos a distancias mayores. Lo verás en el ejemplo de carrera que aparece a continuación.

Esto es lo bonito, y el sentido de esta exposición un tanto abstracta: aunque las regiones de Thiessen resultantes pueden tener límites complejos y extremadamente difíciles de calcular, son relativamente fáciles de calcular utilizando una representación basada en una cuadrícula. Esta es la receta:

  1. Para cada punto de entrada p , calcula su cuadrícula de distancia euclidiana [d(p)].

  2. Utilice el Álgebra de Mapas para aplicar f y los pesos, reexpresando así cada cuadrícula de distancia como

    [fp] = f([d(p)]) / wp.

    Aquí hay un ejemplo utilizando f(d) = 100 + d^(3/2); la escala es de 400 por 600.

    Figure 1

    A medida que f(d) aumenta el valor se oscurece. Evidentemente, la distancia en este ejemplo es con respecto al punto rojo central; los otros cuatro puntos reciben sus cálculos de distancia por separado (no se muestra). Las áreas de los puntos son proporcionales a sus pesos, que son 2, 10, 3, 4 y 5.

  3. Calcula el mínimo local de todas estas mallas [fp]. Llámalo [f]. He aquí un ejemplo.

    Figure 2

  4. Comparando [f] con cada [fp], a cada celda de la cuadrícula se le asigna el identificador del primer p para el que [f] >= [fp]. (Esto puede hacerse en un solo paso con un posición más baja operación, por ejemplo).

    Figure 3

    (Dudo que exista un algoritmo en algún lugar que calcule una solución en formato vectorial para esta función de ponderación f).

Obviamente, si tienes más de un puñado de puntos p lo harás script, y si su número asciende a miles, probablemente abandonarás el intento por ser computacionalmente impracticable (aunque hay formas de agilizar el cálculo al ponerlo en mosaico).

Otro ejemplo, que muestra los polígonos de Thiessen en un elipsoide, aparece en https://gis.stackexchange.com/a/17377/ .

3 votos

+1 Nunca me había dado cuenta de lo fácil que resulta este problema al adoptar un enfoque de trama.

0 votos

Whuber: ¡Un proceso muy sofisticado! Sin embargo, para centrarse en mi aplicación; Cada punto de mi archivo de entrada representa el centoide aproximado de una parcela de tierra. Creo usando esa línea script señalada anteriormente un archivo de polígonos vectoriales de Thiessen. A cada polígono se le asigna un espacio, es decir, un tamaño basado en el principio de los polígonos de Thiessen de igual distancia de los límites.Por otra parte, cada parcela de tierra tiene un tamaño predefinido que se proporciona en el campo de área; y este es el factor que quiero tener en cuenta para que los polígonos sean proporcionales a este factor. ¿Alguna idea, por favor?

0 votos

No entiendo tus comentarios, Demetris. Suena como si realmente quisieras un cartograma de área en lugar de una colección de polígonos de Thiessen. Ayudaría a explicar por qué que está calculando estos polígonos. ¿Qué problema van a resolver? ¿Cómo se interpretarán?

10voto

Sork Puntos 26

Lo que quieres es un diagrama de Voronoi ponderado: http://en.wikipedia.org/wiki/Weighted_Voronoi_diagram también conocido como teselación circular Dirichlet cuando se hace con pesos multiplicativos en un plano 2d. Alguien parece haber construido una extensión de Arcgis 9 para construir estos: http://arcscripts.esri.com/details.asp?dbid=15481 Con una guía de usuario disponible aquí http://geography.unt.edu/~pdong/software.htm y un artículo publicado en Dong, P., 2008. Generating and updating multiplicatively weighted Voronoi diagrams for point, line and polygon features in GIS. Computers & Geosciences, Volume 34, Issue 4, Pages 411-421.

Hay un artículo reciente sobre un algoritmo basado en vectores (supongo que el algoritmo de P Dong está basado en tramas) para esto. http://www.sciencedirect.com/science/article/pii/S0098300411003037 El resumen dice que se incluye el código c#.

1 votos

Blord-castillo: Muchas gracias por toda esta información. Es muy útil y la aceptaré como una respuesta completa. Sin embargo, mi nuevo problema es que deseo ejecutar esa herramienta dentro de mi código para un número de veces proporcionando entradas como, por ejemplo, como la línea anterior script. ¿Es posible?

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