Skip to content

GDAL & OGR. Esempi d'uso

Stefano Campus edited this page May 23, 2022 · 24 revisions

GDAL

GDAL è una libreria di traduzione per i formati di dati geospaziali raster e vettoriali, rilasciata sotto licenza Open Source MIT dalla Open Source Geospatial Foundation . Come libreria, presenta all'applicazione chiamante un singolo modello astratto di dati raster e un singolo modello astratto di dati vettoriali per tutti i formati supportati. È inoltre dotata di una serie di utility a riga di comando per la traduzione e l'elaborazione dei dati.

In questa pagina, presentiamo una serie di utilizzi delle librerie GDAL e OGR pronti per l'uso, adatti a risolvere molti dei casi che normalmente si possono incontrare nella gestione dei dati spaziali in formato raster e vettoriali.

Chiunque può aggiungere, correggere, apportare modifiche e migliorare il corpus di esempi qui riportati. Dato il fine didattico della raccolta, si raccomanda di descrivere e commentare il più possibile le soluzioni proposte.

Si ringrazia per il contributo:

  • Simone Falceri.
  • Simone Parmeggiani.
  • Stefano Campus.
  • Salvatore Fiandaca

OGR --> gestione di dati vettoriali

Esempi di conversione

DA POSTGRESQL A SPATIALITE (1 LAYER)

ogr2ogr -f SQLITE "c:\temp\mio_db.sqlite" PG:"host=nomeserver port=5432 dbname=nomedatabase schemas=nomeschema user=nomeutente password=miachiave" -sql "select * from table" -dsco SPATIALITE=YES -lco SPATIAL_INDEX=YES -lco LAUNDER=YES -lco GEOMETRY_NAME=geo -nln nome_tabella_uscita

DA POSTGRESQL A SPATIALITE (TUTTI I LAYER)

ogr2ogr --config PG_LIST_ALL_TABLES YES --config PG_SKIP_VIEWS NO -f SQLITE "c:\temp\mio_db.sqlite" PG:"host=nomeserver port=5432 dbname=nomedatabase schemas=nomeschema user=nomeutente password=miachiave" -dsco SPATIALITE=YES -lco SPATIAL_INDEX=NO -lco LAUNDER=YES

DA SPATIALITE A POSTGRESQL (1 LAYER)

ogr2ogr -f "PostgreSQL" PG:"host=nomeserver port=5432 dbname=nomedatabase schemas=nomeschema user=nomeutente password=miachiave" "C:\temp\mio_db.sqlite" -append -sql "select * from table" -lco GEOMETRY_NAME=geo -nln nome_tabella_uscita

DA SPATIALITE A POSTGRESQL (TUTTI I LAYER)

ogr2ogr --config SQLITE_LIST_ALL_TABLES YES -f "PostgreSQL" PG:"host=nomeserver port=5432 dbname=nomedatabase active_schema=nomeschema schemas=nomeschema user=nomeutente password=miachiave" "C:\temp\mio_db.sqlite" -overwrite -lco SCHEMA=nomeschema -lco GEOMETRY_NAME=geo -lco SPATIAL_INDEX=YES

DA POSTGRESQL A POSTGRESQL (1 LAYER)

ogr2ogr -f "PostgreSQL" PG:"host=nomeserver_new port=5432 dbname=nomedatabase_new schemas=nomeschema_new user=nomeutente password=miachiave" PG:"host=nomeserver_old port=5432 dbname=nomedatabase_old schemas=nomeschema_old user=nomeutente password=miachiave" nome_tabella_ingresso -nln nome_tabella_uscita

DA SPATIALITE A SPATIALITE (1 LAYER)
ogr2ogr -f SQLITE "c:\temp\db_uscita.sqlite" "c:\temp\db_ingresso.sqlite" -sql "select * from table" -dsco SPATIALITE=YES -lco SPATIAL_INDEX=YES -lco LAUNDER=YES -lco GEOMETRY_NAME=geo -nln nome_tabella_uscita

DA SHP A DXF 3D
ogr2ogr -f DXF "c:\temp\3Doutput.dxf" "c:\temp\contour.shp" -zfield ELEV

DA MDB A SPATIALITE
ogr2ogr -f SQLITE "c:\temp\test.sqlite" "c:\temp\official.mdb" -overwrite -dsco SPATIALITE=YES -lco LAUNDER=YES

DA DBF A POSTGRES
ogr2ogr -f "PostgreSQL" PG:"host=myserver user=myusername dbname=mydbname password=mypassword" sometable.dbf -nln "nometabella"

DA SPATIALITE A KML (1 LAYER)
ogr2ogr -f KML -mapFieldType Integer64=Integer "c:\temp\layer.kml" "c:\temp\mio_db.sqlite" -sql "select * from table" -dsco NameField=nomecampo -nln nome_tabella_uscita

