Dies sollte über ArcPy leichter zugänglich sein, aber in der Zwischenzeit können wir die SDE-Registrierungstabellen nutzen, um die Antwort zu finden. Die SDE.GEOMETRY_COLUMNS
Tabelle enthält die Namen der Feature-Classes F_TABLE_NAME
, ihren Schemabesitzer F_TABLE_SCHEMA
und den entsprechenden Namen der Geometrietabelle G_TABLE_NAME
.
Wenn die Namen der Feature- und Geometrietabellen identisch sind, wird die Geometrie der Feature-Class in derselben Tabelle wie die Attribute gespeichert. Andernfalls wird die Geometrie in einer separaten Feature-Tabelle (auch als "F" -Tabelle bezeichnet) gespeichert.
Unsere SQL-Abfrage wäre also ungefähr so:
SELECT COUNT(*) AS GEOMETRY_IN_FEATURE_TABLE
FROM SDE.GEOMETRY_COLUMNS
WHERE F_TABLE_SCHEMA || '.' || G_TABLE_NAME = :featureClassName
Nehmen Sie für ArcPy an, dass "GEODATABASE.sde" der Name einer SDE-Verbindungsdatei und "GIS.TAX_PARCELS_POLY" der Name einer Feature-Klasse ist, die im Schema "GIS" gespeichert ist:
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]
Beachten Sie, dass diese Lösung nur angibt, ob die Geometrie in derselben Tabelle wie die Feature-Class und nicht im tatsächlichen Spaltentyp (z. B. SDEBINARY, SDELOB, ST_Geometry) gespeichert ist, obwohl ich glaube, dass sie an anderer Stelle in den SDE-Tabellen oder in Oracle zu finden ist.
Dies könnte auch weiter optimiert werden, indem eine Oracle-Funktion erstellt und / oder eine Ansicht für die SDE.GEOEMTRY_COLUMNS
Tabelle erstellt wird.
* Getestet mit ArcSDE 10.2.2 unter Oracle 11g (64-Bit).