Importare shapefile in un db.sqlite utilizzando la shell

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:


#!/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

view raw

import.sh

hosted with ❤ by GitHub

cartella di esempio con 5 shapefile:

N1
cartella con 5 shp – 20 file

 

 

 

 

Installando QGIS nel PC verrà installato anche il terminale MSYS:

N2

avviato, si presenterà cosi in attesa di un comando:

N3
shell MSYS

lo script ‘import.sh‘ occorre eseguirlo dalla cartella che contiene gli *.shp e lo script stesso, quindi dobbiamo portarci nella giusta cartella:

  1. copiare il percorso della cartella (es: C:/giuseppe/pill/coreglia_a/test); NB: utilizzare / e non \;
  2. incollare il percorso in un notepad ed aggiungere cd  davanti al percorso ( cd C:/giuseppe/pill/coreglia_a/test );
  3. copiate tutto e andate nella shell, posizionatevi con il mouse dopo il $ e pigiate il tasto destro del mouse per incollare il percorso;N4
  4. dopo INVIO, vi ritroverete all’interno della cartella utile al nostro scopo:N5
  5. digitiamo, ora, il nome del file ‘import.sh‘ e INVIO:N6
  6. dopo l’invio verrà visualizzato una serie di stringhe che ci aggiorna sull’esecuzione dello script:N7
  7. fatto; ha importato gli shapefile nel database (se esistente, altrimenti lo crea in automatico);
  8. N8
  9. ecco il database spatialite con le 5 tabelle spaziali: N9

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

 

 

 

15 pensieri su “Importare shapefile in un db.sqlite utilizzando la shell

    1. 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"

  1. 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"

    1. 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"

  2. 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

    Piace a 1 persona

  3. 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"

    1. 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:


      #!/bin/bash
      # attivo il debug così vedo cosa avviene nella shell
      set -x
      # per ogni file sqlite contenuto contenuto nella cartella dello script, esegue
      # l'export in shp nella cartella output
      for i in *.sqlite;
      do ogr2ogr -f "ESRI Shapefile" output ./"$i";
      done

      ciao

      "Mi piace"

  4. 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.

    Piace a 1 persona

  5. 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

    Piace a 1 persona

    1. 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"

Lascia un commento

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.