Powinno to być łatwiej dostępne za pośrednictwem ArcPy, ale w międzyczasie możemy skorzystać z tabel rejestru SDE, aby znaleźć odpowiedź. SDE.GEOMETRY_COLUMNS
Tabela zawiera nazwy klas obiektów F_TABLE_NAME
, ich właściciela schematu F_TABLE_SCHEMA
oraz odpowiednimi geometrii nazwy tabeli G_TABLE_NAME
.
Jeśli nazwy operacji i tabeli geometrii są takie same, geometria klasy obiektów jest przechowywana w tej samej tabeli co atrybuty; w przeciwnym razie geometria jest przechowywana w osobnej tabeli cech (zwanej także tabelą „F”).
Zatem nasze zapytanie SQL wyglądałoby mniej więcej tak:
SELECT COUNT(*) AS GEOMETRY_IN_FEATURE_TABLE
FROM SDE.GEOMETRY_COLUMNS
WHERE F_TABLE_SCHEMA || '.' || G_TABLE_NAME = :featureClassName
W przypadku ArcPy załóżmy, że „GEODATABASE.sde” to nazwa pliku połączenia SDE, a „GIS.TAX_PARCELS_POLY” to nazwa klasy obiektów przechowywanej w schemacie „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]
Zauważ, że to rozwiązanie mówi ci tylko, czy geometria jest przechowywana w tej samej tabeli co klasa elementów, a nie faktyczny typ kolumny (np. SDEBINARY, SDELOB, ST_Geometry), chociaż uważam, że można to znaleźć gdzie indziej w tabelach SDE lub Oracle.
Można to dodatkowo zoptymalizować, tworząc funkcję Oracle i / lub tworząc widok na SDE.GEOEMTRY_COLUMNS
stole.
* Testowany z ArcSDE 10.2.2 na Oracle 11g (64-bit).