Velocizzare una JOIN tabellare usando ogr2ogr
A cura di
Totò Fiandaca
| issue
#235
| guida/e
Andrea Borruso
Caso d’uso
Il seguente costrutto permette di fare una join tabellare tra uno shapefile e una tabella dbf; entrambi i file hanno meno di 3000 record, ma la join impiega oltre 40 secondi in ambiente linux wsl (Ubuntu 20.04) o su OSGeo4W Shell:
time ogr2ogr -progress -sql "select s.AC_VEI_SED AS AC_VEI_SED, s.ClassREF AS ClassREF, t.ZON_IN_TY AS ZON_IN_TY, t.ID AS ID, t.FONTE AS FONTE, t.LIVELLO AS LIVELLO from butta15a_Dissolve1 s left join './id15a_to_ZON_IN_12113_t.dbf'.id15a_to_ZON_IN_12113_t t on s.FIRST_SubR = t.SubRegID" ./shape_join4.shp ./butta15a_Dissolve1.shp
lanciata da una cartella qualsiasi di Windows.
Soluzione in ambiente WSL
Il kernel linux sotto wsl, è ottimizzato per girare nelle cartelle linux di wsl, quindi occorre creare (mkdir -p tmp
) una cartella tmp
nella home
(cd ~
) e spostarci dentro i file e rilanciare da qui lo script di sopra:
impiega meno di 4 secondi!!!
Soluzione con mapshaper
ogr2ogr non è veloce per fare le join soprattutto se uno dei file è un dbf
, quindi proviamo a convertire il file in csv
:
ogr2ogr -f "CSV" id15a_to_ZON_IN_12113_t.csv id15a_to_ZON_IN_12113_t.dbf
e poi con mapshaper
:
mapshaper butta15a_Dissolve1.shp -join id15a_to_ZON_IN_12113_t.csv keys=FIRST_SubR,SubRegID string-fields=FIRST_SubR,SubRegID -o out.shp
il risultato è incredibilmente veloce:
meno di un secondo!!!