Это должно быть более доступно через ArcPy, но пока мы можем воспользоваться таблицами реестра SDE, чтобы найти ответ. SDE.GEOMETRY_COLUMNS
Таблица содержит имена классов объектов F_TABLE_NAME
, их владельца схемы F_TABLE_SCHEMA
, и их соответствующей геометрии имени таблицы G_TABLE_NAME
.
Если имена таблиц объектов и геометрии совпадают, то геометрия класса объектов сохраняется в той же таблице, что и атрибуты; в противном случае геометрия сохраняется в отдельной таблице объектов (она же таблица «F»).
Таким образом, наш SQL-запрос будет выглядеть примерно так:
SELECT COUNT(*) AS GEOMETRY_IN_FEATURE_TABLE
FROM SDE.GEOMETRY_COLUMNS
WHERE F_TABLE_SCHEMA || '.' || G_TABLE_NAME = :featureClassName
Для ArcPy предположим, что «GEODATABASE.sde» - это имя файла подключения SDE, а «GIS.TAX_PARCELS_POLY» - это имя класса пространственных объектов, хранящегося в схеме «ГИС»:
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]
Обратите внимание, что это решение говорит вам, только если геометрия хранится в той же таблице, что и класс пространственных объектов, а не фактический тип столбца (например, SDEBINARY, SDELOB, ST_Geometry), хотя я верю, что ее можно найти в других местах в таблицах SDE или Oracle.
Это также может быть дополнительно оптимизировано путем создания функции Oracle и / или создания представления на SDE.GEOEMTRY_COLUMNS
столе.
* Протестировано с ArcSDE 10.2.2 на Oracle 11g (64-битная версия).