回答:
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のアイデア(投票できる)として提出されました。
これは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など)は通知しないことに注意してください。
これは、Oracle関数を作成したり、SDE.GEOEMTRY_COLUMNS
テーブルにビューを作成したりして、さらに最適化することもできます。
* Oracle 11g(64ビット)上のArcSDE 10.2.2でテスト済み。