Ini harus lebih mudah diakses melalui ArcPy tetapi sementara itu kita dapat memanfaatkan tabel registri SDE untuk menemukan jawabannya. The SDE.GEOMETRY_COLUMNS
tabel berisi nama-nama kelas fitur F_TABLE_NAME
, pemilik skema mereka F_TABLE_SCHEMA
, dan sesuai geometri nama meja mereka G_TABLE_NAME
.
Jika fitur dan nama tabel geometri sama maka geometri kelas fitur disimpan dalam tabel yang sama dengan atribut; jika tidak, geometri disimpan dalam tabel fitur yang terpisah (alias tabel "F").
Jadi permintaan SQL kami akan menjadi seperti:
SELECT COUNT(*) AS GEOMETRY_IN_FEATURE_TABLE
FROM SDE.GEOMETRY_COLUMNS
WHERE F_TABLE_SCHEMA || '.' || G_TABLE_NAME = :featureClassName
Untuk ArcPy, anggap "GEODATABASE.sde" adalah nama file koneksi SDE dan "GIS.TAX_PARCELS_POLY" adalah nama kelas fitur yang disimpan dalam skema "GIS":
import arcpy, os
dstFeatureClass = "sde/DC_LISDBA (GIS).sde/GIS.PARCEL_PARCELS_POLY"
#open a connection to the geodatabase
wks = arcpy.ArcSDESQLExecute(os.path.dirname(dstFeatureClass))
#create the SQL query statement
sql = \
"SELECT COUNT(*) AS GEOMETRY_IN_FEATURE_TABLE " \
"FROM SDE.GEOMETRY_COLUMNS " \
"WHERE F_TABLE_SCHEMA || '.' || G_TABLE_NAME = " + \
"'" + os.path.basename(dstFeatureClass) + "'"
#execute the query and return the geometry type
print "ST_Geometry" if wks.execute(sql) else "SDEBINARY"
#delete the geodatabase connection
del [wks, sql]
Catatan solusi ini hanya memberi tahu Anda jika geometri disimpan dalam tabel yang sama dengan kelas fitur dan bukan tipe kolom yang sebenarnya (misalnya SDEBINARY, SDELOB, ST_Geometry) meskipun saya yakin itu dapat ditemukan di tempat lain di tabel SDE atau Oracle.
Ini juga dapat dioptimalkan lebih lanjut dengan membuat fungsi Oracle dan / atau membuat tampilan di atas SDE.GEOEMTRY_COLUMNS
meja.
* Diuji dengan ArcSDE 10.2.2 pada Oracle 11g (64-bit).