Cách xác định loại lưu trữ (ST_Geom / Oracle) từ arcpy / python


10

Chúng tôi đang chuyển một số lớp đối tượng từ SDELOB (hoặc một số định dạng nhị phân cũ hơn) sang ST_Geometry. Khi chúng tôi viết tập lệnh phức tạp của mình để sử dụng Công cụ lưu trữ di chuyển ESRI, chúng tôi muốn kiểm tra xem có phải đã có ST_Geom hay không ... Khác với việc viết các móc vào cơ sở dữ liệu, sử dụng gói comtypes, v.v. Cách xác định điều này?

Câu trả lời:


6

Để theo dõi câu trả lời của PolyGeo, đối tượng Mô tả chắc chắn là nơi cần có, nhưng không phải vậy. Truy vấn cơ sở dữ liệu có thể là cách tốt nhất để đi đến đây.

Mặc dù, nếu bạn có các nhị phân dòng lệnh SDE, một tùy chọn khác sẽ là thử làm một cái gì đó như thế này (vâng, đó là một hack, nhưng có thể hoạt động):

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"

2

Sẽ tốt hơn nếu đối tượng Mô tả có thể truy cập được điều này.

Điều này hiện đã được gửi dưới dạng Ý tưởng ArcGIS (trên đó bạn có thể bỏ phiếu).


1

Điều này sẽ dễ tiếp cận hơn thông qua ArcPy nhưng trong thời gian này, chúng ta có thể tận dụng các bảng đăng ký SDE để tìm câu trả lời. Các SDE.GEOMETRY_COLUMNSbảng chứa tên các lớp đối tượng F_TABLE_NAME, chủ sở hữu schema của họ F_TABLE_SCHEMA, và tên bảng hình học tương ứng của họ G_TABLE_NAME.

Nếu tên bảng tính năng và hình học giống nhau thì hình dạng của lớp đối tượng được lưu trữ trong cùng bảng với các thuộc tính; mặt khác, hình học được lưu trữ trong một bảng tính năng riêng biệt (còn gọi là bảng "F").

Vì vậy, truy vấn SQL của chúng tôi sẽ là một cái gì đó như:

SELECT COUNT(*) AS GEOMETRY_IN_FEATURE_TABLE
FROM SDE.GEOMETRY_COLUMNS
WHERE F_TABLE_SCHEMA || '.' || G_TABLE_NAME = :featureClassName

Đối với ArcPy, giả sử "GEODATABASE.sde" là tên của tệp kết nối SDE và "GIS.TAX_PARCELS_POLY" là tên của một lớp đối tượng được lưu trữ trong lược đồ "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]

Lưu ý giải pháp này chỉ cho bạn biết nếu hình học được lưu trữ trong cùng bảng với lớp tính năng chứ không phải loại cột thực tế (ví dụ: SDEBINARY, SDELOB, ST_Geometry) mặc dù tôi tin rằng có thể tìm thấy ở nơi khác trong các bảng SDE hoặc Oracle.

Điều này cũng có thể được tối ưu hóa hơn nữa bằng cách tạo một hàm Oracle và / hoặc tạo một khung nhìn trên SDE.GEOEMTRY_COLUMNSbảng.

* Đã thử nghiệm với ArcSDE 10.2.2 trên Oracle 11g (64-bit).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.