DA POSTGRESQL A KML (1 LAYER)
ogr2ogr -f KML -mapFieldType Integer64=Integer "c:\temp\layer.kml" PG:"host=nomeserver port=5432 dbname=nomedatabase schemas=nomeschema user=nomeutente password=miachiave" -sql "select * from table" -dsco NameField=nomecampo -nln nome_tabella_uscita

DA POSTGRESQL A GEOJSON (1 LAYER)
ogr2ogr -f GeoJSON "c:\temp\nomefile.json" PG:"host=nomeserver port=5432 dbname=nomedatabase schemas=nomeschema user=nomeutente password=miachiave" -sql "select * from table" -lco COORDINATE_PRECISION=2 -nln nome_tabella_uscita

DA SHP MULTIPOLYGON A POSTGRESQL
ogr2ogr -f "PostgreSQL" PG:"host=nomeserver port=5432 dbname=nomedatabase schemas=nomeschema user=nomeutente password=miachiave" "C:\temp\multipoligoni.shp" -overwrite -lco GEOMETRY_NAME=geo -nlt PROMOTE_TO_MULTI -nln nome_tabella_uscita

DA SHP A MYSQL (NOTA: Se MySQL non ha geometry_column e spatial_ref_sys_table, vengono create in automatico)
ogr2ogr -f "MySQL" MYSQL:"mydb,host=myhost,user=mylogin,password=mypassword,port=3306" -nln "out_name" -a_srs "EPSG:4326" path/to/my_shape.shp

DA ZIPSHP A SPATIALITE
ogr2ogr -f SQLITE "C:\_OPENSTREETMAP\OpenStreetMap.sqlite" /vsizip/c:\nord-est-latest-free.shp.zip -dsco SPATIALITE=YES -lco GEOMETRY_NAME=geo -lco LAUNDER=YES -nlt PROMOTE_TO_MULTI

DA ZIPSHP A GPKG
ogr2ogr -f GPKG "C:\_OPENSTREETMAP\OpenStreetMap.gpkg" /vsizip/c:\nord-est-latest-free.shp.zip -nlt PROMOTE_TO_MULTI

DA GPKG A SPATIALITE
ogr2ogr -f SQLITE "C:\temp\mio_db.sqlite" "C:\temp\nomedatabase_ingresso.gpkg" -overwrite -dsco SPATIALITE=YES -lco LAUNDER=YES

DA SHP A POSTGRESQL (1 LAYER)
ogr2ogr -f "PostgreSQL" PG:"host=nomeserver port=5432 dbname=nomedatabase schemas=nomeschema user=nomeutente password=miachiave" "C:\temp\shapefile.shp" -overwrite -lco GEOMETRY_NAME=geo -nlt POINT -nln nome_tabella_uscita ogr2ogr -f "PostgreSQL" PG:"host=nomeserver port=5432 dbname=nomedatabase schemas=nomeschema user=nomeutente password=miachiave" "C:\temp\shapefile.shp" -overwrite -sql "select field1, field2, field3 from shapefile" -lco GEOMETRY_NAME=geo -nlt POINT -nln nome_tabella_uscita

DA XLSX A POSTGRESQL
ogr2ogr -f "PostgreSQL" PG:"host=nomeserver port=5432 dbname=nomedatabase schemas=nomeschema user=nomeutente password=miachiave" "C:\temp\foglio.xlsx" -overwrite -nln nome_tabella_uscita

DA POSTGRESQL A XLSX
ogr2ogr -f XLSX "C:\temp\foglio.xlsx" PG:"host=nomeserver port=5432 dbname=nomedatabase schemas=nomeschema user=nomeutente password=miachiave" -append -sql "select * from table" -nln "foglio_1"

DA POSTGRESQL A XLSX
ogr2ogr -f XLSX "C:\temp\foglio.xlsx" PG:"host=nomeserver port=5432 dbname=nomedatabase schemas=nomeschema user=nomeutente password=miachiave" -append -sql "select * from table" -nln "foglio_2"

DA SPATIALITE A XLSX
ogr2ogr -f XLSX "C:\temp\foglio.xlsx" "C:\temp\mio_db.sqlite" -append nome_tabella_ingresso -nln "Nome Foglio"

DA WEB A GEOJSON
ogr2ogr -f GeoJSON "c:\temp\output.json" "https://www.example.com" OGRGeoJSON -s_srs EPSG:3857 -t_srs EPSG:4326
ogr2ogr -f GeoJSON "c:\temp\output.json" "https://www.example.com" -sql "select id, name, geo from https://www.example.com" -lco COORDINATE_PRECISION=2

FOR IN DO - DA SINGOLI SHP AD UNICO SHP (multishp2shp)
for %f in (C:\temp\*fix_points.shp) do (ogr2ogr -f "ESRI Shapefile" C:\Output\Merged.shp %f -update -append)

