[Gvsig_italian] Calcolo distanza tra i vertici di un poligono

enricofiore a libero.it enricofiore a libero.it
Mar 15 Dic 2009 06:57:07 PST


Ciao, 
scusa se insisto con queste cose, ma lavorandoci sopra mi sono accorto 
di alcuni "problemi".

1) sono arrivato a calcolare l'area dei cerchi 
utlizzando il comando area(), che però risulta avere valori negativi, come è 
possibile? (Il campo Area da me crato è impostato come Double)
Ho fatto lo 
stesso il calcolo del diametro, ponendo il segno negativo davanti ad area(), 
come segue
                                        2*sqrt(-area()/pi())
il 
diametro risultante è corretto, almeno misurando manualmente il diametro di 
alcuni cerchi

2) Inoltre nella creazione del minimo cerchio circoscritto, 
Sextante assegna ad ogni cerchio creato lo stesso valore di ID, tutti i file .
shp hanno come attributo ID = 1. E quindi poi non riesco a  fare il Join tra le 
due tabelle. ma anche questo non è un problema ai fini dei miei calcoli, ma 
potrebbe esserlo per altri utilizzi.

Grazie ancora per l'aiuto
Enrico

------------------------------------------------------------------------------


Rinvio anche le osservazioni fatte precedentemente:

Segnalo alcune piccole 
variazioni che ho effettuato, per fare alcune prove (forse possono tornare 
utili):

nel file batch [1] ho fatto in modo che oltre a numerare i file .shp 
in output, gli assegnasse un prefisso (es: codice ISTAT del comune di 
riferimento):

for /L %% i in (1,1,70) do ogr2ogr -where "ID=%%i" CodISTAT_%%i.
shp 001047V.shp

Ho fatto anche alcune piccole modifiche allo script da 
utilizzare con BeanShell, l'originale era:

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


1) ho impostato i=1 e i<=n; dato che la numerazione 
dei file partiva da 1 e per non perdermi un file di output;
2) dato che il nome 
del file di input è composto da "codice ISTAT _ n°", ho modificato l'ultima 
riga in modo che
prendesse i file così nominati;

3) al posto del "#"  ho 
inserito il percorso dove salvare il file e aggiungendo il contatore (+ i) in 
modo che numerasse
anche gli output:

l'ultima riga risulta così modificata:


runalg ("minimumenclosingpolygon", "codice_" + i + ".shp", "0", "1", "false", 
"C:/Dati/nomefile_" + i)

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







----
Messaggio originale----
Da: afalciano a yahoo.it
Data: 04/12/2009 23.11
A: 
"enricofiore a libero.it"<enricofiore a libero.it>, "Lista di distribuzione in 
lingua italiana orientata sia agli utenti che agli sviluppatori"
<gvsig_italian a lists.gvsig.org>
Ogg: Re: [Gvsig_italian] Calcolo distanza tra i 
vertici di un poligono

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