¿Crear polígonos de Thiessen ponderados?

17

Tengo un archivo de forma de puntos y creo polígonos de Thiessen (Voronoi) mediante programación utilizando esta sintaxis de secuencias de comandos:

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?

Demetris
fuente

Respuestas:

15

Hay muchas maneras de calcular distancias para construir polígonos de Thiessen. La idea básica para construirlos se basa en comparar la distancia entre un punto arbitrario xy dos puntos fijos p y q ; debe decidir si x está "más cerca" de p que de q o no. Para este fin, al menos conceptualmente, consideramos las distancias dp = d ( x , p ) y dq = d ( x , q ). La ponderación generalmente ocurre de dos maneras: los puntos pueden recibir pesos numéricos positivos wp y wq y las distancias mismas pueden transformarse.

Para tener sentido, la transformación (que escribiré como f ) debería aumentar a medida que aumentan las distancias; es decir, f (d ')> f (d) cada vez que d'> d> = 0. Ejemplos de tales transformaciones son f (d) = d + 1, f (d) = d ^ 2 (Ley de Reilly de Gravitación Minorista ), 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 que x está "más cerca" de p que de q exactamente cuando

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

Observe 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 más grandes. Verá esto en el siguiente ejemplo de ejecución.

Aquí está lo hermoso, y el punto central de esta exposición algo abstracta: aunque las regiones de Thiessen resultantes pueden tener límites complejos, extremadamente difíciles de calcular, son relativamente fáciles de calcular usando una representación basada en cuadrícula. Aquí está la receta:

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

  2. Use el Álgebra de mapas para aplicar fy los pesos, volviendo a expresar cada cuadrícula de distancia como

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

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

    Figura 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 obtienen sus cálculos de distancia por separado (no se muestran). Las áreas de los puntos son proporcionales a sus pesos, que son 2, 10, 3, 4 y 5.

  3. Calcule el mínimo local de todas estas cuadrículas [fp]. Llama a esto [f]. Aquí hay un ejemplo.

    Figura 2

  4. Al comparar [f] con cada [fp], a cada celda de la cuadrícula asigne el identificador de la primera p para la cual [f]> = [fp]. (Esto se puede hacer en un paso con una operación de posición más baja , por ejemplo).

    figura 3

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

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

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

whuber
fuente
3
+1 Nunca me di cuenta de lo fácil que se vuelve este problema al adoptar un enfoque de trama.
Kirk Kuykendall el
Whuber: ¡Proceso muy sofisticado! Sin embargo, para centrarme 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 de script que se menciona arriba en un archivo vectorial de polígonos de Thiessen. A cada polígono se le asigna un espacio, es decir, un tamaño basado en el principio de polígonos de Thiessen de igual distancia de los límites. Por otro lado, cada terreno 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 proporcionalmente a este factor. ¿Alguna idea por favor?
Demetris
No entiendo tus comentarios, Demetris. Parece que realmente quieres un cartograma de área en lugar de una colección de polígonos de Thiessen. Sería útil explicar por qué estás calculando estos polígonos. ¿Qué problema van a resolver? ¿Cómo serán interpretados?
whuber
Whuber: cada uno de mis puntos ingresados ​​en el proceso del polígono de Thiessen representa el centroide aproximado de un nuevo conjunto de parcelas de terreno. Por lo tanto, creo polígonos de Thiessen basados ​​en estos puntos que representan la forma de las parcelas de tierra (una parcela de tierra de punto uno). Puedo producir muchos conjuntos de formas de parcelas de tierra aleatorias moviendo estos puntos para alimentar mi algoritmo genético. El problema es que estas formas de parcelas generadas (es decir, polígonos de Thiessen) deben tener un área predefinida y me pregunto si es posible tener esto en cuenta al utilizar la operación de polígonos de Thiessen. Espero que esto tenga sentido.
Demetris
¿Qué intenta hacer su algoritmo genético? Todavía parece que no necesita polígonos de Thiessen ponderados: creo que no existe una ponderación posible que asegure que los polígonos alcancen áreas predefinidas o incluso áreas relativas previamente especificadas.
whuber
10

Lo que desea es un diagrama de Voronoi ponderado: http://en.wikipedia.org/wiki/Weighted_Voronoi_diagram también conocido como una teselación de Dirichlet circular cuando se hace con pesos multiplicativos en un plano 2D. Alguien parece haber construido una extensión arcgis 9 para construir estos: http://arcscripts.esri.com/details.asp?dbid=15481 Con una guía del usuario disponible aquí http://geography.unt.edu/~pdong/software .htm y un artículo publicado en Dong, P., 2008. Generación y actualización de diagramas de Voronoi ponderados multiplicativamente para entidades de puntos, líneas y polígonos en SIG. Computadoras y Geociencias, Volumen 34, Número 4, Páginas 411-421.

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

castillo-blord
fuente
1
Blord-castillo: Muchas gracias por toda esta información. Es muy útil y aceptaré esto como una respuesta integral. Sin embargo, mi nuevo problema es que deseo ejecutar esa herramienta dentro de mi código varias veces proporcionando entradas como egas en la línea de script anterior. ¿Es eso posible?
Demetris