Bu ArcPy aracılığıyla daha erişilebilir olmalıdır, ancak bu arada cevabı bulmak için SDE kayıt tablolarından faydalanabiliriz. SDE.GEOMETRY_COLUMNS
Tablo özelliğinin sınıfların adlarını içeren F_TABLE_NAME
, kendi şema sahibi F_TABLE_SCHEMA
ve bunlara karşılık gelen geometri tablo adı G_TABLE_NAME
.
Özellik ve geometri tablosu adları aynıysa, özellik sınıfının geometrisi özniteliklerle aynı tabloda saklanır; aksi takdirde geometri ayrı bir özellik tablosunda (diğer bir deyişle "F" tablosu) saklanır.
SQL sorgumuz şöyle olur:
SELECT COUNT(*) AS GEOMETRY_IN_FEATURE_TABLE
FROM SDE.GEOMETRY_COLUMNS
WHERE F_TABLE_SCHEMA || '.' || G_TABLE_NAME = :featureClassName
ArcPy için "GEODATABASE.sde" dosyasının bir SDE bağlantı dosyasının adı ve "GIS.TAX_PARCELS_POLY" ifadesinin "GIS" şemasında depolanan bir özellik sınıfının adı olduğunu varsayalım:
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]
Bu çözümün yalnızca geometrinin özellik sınıfı ile aynı tabloda depolandığını ve gerçek sütun türünü (örneğin SDEBINARY, SDELOB, ST_Geometry) depoladığını söylese de, SDE tablolarında veya Oracle'da başka bir yerde bulunabileceğine inanıyorum.
Bu ayrıca bir Oracle işlevi oluşturarak ve / veya SDE.GEOEMTRY_COLUMNS
tablo üzerinde bir görünüm oluşturarak daha da optimize edilebilir .
* Oracle 11g (64 bit) üzerinde ArcSDE 10.2.2 ile test edilmiştir.