답변:
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)이 아닌 SDEBINARY, SDELOB, ST_Geometry와 같은 테이블에 저장되어 있는지 여부 만 알려줍니다.
또한 Oracle 함수를 작성하거나 SDE.GEOEMTRY_COLUMNS
테이블 에서보기를 작성하여 더욱 최적화 할 수 있습니다 .
* Oracle 11g (64 비트)에서 ArcSDE 10.2.2로 테스트되었습니다.