[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