В какой степени язык SQL доступен через инструменты ArcGIS?

10

Этот вопрос звучит просто излишне ...
Во всяком случае, меня попросили изучить использование SQL в ArcGIS. Мы используем SDE DB для всех серверных хранилищ и управления БД / крупномасштабного редактирования. Однако я пытаюсь глубже понять, насколько интегрирован SQL в инструментах ArcGIS. В справочном руководстве по SQL-запросам в ArcGIS 10 есть примечание, в котором четко указано, что синтаксис SQL не работает при использовании инструмента Калькулятор поля. Я нахожу это очень разочаровывающим, так как было бы очень полезно иметь возможность извлекать и обрабатывать информацию непосредственно из самой базы данных при вычислении значений полей.

Каковы наибольшие ограничения и подводные камни, с которыми можно столкнуться при попытке использовать SQL в ArcGIS? Какие инструменты видят лучшую функциональность при интеграции с SQL?

Если требуется пример, чтобы сделать этот вопрос более ясным, я пытаюсь отследить количество точек интереса определенного типа в данном регионе. Каждая точка имеет атрибут, который описывает ее тип и регион. Мое текущее решение включает интенсивное использование курсоров для подсчета и извлечения данных, но начальник указал, что простой SQL-запрос может сделать все это и даже больше. К сожалению, кажется, что функциональности нет для этого.

Или это?

Nathanus
источник
Версионирована ли какая-либо из запрашиваемых таблиц?
Майкл Тодд
Версированные? Я не думаю, что я знаком с этим термином.
Натанус
1
Управление версиями слоя позволяет вносить изменения в слой, сохраняя предыдущие функции. Таким образом, если объект удален, текущая версия слоя показывает, что объект больше не существует; однако эта функция на самом деле все еще существует в «базовом» слое, и инструменты ГИС можно использовать для просмотра различных версий слоя, которые показывают эту функцию. Чтобы узнать, является ли ваш слой версионным, щелкните правой кнопкой мыши слой в ArcCatalog и выберите «Свойства». Внизу вкладки «Общие» находится раздел «Управление версиями», и информация здесь сообщит вам, является ли уровень версионным.
Майкл Тодд

Ответы:

9

Если вы хотите использовать Python, взгляните на команду ArcSDESQLExecute . Это позволит вам выполнить произвольный SQL, но он должен быть подключен через SDE. Если результатом запроса является набор строк, атрибуты будут возвращены в виде списка списков Python. В противном случае он вернет True, если SQL был выполнен успешно, или None, если нет. Смотрите также: Выполнение SQL с использованием соединения ArcSDE

blah238
источник
Я определенно сделаю это! Это похоже на то, что я искал в этом контексте. Большое спасибо.
Натанус
5

Если вы пишете пользовательские объекты ArcObject, вы можете выполнить произвольный SQL для рабочей области SDE, используя метод ExecuteSQL . Этот метод ограничен запросами, которые не возвращают наборы результатов, такие как INSERT, UPDATE или некоторые хранимые процедуры.

Если вы работаете через пользовательский интерфейс ArcMap, ваши возможности немного ограничены. Причина, по которой вы не можете использовать SQL через Calculate Field, заключается в том, что на самом деле это выражение VBScript и / или Python. Вы можете использовать VBScript или Python для выполнения произвольного выражения SQL и извлечения значений из полученного курсора, но я бы не рекомендовал это.

Кроме того, вы можете использовать ответ Риган и создать слой запроса. Для данных только для чтения, это ваш лучший подход. Если вам нужно обновить данные, это немного сложнее. Вам нужно будет создать слой запроса с вашими «новыми» значениями, выполнить объединение с существующей таблицей, а затем использовать поля вычисления. Это может быть объединено с ExecuteSQL для выполнения сложных обновлений и последующего просмотра результатов (что-то неуклюжее).

Ваша последняя альтернатива - напрямую выполнять SQL для таблиц ArcSDE.

Джеймс Шек
источник
1
Ваш последний вопрос (выполнение SQL для таблиц напрямую) заключался в том, почему я задал вопрос о версии. SQL-запрос на уровне базы данных извлекается только из базового уровня (если не настроено многовариантное представление), поэтому он не будет работать, если уровень версионен.
Майкл Тодд
Работа, которую я делаю, в основном на Python, но все больше и больше кажется, что реальная функциональность пользовательского интерфейса опирается на ArcObjects.
Натанус
Все построено на ArcObjects внутренне, включая функциональность python.
Джеймс Шек,
если ArcSDESQLExecute в Python может возвращать результаты, как этого можно достичь с помощью IWorkspace.ExecuteSQL?
Петр Кребс,
@petr, вы не можете напрямую ... Я обновил свой ответ.
Джеймс Шек,
1

В зависимости от того, какую СУБД вы используете, вы можете использовать библиотеки SQL вне ArcObjects или arcpy, если вы не зависите от получения данных объектов. Многие запросы в базе данных SQL Server, которые я использую ежедневно, не носят пространственного характера, поэтому я буду использовать классы System.Data внутри .NET или библиотеку Python pymssql внутри приложений Python. Если вам требуется использование Пространственных данных, то лучше всего использовать Query Layers. Единственное предостережение с уровнями запросов - они работают только с данными, хранящимися с использованием пространственных типов данных (не стандартного типа SDEBINARY).

SagebrushGIS
источник
Это начинает становиться интенсивным. Думаю, мне нужно более тщательно оценить свои потребности. Мне не понадобятся «пространственные» данные, если под этим вы подразумеваете такие вещи, как сами полигоны и точки / линии, а просто значения в текстовых / целочисленных полях.
Натанус
Если вам нужно вернуть типы геометрии, я бы использовал стандартный доступ к данным ArcObjects / arcpy. Если все, что вы делаете, - это доступ к «табличным» данным (без пространственных типов), то просто выполняйте вызовы базы данных, используя обычные SqlConnections (для SQL Server - ваш тип соединения может отличаться). Результаты более гибкие, чем у ICursor. Если я понимаю ваш вопрос, и вы ограничены использованием полевого калькулятора, вы не сможете использовать сырой SQL.
SagebrushGIS