Якою мірою доступна мова SQL за допомогою інструментів ArcGIS?


10

Це питання просто звучить так надмірно ...
У будь-якому випадку мене попросили вивчити використання SQL в ArcGIS. Ми використовуємо БД SDE для всіх серверів на сховищах та управління БД / масштабного редагування. Однак я намагаюся глибше заглибитись у те, наскільки інтегрований SQL є в інструментах ArcGIS. У Довідковому посібнику SQL Query довідника ArcGIS 10 є примітка, яка чітко стверджує, що синтаксис SQL не працює при використанні інструмента «Field Calculator». Я вважаю це дуже невтішним, оскільки, здавалося б, було б дуже корисно мати можливість витягувати та маніпулювати інформацією безпосередньо із самої бази даних під час обчислення значень поля.

Які найбільші обмеження та підводні камені можуть виникнути при спробі використання SQL в ArcGIS? Які інструменти бачать найкращу функціональність при інтеграції з SQL?

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

Або це?


Чи виконана будь-яка із запитуваних таблиць?
Майкл Тодд

Універсальний? Я не думаю, що я знайомий з цим терміном.
Нафан

1
Версія версії дозволяє вносити зміни до шару, зберігаючи попередні функції. Отже, якщо функцію видалено, поточна версія шару показує, що функція більше не існує; однак ця функція насправді все ще існує в базовому шарі, і інструменти ГІС можуть використовуватися для перегляду різних версій шару, які показують цю функцію. Ви можете дізнатися, чи ваш шар шарується правою кнопкою миші на шарі в ArcCatalog та виберіть "Властивості". У нижній частині вкладки Загальні розміщений розділ під назвою Версія і інформація тут підкаже, чи є шар у версії.
Майкл Тодд

Відповіді:


9

Якщо ви хочете використовувати Python, подивіться на команду ArcSDESQLExecute . Це дозволить вам виконувати довільний SQL, але він повинен бути підключений через SDE. Якщо результатом запиту є набір рядків, атрибути будуть повернуті у вигляді списків Python. Інакше повернеться True, якщо SQL виконано успішно, або None, якщо ні. Дивіться також: Виконання SQL за допомогою з'єднання ArcSDE


Я обов'язково зроблю це! Це схоже на те, що я шукав у цьому контексті. Дуже дякую.
Нафан

5

Якщо ви пишете власні ArcObjects, ви можете виконати довільний SQL проти робочої області SDE, використовуючи метод ExecuteSQL . Цей метод обмежений запитами, які не повертають набори результатів, такі як INSERT, UPDATE або деякі збережені процедури.

Якщо ви працюєте через інтерфейс ArcMap, ваші параметри дещо обмежені. Причина, чому ви не можете використовувати SQL через поле обчислення, полягає в тому, що вираз насправді є VBScript та / або Python. Ви можете використовувати VBScript або Python для виконання довільного вираження SQL та витягування значень із отриманого курсору, але я б не рекомендував це.

Також можна скористатися відповіддю Регана та створити рівень запиту. Для даних лише для читання це ваш найкращий підхід. Якщо вам потрібно оновити дані, це трохи складніше. Вам потрібно буде створити рівень запиту із вашими "новими" значеннями, виконати з'єднання з вашою існуючою таблицею та використовувати поля обчислення. Це може бути поєднане з ExecuteSQL для виконання складних оновлень та перегляду результатів (вид незграбності).

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


1
Ваш останній пункт (виконання SQL безпосередньо перед таблицями) був тому, що я задав своє питання щодо версії. SQL-запит на рівні бази даних виводиться лише з базового шару (якщо тільки не встановлено багатоосмислений вигляд), так що він не буде працювати, якщо шар буде виконаний у версії.
Майкл Тодд

Робота, яку я виконую, здебільшого в Python, але все більше здається, що реальна функціональність інтерфейсу покладається на ArcObjects.
Нафан

Все побудовано на ArcObjects внутрішньо, включаючи функціональність python.
Джеймс Шек

якщо ArcSDESQLExecute в Python може повернути результати, то як це можна досягти за допомогою IWorkspace.ExecuteSQL?
Петро Кребс

@petr ви не можете безпосередньо ... Я оновив свою відповідь.
Джеймс Шек


1

Залежно від того, якими RDBMS ви користуєтесь, ви можете використовувати SQL-бібліотеки за межами ArcObjects або arcpy, якщо це не залежить від повернення даних про функції. Багато запитів у базі даних SQL Server, якими я користуюся щодня, не мають просторового характеру, тому я буду використовувати класи System.Data всередині .NET або бібліотеку Python Pymssql всередині додатків Python. Якщо вам потрібно використовувати просторові дані, то шари запитів - найкраща ставка. Єдиний застереження з шарами запитів - вони працюють лише з даними, що зберігаються з використанням типів просторових даних (не стандартний тип SDEBINARY).


Це починає інтенсивно. Я думаю, мені потрібно більш ретельно оцінити свої потреби. Мені не знадобляться "просторові" дані, якщо ви маєте на увазі такі речі, як багатокутники і самі точки / лінії, а просто значення в текстових / цілих полях.
Нафан

Якщо вам потрібно повернути типи геометрії, я б використав стандартний доступ до даних ArcObjects / arcpy. Якщо все, що ви робите, - це доступ до "табличних" даних (немає просторових типів), тоді просто робіть дзвінки до бази даних, використовуючи звичайні SqlConnections (для SQL Server - тип вашого зв'язку може відрізнятися). Результати більш гнучкі, ніж те, що ви отримуєте від ICursor. Якщо я розумію ваше запитання, і ви обмежуєтесь використанням полевого калькулятора, ви не зможете використовувати необроблений SQL.
SagebrushGIS
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.