Як визначити тип зберігання (ST_Geom / Oracle) від arcpy / python


10

Ми переміщуємо деякі класи функцій із SDELOB (або дещо старшого бінарного формату) до ST_Geometry. Поки ми пишемо наш аркпійний сценарій для використання інструменту зберігання міграції ESRI, ми хотіли б перевірити, чи є щось вже 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), хоча я вважаю, що їх можна знайти деінде в таблицях SDE або Oracle.

Це також можна додатково оптимізувати, створивши функцію Oracle та / або створивши подання на SDE.GEOEMTRY_COLUMNSстіл.

* Тестовано з ArcSDE 10.2.2 на Oracle 11g (64-розрядний).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.