Cela devrait être plus accessible via ArcPy mais en attendant, nous pouvons profiter des tables de registre SDE pour trouver la réponse. La SDE.GEOMETRY_COLUMNS
table contient les noms des classes d'entités F_TABLE_NAME
, leur propriétaire de schéma F_TABLE_SCHEMA
et le nom de la table de géométrie correspondante G_TABLE_NAME
.
Si les noms de table d'entités et de géométrie sont identiques, la géométrie de la classe d'entités est stockée dans la même table que les attributs; sinon, la géométrie est stockée dans une table d'entités distincte (également appelée table "F").
Donc, notre requête SQL serait quelque chose comme:
SELECT COUNT(*) AS GEOMETRY_IN_FEATURE_TABLE
FROM SDE.GEOMETRY_COLUMNS
WHERE F_TABLE_SCHEMA || '.' || G_TABLE_NAME = :featureClassName
Pour ArcPy, supposez que "GEODATABASE.sde" est le nom d'un fichier de connexion SDE et "GIS.TAX_PARCELS_POLY" est le nom d'une classe d'entités stockée dans le schéma "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]
Notez que cette solution vous indique uniquement si la géométrie est stockée dans la même table que la classe d'entités et non pas le type de colonne réel (par exemple SDEBINARY, SDELOB, ST_Geometry) bien que je pense que cela peut être trouvé ailleurs dans les tables SDE ou Oracle.
Cela pourrait également être encore optimisé en créant une fonction Oracle et / ou en créant une vue sur la SDE.GEOEMTRY_COLUMNS
table.
* Testé avec ArcSDE 10.2.2 sur Oracle 11g (64 bits).