Créer des polygones de Thiessen pondérés?


17

J'ai un fichier de formes ponctuelles et je crée des polygones Thiessen (Voronoi) par programmation en utilisant cette syntaxe de script:

CreateThiessenPolygons_analysis (in_features, out_feature_class, fields_to_copy) 

Cependant, chaque point est lié à une zone (c'est-à-dire la taille préférée de chaque polygone) et je souhaite que les polygones de Thiessen soient pondérés en fonction de ce champ.

Est-ce possible et comment?

Existe-t-il un code pertinent dans VBA?

Réponses:


15

Il existe de nombreuses façons de pondérer les distances pour construire des polygones de Thiessen. L'idée de base de leur construction est basée sur la comparaison de la distance entre un point arbitraire x et deux points fixes p et q ; vous devez décider si x est "plus proche" de p que de q ou non. À cette fin - au moins conceptuellement - nous considérons les distances dp = d ( x , p ) et dq = d ( x , q ). La pondération se produit généralement de deux manières: les points peuvent recevoir des poids numériques positifs wp et wq et les distances elles-mêmes peuvent être transformées.

Pour donner un sens, la transformation (que j'écrirai comme f ) devrait augmenter à mesure que les distances augmentent; c'est-à-dire, f (d ')> f (d) chaque fois que d'> d> = 0. Des exemples de telles transformations sont f (d) = d + 1, f (d) = d ^ 2 (loi de Reilly sur la gravitation au détail ), f (d) = 1 - 1 / d (en supposant que toutes les distances sont inférieures à 1), f (d) = log (d), f (d) = exp (d) -1.

On dirait alors que x est "plus proche" de p que de q exactement quand

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

Remarquez la division par les poids, plutôt que la multiplication: cela signifie que les gros poids auront tendance à «tirer» des points à de plus grandes distances. Vous le verrez dans l'exemple en cours ci-dessous.

Voici la belle chose, et tout l'intérêt de cette exposition quelque peu abstraite: bien que les régions Thiessen résultantes puissent avoir des frontières complexes et extrêmement difficiles à calculer, elles sont relativement faciles à calculer en utilisant une représentation basée sur une grille. Voici la recette:

  1. Pour chaque point d'entrée p , calculez sa grille de distance euclidienne [d (p)].

  2. Utilisez l'algèbre de carte pour appliquer f et les poids, ré-exprimant ainsi chaque grille de distance sous la forme

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

    Voici un exemple utilisant f (d) = 100 + d ^ (3/2); l'échelle est de 400 par 600.

    Figure 1

    Lorsque f (d) augmente, la valeur s'assombrit. Évidemment, la distance dans cet exemple est par rapport au point rouge central; les quatre autres points obtiennent leurs calculs de distance séparés (non représentés). Les zones des points sont proportionnelles à leurs poids, qui sont 2, 10, 3, 4 et 5.

  3. Calculez le minimum local de toutes ces grilles [fp]. Appelez cela [f]. Voici un exemple.

    Figure 2

  4. En comparant [f] à chaque [fp], à chaque cellule de la grille attribuez l'identifiant du premier p pour lequel [f]> = [fp]. (Cela peut être fait en une seule étape avec une opération de position la plus basse , par exemple.)

    figure 3

    (Je doute qu'il existe un algorithme n'importe où qui calculera une solution de format vectoriel pour cette fonction de pondération f.)

Évidemment, si vous avez plus d'une poignée de points p, vous l'écrirez, et si leur nombre atteint des milliers, vous abandonnerez probablement la tentative comme étant impraticable sur le plan du calcul (bien qu'il existe des moyens d'accélérer le calcul en le juxtaposant).

Un autre exemple, montrant des polygones de Thiessen sur un ellipsoïde, apparaît sur /gis//a/17377/ .


3
+1 Je n'ai jamais réalisé à quel point ce problème devient plus facile en adoptant une approche matricielle.
Kirk Kuykendall

Whuber: Processus très sophistiqué! Cependant, pour me concentrer dans mon applciation; Chaque point de mon fichier d'entrée représente le centoïde approximatif d'une parcelle de terrain. Je crée en utilisant cette ligne de script indiquée ci-dessus un fichier vectoriel de polygones Thiessen. Chaque polygone se voit attribuer un espace, c'est-à-dire une taille basée sur le principe de trois polygones à égale distance des frontières. D'autre part, chaque parel terrestre a une taille prédéfinie qui est fournie dans le champ de la zone; et c'est le facteur que je veux prendre en compte pour que les polygones soient proportionnellement à ce facteur. Une idée s'il vous plait?
Demetris

Je ne comprends pas vos remarques, Demetris. On dirait que vous voulez vraiment un cartogramme de surface plutôt qu'une collection de polygones de Thiessen. Il serait utile d'expliquer pourquoi vous calculez ces polygones. Quel problème vont-ils résoudre? Comment seront-ils interprétés?
whuber

Whuber: Chacun de mes points saisis dans le processus du polygone de Thiessen représente le centroïde approximatif d'un nouvel ensemble de parcelles de terrain. Ainsi, je crée trois polygones basés sur ces points représentant la forme de parcelles de terrain (une parcelle de terrain point par point). Je peux produire de nombreux ensembles de formes aléatoires de parcelles de terrain en déplaçant ces points pour alimenter mon algorithme génétique. Le problème est que ces formes de parcelles générées (c'est-à-dire les polygones de Thiessen) doivent avoir une zone prédéfinie et je me demande s'il est possible d'en tenir compte lors de l'utilisation de l'opération des polygones de Thiessen. J'espère que cela a du sens.
Demetris

Que tente de faire votre algorithme génétique? Il semble toujours que vous n'ayez pas besoin de polygones de Thiessen pondérés: je crois qu'il n'existe aucune pondération possible qui garantisse que les polygones atteindront des zones prédéfinies ou même des zones relatives prédéterminées.
whuber

10

Ce que vous voulez, c'est un diagramme de Voronoï pondéré: http://en.wikipedia.org/wiki/Weighted_Voronoi_diagram également connu sous le nom de pavage circulaire de Dirichlet lorsqu'il est fait avec des poids multiplicatifs dans un plan 2D. Quelqu'un semble avoir construit une extension arcgis 9 pour les construire: http://arcscripts.esri.com/details.asp?dbid=15481 Avec un guide d'utilisation disponible ici http://geography.unt.edu/~pdong/software .htm et un article publié à Dong, P., 2008. Génération et mise à jour de diagrammes de Voronoi pondérés multiplicativement pour les entités ponctuelles, linéaires et polygonales dans le SIG. Ordinateurs et géosciences, volume 34, numéro 4, pages 411-421.

Il y a un article récent sur un algorithme basé sur un vecteur (je suppose que l'algorithme de P Dong est basé sur un raster) pour cela. http://www.sciencedirect.com/science/article/pii/S0098300411003037 Le résumé indique que le code c # est inclus.


1
Blord-castillo: Merci beaucoup pour toutes ces informations. C'est très utile et je l'accepterai comme une réponse globale. Cependant, mon nouveau problème est que je souhaite exécuter cet outil dans mon code plusieurs fois en fournissant des entrées comme egas la ligne de script ci-dessus. Est-ce possible?
Demetris
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.