Creare poligoni Thiessen ponderati?


17

Ho un file shapefile e creo poligoni di Thiessen (Voronoi) a livello di codice usando questa sintassi di scripting:

CreateThiessenPolygons_analysis (in_features, out_feature_class, fields_to_copy) 

Tuttavia, ogni punto è correlato a un'area (ovvero la dimensione preferita di ciascun poligono) e desidero che i poligoni di Thiessen vengano ponderati in base a questo campo.

È possibile e come?

Esiste un codice rilevante in VBA?

Risposte:


15

Esistono molti modi per ponderare le distanze per costruire poligoni di Thiessen. L'idea di base nel costruirli si basa sul confronto della distanza tra un punto arbitrario xe due punti fissi p e q ; devi decidere se x è "più vicino" a p che a q oppure no. A tal fine - almeno concettualmente - consideriamo le distanze dp = d ( x , p ) e dq = d ( x , q ). La ponderazione di solito avviene in due modi: ai punti possono essere dati pesi numerici positivi wp e wq e le distanze stesse possono essere trasformate.

Per senso, la trasformazione (che scriverò come f ) dovrebbe aumentare all'aumentare delle distanze; cioè, f (d ')> f (d) ogni volta che d'> d> = 0. Esempi di tali trasformazioni sono f (d) = d + 1, f (d) = d ^ 2 (Reilly's Law of Retail Gravitation ), f (d) = 1 - 1 / d (supponendo che tutte le distanze siano inferiori a 1), f (d) = log (d), f (d) = exp (d) -1.

Vorremmo quindi dire che x è "più vicino" a p che a q esattamente quando

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

Notare la divisione per i pesi, piuttosto che la moltiplicazione: questo significa che pesi di grandi dimensioni tenderanno a "tirare" punti a distanze maggiori. Lo vedrai nell'esempio seguente.

Ecco la cosa bella, e il punto centrale di questa esposizione in qualche modo astratta: sebbene le regioni di Thiessen risultanti possano avere confini complessi, estremamente difficili da calcolare, sono relativamente facili da calcolare usando una rappresentazione basata su griglia. Ecco la ricetta:

  1. Per ogni punto di input p , calcola la sua griglia della distanza euclidea [d (p)].

  2. Utilizzare Map Algebra per applicare f e i pesi, ri-esprimendo così ciascuna griglia della distanza come

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

    Ecco un esempio usando f (d) = 100 + d ^ (3/2); la scala è 400 per 600.

    Figura 1

    Man mano che f (d) aumenta, il valore diventa più scuro. Evidentemente la distanza in questo esempio è rispetto al punto rosso centrale; gli altri quattro punti ottengono i loro calcoli di distanza separati (non mostrati). Le aree dei punti sono proporzionali ai loro pesi, che sono 2, 10, 3, 4 e 5.

  3. Calcola il minimo locale di tutte queste griglie [fp]. Chiama questo [f]. Ecco un esempio

    figura 2

  4. Confrontando [f] con ciascun [fp], a ciascuna cella della griglia assegnare l'identificatore della prima p per cui [f]> = [fp]. (Questo può essere fatto in un solo passaggio con un'operazione nella posizione più bassa , per esempio.)

    Figura 3

    (Dubito che esista un algoritmo ovunque che calcolerà una soluzione in formato vettoriale per questa funzione di ponderazione f.)

Ovviamente se hai più di una manciata di punti p , lo scriverai e se il loro numero si esaurisce in migliaia probabilmente abbandonerai il tentativo come non fattibile dal punto di vista computazionale (anche se ci sono modi per accelerare il calcolo affiancandolo).

Un altro esempio, che mostra poligoni di Thiessen su un ellissoide, appare su /gis//a/17377/ .


3
+1 Non ho mai capito quanto questo problema diventi più facile adottando un approccio raster.
Kirk Kuykendall,

Whuber: processo molto sofisticato! Tuttavia, per concentrarmi sulla mia applciation; ogni punto del mio file di input rappresenta il centesimo approssimativo di un pacco di terra. Creo usando quella riga di script annotata sopra un file poligoni di Thiessen vettoriale. A ogni poligono viene assegnato uno spazio, ovvero una dimensione basata sul principio dei poligoni thiessen di uguale distanza dei confini. D'altra parte, ogni parcella di terra ha una dimensione predefinita che viene fornita nel campo area; e questo è il fattore che voglio prendere in considerazione, in quanto i poligoni saranno proporzionalmente a questo fattore. Qualche idea per favore?
Demetris,

Non capisco le tue osservazioni, Demetris. Sembrano che tu voglia davvero un cartogramma di area piuttosto che una raccolta di poligoni di Thiessen. Aiuterebbe a spiegare perché stai calcolando questi poligoni. Quale problema risolveranno? Come saranno interpretati?
whuber

Whuber: Ciascuno dei miei punti inseriti nel processo del poligono di Thiessen rappresenta il centroide approssimativo di un nuovo set di pacchi di terra. Quindi, creo poligoni thiessen basati su questi punti che rappresentano la forma di un appezzamento di terra (un appezzamento di terra punto-uno). Posso produrre molti set di forme di pacchi di terra casuali spostando questi punti per alimentare il mio algoritmo genetico. Il problema è che queste forme di pacchi generate (ovvero poligoni di Teessen) dovrebbero avere un'area predefinita e mi chiedo se sia possibile tenerne conto quando si utilizza l'operazione di poligoni di Thiessen. Spero che abbia senso.
Demetris,

Cosa sta tentando di fare il tuo algoritmo genetico? Sembra ancora che tu non abbia bisogno di poligoni di Thiessen ponderati: credo che non esista alcuna ponderazione possibile che assicuri ai poligoni di raggiungere aree prespecificate o addirittura aree relative prespecificate.
whuber

10

Quello che vuoi è un diagramma Voronoi ponderato: http://en.wikipedia.org/wiki/Weighted_Voronoi_diagram noto anche come tessellazione circolare di Dirichlet quando fatto con pesi moltiplicativi su un piano 2d. Qualcuno sembra aver creato un'estensione arcgis 9 per crearli: http://arcscripts.esri.com/details.asp?dbid=15481 Con una guida per l'utente disponibile qui http://geography.unt.edu/~pdong/software .htm e un documento pubblicato a Dong, P., 2008. Generazione e aggiornamento di diagrammi Voronoi ponderati in modo moltiplicativo per le caratteristiche di punti, linee e poligoni in GIS. Computer e geoscienze, Volume 34, Numero 4, Pagine 411-421.

C'è un recente articolo su un algoritmo basato su vettori (suppongo che l'algoritmo di P Dong sia basato su raster) per questo. http://www.sciencedirect.com/science/article/pii/S0098300411003037 L' estratto dice che il codice c # è incluso.


1
Blord-castillo: Mille grazie per tutte queste informazioni. È molto utile e lo accetterò come una risposta completa. Tuttavia, il mio nuovo problema è che desidero eseguire quello strumento nel mio codice per diverse volte fornendo input come ad esempio la riga di script sopra. È possibile?
Demetris,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.