วิธีกำหนดประเภทการจัดเก็บ (ST_Geom / Oracle) จาก arcpy / python


10

เรากำลังย้ายคลาสฟีเจอร์บางส่วนจาก SDELOB (หรือบางรูปแบบไบนารีที่เก่ากว่า) ไปยัง ST_Geometry ในขณะที่เราเขียนสคริปต์ arcpy ของเราเพื่อใช้ ESRI Migrate Storage Tool เราต้องการทดสอบว่า ST_Geom นั้นมีบางสิ่งอยู่แล้วหรือไม่ ... นอกจากการเขียน hooks ลงในฐานข้อมูลโดยใช้แพ็คเกจ 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_SCHEMAG_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ตาราง

* ทดสอบกับ ArcSDE 10.2.2 บน Oracle 11g (64 บิต)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.