[Gvsig_italian] Calcolo distanza tra i vertici di un poligono

Antonio Falciano afalciano a yahoo.it
Ven 4 Dic 2009 14:11:42 PST


enricofiore a libero.it ha scritto:
> Ciao,
> ho fatto alcune prove utilizzando i passaggi suggeriti:
> 1) creo file di punti --> Nella tabella attributi è presente il campo
> "Object" che identifica con un codice il poligono a cui essi appartengono
> 2) calcolo della minima circonferenza circoscritta. E qui ho avuto dei
> problemi.
> Se cerco di fare disegnare un cerchio per ogni poligono presente nel
> piano, selezionando lo shape file di punti, il campo Object della
> tabella dello shape e spuntando l'opzione "Create one polygon for each
> class" , il comando mi restituisce uno shape file vuoto. Se invece
> seleziono i punti appartenenti ad un singolo poligono, il cerchio viene
> creato.
> 
> Sbaglio qualcosa o non è possibile fare disegnare i cerchi per tutti i
> poligoni presenti nello shape file in un unico passaggio?
> 
> Spero di essermi spiegato bene

Ti sei spiegato bene: purtroppo il tool e' bacato (inserito oggi nel bug
tracker), non dipende da te. Nel frattempo, un modo per aggirare i vari
bug e risolvere comunque il problema consiste nel mettere a sistema
questo recente post [1] con l'approccio della circonferenza minima
circoscritta, anche se l'intera procedura diventa un po' piu' articolata.
Nel dettaglio, ripartendo dall'inizio:
1) definisci un campo ID intero univoco nella tabella degli attributi
associata al layer dei poligoni;
2) estrai i vertici dal layer dei poligoni ed esporta come shp;
3) definisci un batch script per separare i vertici di ogni poligono [1]
con ogr2ogr (v. esempio 1) ed eseguilo nella stessa cartella contenente
lo shp dei vertici, otterrai n shp contenenti i vertici di ciascun poligono;
4) tramite la console di Beanshell (linguaggio scripting di Sextante)
calcola in maniera iterativa la circonferenza minima circoscritta ad
ogni poligono (v. piu' in basso);
5) esegui il merge di tutte le circonferenze in un unico shp;
6) definisci e calcola un campo dei diametri come 2*sqrt(area()/pi());
7) esegui l'unione (join) tra la tabella degli attributi dei poligoni
iniziali e quella del layer delle circonferenze utilizzando l'ID dei
poligoni, come campo in comune;
8) esporta il layer precedentemente ottenuto;
9) puoi calcolare finalmente l'UFI!

######
Con riferimento al punto 4), se i poligoni separati sono contenuti in
{0,1,2,...,n}.shp ti bastera' adattare al tuo caso le seguenti
istruzioni, sostituendo il numero dei poligoni:

n=100; // numero di poligoni (e di layer)
for (i=0; i<n; i++)
    runalg("minimumenclosingpolygon", i + ".shp", "0", "1", "false", "#");

... e compariranno a raffica tutte le circonferenze desiderate!
######

Ho provato velocemente l'intera procedura e posso assicurarti che
va a buon fine. Si tratta di un bel esercizio, molto utile a livello
didattico (...e non solo!), che spinge ad utilizzare la riga di comando
di Sextante. Buon lavoro!

ciao
Antonio

[1]
https://gvsig.org/lists/pipermail/gvsig_italian/2009-November/000941.html

-- 
Antonio Falciano
http://www.linkedin.com/in/antoniofalciano





More information about the Gvsig_italian mailing list