Quando si lavora con molti shapefile, prima o poi, nasce l’esigenza di utilizzare un database spatialite per evitare, quanto meno, il numero esagerato di file e lavorare con uno solo.
Vediamo come importare tutti gli shapefile (*.shp) presenti in una cartella in un database spatialite facendo uso della potenza della linea di comando shell di MSYS:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# attivo il debug così vedo cosa avviene nella shell | |
set -x | |
# per ogni file shp contenuto nella cartella dello script, esegue | |
# l'import nel file spatialite denominato out.sqlite | |
for i in *.shp; | |
do ogr2ogr -append -f SQLite -dsco SPATIALITE=YES out.sqlite ./"$i"; | |
done |
cartella di esempio con 5 shapefile:

Installando QGIS nel PC verrà installato anche il terminale MSYS:
avviato, si presenterà cosi in attesa di un comando:

lo script ‘import.sh‘ occorre eseguirlo dalla cartella che contiene gli *.shp e lo script stesso, quindi dobbiamo portarci nella giusta cartella:
- copiare il percorso della cartella (es: C:/giuseppe/pill/coreglia_a/test); NB: utilizzare / e non \;
- incollare il percorso in un notepad ed aggiungere cd davanti al percorso ( cd C:/giuseppe/pill/coreglia_a/test );
- copiate tutto e andate nella shell, posizionatevi con il mouse dopo il $ e pigiate il tasto destro del mouse per incollare il percorso;
- dopo INVIO, vi ritroverete all’interno della cartella utile al nostro scopo:
- digitiamo, ora, il nome del file ‘import.sh‘ e INVIO:
- dopo l’invio verrà visualizzato una serie di stringhe che ci aggiorna sull’esecuzione dello script:
- fatto; ha importato gli shapefile nel database (se esistente, altrimenti lo crea in automatico);
- ecco il database spatialite con le 5 tabelle spaziali:
Note finali: affinché ogni tabella (ex-shapefile) importata in spatialite abbia il suo SRS occorre che esista, nella cartella di partenza, il relativo file .prj; aggiungo che, le estensioni dei vari file dello shapefile devono essere tutti minuscoli o MAIUSCOLI (.shp, shx, dbf. .prj; .SHP, SHX, .DBF, PRJ) altrimenti il terminale non li riconosce.
VIDEO:
Buon lavoro!!!
Ringraziamenti:
Andrea Borruso, per lo script e la pazienza!!!
La Mailing List QGIS ITA
Come al solito “stupefacente”!! ma …domanda posta da un mio collega su FB…per le vestizioni come dovremmo fare?
"Mi piace""Mi piace"
Ciao,
le vestizioni dipendono dal software GIS che usi: es: se usi QGIS è possibile creare un file .qml che contiene la vestizione del layer, ma è un file che legge solo QGIS; esistono altri formati di intescambio tipo SLD ma non sempre sono compatibili tra i vari software GIS in quanto NON esiste uno standard sulle vestizioni.
Detto ciò è possibile salvare in un database (spatilite o postgis) lo stile dei vari layer in una tabella particolare ‘layer_styles’ in formato xml; per far ciò basti tematizzare un layer (proveniente da un database) e poi, dalle proprietà del layer, salva stile nel database.
Rendere automatico questo processo, come descritto per gli shapefile, non ho mai avuto la necessità di farlo.
ciao
"Mi piace""Mi piace"
Bellissimo. Ho però un problema: non trovo MSYS. Ricordo che quando minstallai le prime versioni di QGis in effetti mi figurava questa misteriosa icona di MSys, ma all’epoca ero alle primissime armi e QGis mi avanzava e mi bastava. Adesso ho installato la versione 2.18.9 e mi sono accorto che Msys non c’è più. Come posso fare? E’ nascosto da qualche parte o devo installarlo come cosa aggiuntiva? Grazie.
"Mi piace""Mi piace"
Strano che non trovi l’applicativo, forse non compare più l’icona: prova a cercarlo in QGIS/apps/msys
io ormai uso la versione OSGeo4W e non so più cosa accade nella standalone 😉
"Mi piace""Mi piace"
Per chi utilizzasse ubuntu o derivate può provare con questo script (da utilizzare nello stesso modo spiegato dall’incomparabile Totò, che ringrazio per il suo prezioso servizio di divulgazione):
#!/bin/bash
for f in `ls *.shp`
do
echo “Append shapefile ” $f ” …..”
ogr2ogr -update -append output.sqlite $f -f “SQLite” -dsco SPATIALITE=YES -a_srs “EPSG:3003”
done
"Mi piace"Piace a 1 persona
Grazie,
ma cosa significa “….”?
"Mi piace""Mi piace"
Viene visualizzata la scritta “Append shapefile nomedelfile …..”
"Mi piace"Piace a 1 persona
ciao
io ho il problema contrario. devo convertire da sqlite a shp (ho una serie di data base spaziali sqlite e devo convertirli)
mi potete aiutare?
"Mi piace""Mi piace"
ciao,
ho creato un altro script che esporta tutte le tabelle di un db sqlite in shapefile.
segui tutti i passaggi dell articolo utilizzando questo script:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
export_in_shp.sh
hosted with ❤ by GitHub
ciao
"Mi piace""Mi piace"
Ciao, molto interessante!
Una variante possibile sempre tramite la shell, per la FUSIONE di tutti gli shp in un unico layer?
(Gli shp ovviamente con la medesima struttura tabellare).
Es: ho centinaia di shp di particelle catastali da fondere in un unico layer sqlite.
"Mi piace"Piace a 1 persona
Ciao,
prova con questo:
https://github.com/pigreco/CLI-riga-di-comando-/blob/master/merge_shp.sh
"Mi piace""Mi piace"
Ho trovato un metodo alternativo (problemi di shell) usando solo sql spatialite:
–FUSIONE MASSIVA DI PIU SHAPEFILES IN UN LAYER SPATIALITE
–1) crea la tabella geometrica contenitore:
create table fusion
(pt_type text,
pt_code text,
pt_ccat integer,
pt_fabb text);
select addgeometrycolumn(‘fusion’,’geom’,3044,’polygon’,2);
–2) elenca tutti gli shp che vuoi importare e mergiare:
create virtual table “001_vl_parcel_poly”
using virtualshape(‘c:\test\001_vl_parcel_poly’, ‘utf-8′, 3044);
insert into fusion (pt_type, pt_code, pt_ccat, pt_fabb, geom)
select pt_type, pt_code, pt_ccat, pt_fabb, geometry
from “001_vl_parcel_poly”;
delete from virts_geometry_columns where virt_name=’001_vl_parcel_poly’;
drop table “001_vl_parcel_poly”;
create virtual table “002_vl_parcel_poly”
using virtualshape(‘c:\test\002_vl_parcel_poly’, ‘utf-8′, 3044);
insert into fusion (pt_type, pt_code, pt_ccat, pt_fabb, geom)
select pt_type, pt_code, pt_ccat, pt_fabb, geometry
from “002_vl_parcel_poly”;
delete from virts_geometry_columns where virt_name=’002_vl_parcel_poly’;
drop table “002_vl_parcel_poly”;
create virtual table “003_vl_parcel_poly”
using virtualshape(‘c:\test\003_vl_parcel_poly’, ‘utf-8′, 3044);
insert into fusion (pt_type, pt_code, pt_ccat, pt_fabb, geom)
select pt_type, pt_code, pt_ccat, pt_fabb, geometry
from “003_vl_parcel_poly”;
delete from virts_geometry_columns where virt_name=’003_vl_parcel_poly’;
drop table “003_vl_parcel_poly”;
–3) crea indice spaziale per velocizzare la visualizzazione:
select createspatialindex(‘fusion’,’geom’);
vacuum
"Mi piace"Piace a 1 persona
Grazie.
"Mi piace""Mi piace"
A me viene fuori sempre la scritta “ogr2ogr: comando non trovato”
Come si aggiunge questo comando?
"Mi piace"Piace a 1 persona
Ciao, in che ambiente lanci lo script suggerito??
Normalmente ogr2ogr è già presente nella shell di MSYS
Poi, scrivi maggiori dettagli altrimenti non posso aiutarti:(sistema operativo usato, shell usata, versione di QGIS ecc…)
"Mi piace""Mi piace"