Как определить тип хранилища (ST_Geom / Oracle) из arcpy / python

10

Мы переносим некоторые классы пространственных объектов из SDELOB (или более старого двоичного формата) в ST_Geometry. Когда мы пишем наш скрипт arcpy для использования ESRI Migrate Storage Tool, мы хотели бы проверить, является ли что-то уже ST_Geom или нет ... Кроме записи хуков в базу данных, использования пакета comtypes и т. Д. Кто-нибудь знает о простом способ определить это?

valveLondon
источник

Ответы:

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"
Гринлоу
источник
2

Было бы хорошо, если бы объект Describe смог получить к нему доступ.

Теперь это было представлено как идея ArcGIS (за которую вы можете проголосовать).

PolyGeo
источник
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» - это имя класса пространственных объектов, хранящегося в схеме «ГИС»:

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-битная версия).

Эрик Андерсон
источник