[Gvsig_italian] Separate entities

Antonio Falciano afalciano a yahoo.it
Sab 21 Nov 2009 00:06:29 PST


Pietro Musella ha scritto:
> Ho la necessità di creare tanti shape quanti sono i valori di un
> determinato campo. Ho provato ad adoperare Sextante in gvSIG 1.9
> utilizzando “Separate entities” nei Tools for vector layers, ma ottengo
> degli shape (*VUOTI*) il cui nome è così composto:
[...]

Ottima segnalazione! Il tool e' decisamente bacato (analogamente ad
altri tool sui layer vettoriali) e ho quindi provveduto a segnalarlo nel
bug tracker di Sextante [1]. L'invito a fare altrettanto e' naturalmente
esteso a tutti, nel caso individuaste qualche altro problema con Sextante.
Un approccio alternativo consiste nell'utilizzare il tool ogr2ogr della
libreria GDAL (FWTools [2] su win). Si potrebbe creare un batch script che,
iterando sulle feature dello shapefile in ingresso, restituisca tanti
shapefile quante sono le entita' geografiche che soddisfano una
particolare condizione (da esprimere mediante una clausola where) basata
su un determinato attributo.
1) Supponiamo ad es. che il tuo campo di interesse sia il campo ID (intero,
associato univocamente ad ogni feature) e che tu voglia estrarre solo le
entita' geografiche con ID compreso tra 5 e 100. Basta creare un file
batch nella stessa directory dello shapefile in ingresso, ad es.
separate_entities.bat, contenente la seguente istruzione:

for /L %%i in (5,1,100) do ogr2ogr -where "ID=%%i" %%i.shp input.shp

dove input.shp e' il layer in ingresso e i.shp e' l'i-esimo layer in uscita.
2) Se, invece, il campo e' di tipo stringa, bastera' sostituire la sequenza
di numeri nel ciclo con la lista dei valori, appoggiandosi
preferibilmente ad un file esterno (soprattutto nel caso in cui i valori
siano tanti), ad es. lista.txt:

for /F %%i in (lista.txt) do ogr2ogr -where "CAMPO=%%i" %%i.shp input.shp

3) Se, infine, volessi estrarre tutte le feature contenute nello shp,
invece dell'opzione -where, conviene utilizzare -fid (che sta per
feature id) seguito dalla variabile i, da iterare stavolta da 0 a n-1,
dove n e' il numero complessivo delle feature. Se, ad es., n=100

for /L %%i in (0,1,99) do ogr2ogr -fid %%i %%i.shp input.shp

Analogo e' il discorso in bash. Il primo caso diventa:

#!/bin/bash
for i in $(seq 5 1 100)
do
   ogr2ogr -where "ID=$i" $i.shp input.shp
done

... e cosi' via.

ciao
Antonio

[1] http://forge.osor.eu/tracker/?func=browse&group_id=13&atid=372
[2] http://fwtools.maptools.org/

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





More information about the Gvsig_italian mailing list