Answers:
要继续了解PolyGeo的答案,Describe对象肯定在应有的位置,但实际上并非如此。数据库查询可能是最好的方法。
虽然,如果您具有SDE命令行二进制文件,则另一种选择是尝试执行以下操作(是的,但是这可能是可行的):
import subprocess
output = subprocess.check_output("sdelayer -o describe_long -s servername -D dbname -u username -p password -l tablename,columname")
for line in output:
if line.find("Layer Type") == 0:
storagetype = line.partition(":")[2].strip() # Should be something like "SDE-BINARY" or "Extended SQL Type/ST_GEOMETRY"
如果Describe对象能够访问它,那将是很好的。
现在,它已作为ArcGIS Idea(您可以在上面投票)提交。
应该可以通过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”是存储在“ 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]
请注意,此解决方案仅告诉您几何是否与要素类存储在同一表中,而不是实际的列类型(例如SDEBINARY,SDELOB,ST_Geometry),尽管我相信可以在SDE表或Oracle的其他位置找到它。
也可以通过创建Oracle函数和/或在SDE.GEOEMTRY_COLUMNS
表上创建视图来进一步优化。
*在Oracle 11g(64位)上使用ArcSDE 10.2.2进行了测试。