opendatasicilia / tansignari

"T'ansignari e t'appeddiri"
http://tansignari.opendatasicilia.it
Creative Commons Attribution 4.0 International
18 stars 10 forks source link

Estrarre le tabelle dei domini di campo di un database gdb ESRI #236

Closed pigreco closed 1 year ago

pigreco commented 1 year ago

Database ESRI da oltre 5 GB caratterizzato da centinaia di tabelle (tabelle semplici e tabelle con geometria) con ulteriori tabelle usate come dominio di campo. Queste ultime però non sono presenti direttamente come tabelle nel gdb ma sono impostate come domini e quindi non c'è modo di esportarle se non dopo averle convertite in tabelle. Non riesco a trovare un modo veloce per convertirle in semplici tabelle dbf, dovrei farlo una ad una ma solo oltre 200. QGIS vede e legge questi domini, quindi deduco che deve esserci un modo con ogr di esportarle, ma non trovo nulla on line :-( image

aborruso commented 1 year ago

Ciao Totò, non è quello che ti serve, ma ti puoi estrarre con OGR i valori di dominio associati alla chiave:

ogr2ogr -f "CSV" test.csv test.gdb UNICA_SEZ557070 -resolveDomains

Da quello che capisco, sta a te farti uno script per estrarre tutto, con le singole coppie chiave valore.

pigreco commented 1 year ago

Ho scritto in lista gdal-dev, qui risposta

https://lists.osgeo.org/pipermail/gdal-dev/2023-January/056752.html

aborruso commented 1 year ago

qui risposta

https://lists.osgeo.org/pipermail/gdal-dev/2023-January/056752.html

L'output in JSON consente di fare magie

ogrinfo -json test.gdb UNICA_SEZ557070 | jq -r '.domains|keys[]' | while IFS="" read -r domain;do ogrinfo -json test.gdb | jq -r '.domains.'"$domain"'.codedValues' | mlr --j2c reshape -r '.' -o k,v >"$domain".csv;done

In questo zip gli esempi di output dei tre domini presenti: t.zip

pigreco commented 1 year ago

Usando arcPy: idea presa da qui

script adattato al caso in esame:

import arcpy
arcpy.env.workspace = "D:\cus_sardegna\DBGT_10K_22_V01_original.gdb"
gdb = arcpy.env.workspace
output_path = "D:\cus_sardegna\\tabelle_domini.gdb"
print(output_path)
print("gdb")
arcpy.env.overwriteOutput = True
domains = arcpy.da.ListDomains(gdb)
print('sono arrivato a stampare i domini')
#stampo lista dei domini
#print(domains)
print(len(domains))
count = 1
for domain in domains:
    print('-----------dominio numero :  %s/%s ---------------'  %(count, len(domains)))
    count = count+1
    domain_name = domain.name
    print(domain.name)
    # print(domain.codedValues)
    coded_value_list = domain.codedValues
    print(coded_value_list)
    out_table_name = domain_name.lower()
    print('il nome della tabella diuscita è:')
    print(out_table_name)
    output_complete_path = '%s\\%s' %(output_path, out_table_name)
    print(output_complete_path)
    arcpy.DomainToTable_management(gdb, domain_name, output_complete_path, "code", "descript")

con output su gdb, poi esportato in tabelle dbf e quindi convertite in csv con lo script:

#!/bin/bash

for i in *.dbf;do
  filename=$(basename "$i")
  filename="${filename%.*}"
# converte da dbf a csv
  ogr2ogr -f "CSV" "$filename".csv "$filename".dbf
done;

infine, ho mergiato tutti i file usando QGIS HIHIHIH

image

unico_v2.csv

pigreco commented 1 year ago

vedi anche https://github.com/opendatasicilia/tansignari/issues/240

pigreco commented 1 year ago

Ricetta fatta e pubblicata

https://tansignari.opendatasicilia.it/ricette/bash/estrarre_domini_da_filegdb/