Đ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_COLUMNS
bả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_COLUMNS
bảng.
* Đã thử nghiệm với ArcSDE 10.2.2 trên Oracle 11g (64-bit).