Estrarre i nomi dei layer presenti in un filegdb
A cura di
Totò Fiandaca
| issue
#242
| guida/e
Andrea Borruso
Totò Fiandaca
Caso d’uso
Dato un FileGDB DBGT_10K_22_V01.gdb (pesa circa 5 GB con oltre 300 tabelle, relazioni e domini), che contiene semplici tabelle e tabelle con attributi geometrici e domini di campo. Estrarre i nomi dei layer e suddividerli per tipologia, in particolare usando la geometry type, sotto un esempio:
Con ogrinfo
è possibile estrarre - da un FileGDB - la lista dei layer presenti (sotto output classico):
ogrinfo -so DBGT_10K_22_V01.gdb
INFO: Open of `DBGT_10K_22_V01.gdb'
using driver `OpenFileGDB' successful.
Layer: SP_ACQ_SP_ACQ_NOM_T (None)
Layer: ARGINE (None)
Layer: GZ_FER_GZ_FER_TY (None)
Layer: INVASO_INVASO_NOM_T (None)
Layer: GZ_CIC_GZ_CIC_TY (None)
Layer: CS_MAR_CS_MAR_LIN_CS_MAR_NOM_T (None)
Layer: ND_GAS_ND_GAS_TY (None)
Layer: SV_FER_SV_FER_FUN (None)
Layer: SV_FER_SV_FER_NOM_T (None)
...
Group SARDEGNA_DBGT:
Layer: CANALE_CANALE_BSU_L (3D Measured Multi Line String)
Layer: AR_VRD_AR_VRD_SUP_L (3D Measured Multi Line String)
Layer: CANALE_CANALE_PER (3D Measured Multi Line String)
Layer: AC_CIC_AC_CIC_SUP_SR (3D Multi Polygon)
Layer: AR_VRD_AR_VRD_SUP (3D Multi Polygon)
...
Group SIMBOLOGIA:
Layer: SIMBOLOGIA_ARC (3D Measured Multi Line String)
Layer: SIMBOLOGIA_PLG (3D Measured Multi Polygon)
Layer: SIMBOLOGIA_PTS (3D Measured Point)
dalla lista si nota che ci sono quattro tipologie di oggetti:
- None;
- Line;
- Point;
- Polygon.
Soluzione classica
usando il classico output di ogrinfo
:
#!/bin/bash
set -x
set -e
set -u
set -o pipefail
# lista.txt:
# ogrinfo -so "D:\GitHub\ESRI_FileGeodatabase_GDAL\dati\DBGT_10K_22_V01.gdb"
# crea cartella di output
mkdir -p ./output2
# per ogni oggetto
for i in None Line Point Polygon; do
<lista.txt grep $i | sed -E 's/ {0,}//' | sed -E 's/Layer: (.+) \(.+$/\1/'>output2/classe_$i.txt
done
output:
sono quattro file txt, uno per ogni geometry type:
- classe_None.txt;
- classe_Line.txt;
- classe_Point.txt;
- classe_Polygon.txt.
dove:
sed -E 's/ {0,}//'
, cancella eventuali spazi iniziali;sed -E 's/Layer: (.+) \(.+$/\1/'
elimina la parte iniziale e finale della stringa di output classico (Layer: AR_VRD_AR_VRD_SUP_L (3D Measured Multi Line String), mantenendo solo il nome effettivo del layer.
Soluzione moderna
usando il nuovo formato di output di ogrinfo
, ovvero json
:
<out.json jq -c '.layers[]|{name:.name,geom_type:(if (.geometryFields|length) > 0 then .geometryFields[].type else "none" end) }' | mlr --ijsonl --ocsv unsparsify
estrae la lista del layer:
dove:
jq -c '.layers[]|{name:.name,geom_type:(if (.geometryFields|length) > 0 then .geometryFields[].type else "none" end) }'
estrae la lista dei layer e verifica se la lunghezza del campogeometryFields
è >0, in caso contrario assegna valorenone
;mlr --ijsonl --ocsv unsparsify
converte da jsonl a csv e sistema bene l’output.
per ottenere i quattro file, uno per ogni geometry_type:
#!/bin/bash
set -x
set -e
set -u
set -o pipefail
# out.json:
# ogrinfo -so -json "D:\GitHub\ESRI_FileGeodatabase_GDAL\dati\DBGT_10K_22_V01.gdb"
# crea cartella di output
mkdir -p ./output2
# per ogni oggetto
for i in none Line Point Polygon; do
<out.json jq -c '.layers[]|{name:.name,geom_type:(if (.geometryFields|length) > 0 then .geometryFields[].type else "none" end) }' | mlr --ijsonl --ocsv unsparsify then filter '$geom_type=~"^.{0,}'"$i"'.{0,}$"'>output2/classe_$i.txt
done
Dati
- DBGT_10K_22_V01.gdb file pesante +5 GB
- lista.txt - output classico ogrinfo
- out.json - output moderno ogrinfo
Riferimenti utili
- ogr2ogr: https://gdal.org/programs/ogr2ogr.html
- jq: https://stedolan.github.io/jq/
- Miller (mlr): https://miller.readthedocs.io/
- piccolo gioiello eterogeneità dati