FOR IN DO - DA SINGOLI SHP AD UNICO DB SPATIALITE (multishp2spatialite)
for %f in (C:\temp\*fix_points.shp) do (ogr2ogr -f SQLITE C:\Output\mio_db.sqlite %f -update -append -dsco SPATIALITE=YES -lco LAUNDER=YES -lco GEOMETRY_NAME=geo -nlt POINT -nln fix_points)

FOR IN DO - RICONVERSIONE SINGOLI DB SPATIALITE
for %f in (C:\temp\*.sqlite) do (ogr2ogr -f SQLITE C:\Output\*_converted.sqlite %f -dsco SPATIALITE=YES -lco LAUNDER=YES)

FOR IN DO - DA FILE UNICO A SINGOLI FILE DISTINTI (shp2multishp)
::STEP_1) prima genera la lista con i valori distinti degli attributi
ogr2ogr -f CSV "C:\temp\lista_attributi_distinti.csv" "C:\temp\origine.shp" -sql "select distinct nomecampo from origine"
::STEP_2) poi elimina intestazione dal file CSV ed infine esegue il loop
for /f "skip=1 usebackq tokens=1 delims=," %a in ("C:\temp\lista_attributi_distinti.csv") do (ogr2ogr -f "ESRI Shapefile" -where "nomecampo = '%a'" "C:\temp\output_%a.shp" "C:\temp\origine.shp")

FOR IN DO - DA LAYER UNICO A SINGOLI FILE DISTINTI (PG2multishp)
::STEP_1) prima genera la lista con i valori distinti degli attributi
ogr2ogr -f CSV "C:\temp\lista_attributi_distinti.csv" PG:"host=nomeserver port=5432 dbname=nomedatabase schemas=nomeschema user=nomeutente password=miachiave" -sql "select distinct nomecampo from nomeschema.nome_tabella"
::STEP_2) poi elimina intestazione dal file CSV ed infine esegue il loop
for /f "skip=1 usebackq tokens=1 delims=," %a in ("C:\temp\lista_attributi_distinti.csv") do (ogr2ogr -f "ESRI Shapefile" "C:\temp\output_%a.shp" PG:"host=nomeserver port=5432 dbname=nomedatabase schemas=nomeschema user=nomeutente password=miachiave" nomeschema.nome_tabella -where "nomecampo = '%a'")

Esempi di proiezione di dati (le stringhe proj possono essere ricercate su https://spatialreference.org)

DA SHP CON SRS GEOGRAFICO A SHP CON SRS PROIETTATO (IN QUESTO CASO SOUTH AMERICAN LAMBERT CONFORMAL CONIC)

ogr2ogr -f "ESRI Shapefile" -t_srs "+proj=lcc +lat_1=-5 +lat_2=-42 +lat_0=-32 +lon_0=-60 +x_0=0 +y_0=0 +ellps=aust_SA +units=m +no_defs" nome_out.shp nome_in.shp

Esempi aggiornamento attributi

AGGIORNARE UN ATTRIBUTO DI UNO SHAPEFILE

ogrinfo -dialect SQLite -sql "UPDATE nomeshp SET data1='xx' WHERE data2='yyy'" nomeshp.shp 

AGGIORNARE UN ATTRIBUTO DI MOLTI SHAPEFILE PRESENTI IN UNA CARTELLA (OSGeo4W shell)

FOR %f in (*.shp) do (ogrinfo -dialect SQLite -sql "UPDATE %~nf SET data1='xx' WHERE data2='yyy'" %f)

GDAL --> gestione di dati raster

CONVERTIRE RASTER ECW IN GEOTIFF
::Trasforma una immagine raster in formato propietario ecw in un geotiff mantenendo più o meno la stessa dimensione del file, con compressione JPG e creazione del file world. Spazio colore è di tipo YCbCr e interlacciamento tipo Pixel.
gdal_translate -a_srs EPSG:32632 -co COMPRESS=JPEG -co JPEG_QUALITY=75 -co TFW=YES -co INTERLEAVE=PIXEL -co PHOTOMETRIC=YCBCR -of GTiff C:\INPUT\input.ecw C:\OUTPUT\output.tif

CREARE VIRTUAL RASTER
::Creare un raster virtuale da file di testo con la lista dei dati da unire
::STEP 1: Creare file di testo con la lista file da Windows: dalla windows shell spostarsi nella directory coi dati e lanciare il comando:

dir /b *.tif > filelist.txt  

::STEP 2: creare virtual raster

gdalbuildvrt -input_file_list filelist.txt merged.vrt

TRASFORMARE FILE VRT IN TIF :: trasformare un file virtuale in formato GTiff

gdal_translate -of GTiff fileName.vrt fileName.tif -co COMPRESS=DEFLATE -co TILED=YES -co PREDICTOR=2