arcpy / python에서 스토리지 유형 (ST_Geom / Oracle)을 결정하는 방법


10

일부 기능 클래스를 SDELOB (또는 이전 이진 형식)에서 ST_Geometry로 마이그레이션하고 있습니다. ESRI Migrate Storage Tool을 사용하기 위해 arcpy 스크립트를 작성할 때 이미 ST_Geom인지 여부를 테스트하고 싶습니다 ... comtypes 패키지 등을 사용하여 데이터베이스에 후크를 쓰는 것 외에는 누구나 간단한 것을 알고 있습니다 이것을 결정하는 방법?

답변:


6

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"


1

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로 테스트되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.