[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