Перейти до вмісту

ArcGIS

комерційна ГІС-платформа від Esri

Що це таке

ArcGIS — це назва, яку Esri дає цілій родині геопросторових програм, а не одній програмі, і частини цієї родини найпростіше розрізняти за тим, де кожна з них працює.

На робочому столі актуальна програма — ArcGIS Pro, і в її системних вимогах значиться лише Microsoft Windows. До Pro була ArcMap, яку продавали як частину ArcGIS Desktop. Сторінка життєвого циклу продукту в Esri позначає ArcMap як застарілу, що перебуває на етапі «mature support», а 10.8.x — як її останню серію випусків.

На сервері центр платформи — портал: місце, де створюють і поширюють вміст, користувачів, групи та сервіси даних. Esri розміщує один такий портал як ArcGIS Online, продукт за моделлю software-as-a-service із передплатою, а організація може запустити власний за допомогою ArcGIS Enterprise. Дані в порталі публікують як сервіси, кожен зі своєю кінцевою точкою REST. Сервіс об’єктів (feature service) дає доступ до просторових і непросторових даних у шарах об’єктів і таблицях і дозволяє клієнту додавати, оновлювати, видаляти об’єкти та робити до них запити. Сервіси векторних плиток і плиток карти зберігають і віддають плитки, а сервіс зображень обробляє растрові дані й складає з них мозаїку на льоту. Кожен шар має власну адресу виду …/FeatureServer/0 і операцію query, яка приймає умову where, список полів і формат виводу: HTML за замовчуванням, JSON, GeoJSON або protocol buffers.

На боці клієнта Esri випускає Maps SDK для JavaScript, Kotlin, Swift, Flutter, .NET, Qt і Java, а також плагіни для Unity та Unreal Engine. Та сама документація для розробників охоплює й відкриті бібліотеки, які вміють малювати сервіси ArcGIS: Leaflet, MapLibre GL JS, OpenLayers і CesiumJS. Для скриптів є ArcPy, пакет Python для інструментів геообробки й автоматизації карт усередині ArcGIS Pro, а поруч із ним ArcGIS API for Python і ArcGIS REST JS для роботи з порталами й сервісами ззовні. Доступ до всього непублічного йде через ключі API, OAuth 2.0 або користувача, який увійшов у систему.

На диску разом із даними ArcGIS мандрує формат file geodatabase: каталог, назва якого закінчується на .gdb, а кожна таблиця в ньому зберігається як файли .gdbtable. Поза програмами Esri вбудований драйвер OpenFileGDB у GDAL читає file geodatabase, з GDAL 3.6 записує й оновлює їх, а з 3.7 працює і з растровими шарами в них.

Чому це важливо

Коли організація вже працює з ArcGIS, питання рідко полягає в тому, чи впроваджувати платформу. Питання в тому, де проходить її межа: які дані лишаються в порталі як сервіси, які копіюють у базу даних під контролем решти стеку і в якому напрямку між ними рухаються правки.

Усередині цієї межі багато чого вже готове. Редагування, символіка, спільний доступ для іменованих користувачів і груп, аналітичні сервіси й конструктори застосунків, що потребують мінімуму коду, працюють з одним і тим самим порталом, а співробітники, які знають ArcGIS Pro, далі працюють так, як звикли. Публікація шару як сервісу об’єктів дає кожній іншій системі адресу, звідки його можна читати.

Межу можна перетнути з обох боків, і саме тому вибір справжній, а не прив’язка до постачальника. Сервіс об’єктів говорить JSON і GeoJSON через звичайний HTTP. Драйвер ESRIJSON у GDAL читає URL сервісу як файл і сам гортає сторінки результату, тож ogr2ogr копіює розміщений шар у PostGIS або GeoPackage однією командою. Власна документація Esri показує, як Leaflet і MapLibre GL JS малюють її сервіси. У зворотному напрямку GDAL сам записує file geodatabase з версії 3.6, тож дані можна повернути у власному форматі Esri.

Зусиль вимагає все, що живе по обидва боки одночасно. Шар, скопійований із порталу, — це друга копія, а другій копії потрібні розклад, власник і спосіб помітити, коли вона розійшлася з першою. Настільна програма працює лише на Windows і має комерційну ліцензію, і це визначає, хто в змішаній команді може відкрити проєкт. А ArcPy постачається з ArcGIS Pro та ArcGIS Server; навіть встановлений в інше середовище Python, він однаково потребує ArcGIS Pro на машині, тож конвеєр, побудований на ньому, працює лише там, де встановлено ArcGIS.

Як це виглядає на практиці

ArcGIS з’являється у двох проєктах на цьому сайті, і в обох він лише одна частина ширшого стеку.

У 2015–2022 роках роль керівника команди розробки GIS-програмного забезпечення охоплювала понад тридцять GIS-проєктів від розробки й розгортання до підтримки, і ArcGIS стояв поруч із їхнім стеком як набір API, до яких могли звертатися карти. Самі карти будували на Mapbox GL і Leaflet, часом із викликами API ArcGIS чи HERE; рівень застосунку писали на JavaScript, Python, PHP і SQL, просторові дані лежали в PostgreSQL із PostGIS, а саму роботу з даними вели в QGIS і JOSM.

Пізніша посада, інженер даних у масштабному проєкті геопросторової аналітики у 2022–2024 роках, відвела ArcGIS місце серед інструментів для виправлень. Просторові помилки діагностували й виправляли за допомогою GDAL, QGIS та ArcGIS у поєднанні, а повторювані завдання з очищення автоматизували на Bash. Процедури на PL/pgSQL і Transact-SQL керували географічними й часовими даними в PostgreSQL та SQL Server і трансформували їх, а PostGIS відповідав за просторові запити й індексацію. Усунених проблем набралося понад 1 000, і ця робота доклалася до скорочення часу виконання просторових запитів на 35%.

Де виникають проблеми

Більшість проблем лежить на межі між ArcGIS і всім іншим, де кожна сторона вважає, що інша поводиться так само, як вона сама.

Завантаження шару зупиняється на круглому числі. Сервіс об’єктів повертає щонайбільше maxRecordCount об’єктів на запит, і цю межу задають для кожного сервісу окремо. Коли під запит підпадає більше, відповідь виставляє exceededTransferLimit у true, і клієнт, який читає об’єкти й ігнорує цей прапорець, отримує неповний шар, що виглядає повним. Якщо шар повідомляє supportsPagination, клієнт гортає сторінки через resultOffset і resultRecordCount або через resultPaginationToken, доки прапорець не повернеться як false. Документація GDAL додає, що пагінація надійна лише із сортуванням за полем на кшталт OBJECTID:

url='https://gis.example.org/arcgis/rest/services/Dilianky/FeatureServer/0'
q='query?where=1=1&outFields=*&orderByFields=OBJECTID+ASC&f=json'
ogr2ogr -f GPKG dilianky.gpkg "ESRIJSON:$url/$q"

Координати приходять у метрах там, де чекали градусів. Без параметра outSR запит повертає геометрію в просторовій системі відліку карти сервісу, а це може бути проєкційна система в метрах. Щодо виводу GeoJSON довідник каже, що з версії 10.8 результат узгоджується з RFC 7946 лише тоді, коли outSR пропущено або встановлено в 4326. Будь-яке інше значення дає проєктовані координати у файлі, який досі називає себе GeoJSON, і вебкарта, що його читає, поставить об’єкти далеко від їхнього місця. Просіть outSR=4326 щоразу, коли споживач чекає довготу й широту.

Скрипт для ArcMap перестає працювати в ArcGIS Pro. ArcGIS Desktop, до якого входить ArcMap, використовував версії Python 2, а ArcGIS Pro працює на Python 3, гілці, яку Esri описує як лише частково сумісну. У самому ArcPy модуль arcpy.mapping прибрали й замінили на arcpy.mp. Оскільки ArcMap застаріла, скрипти для неї рано чи пізно доведеться переносити. Інструмент Analyze Tools For Pro в ArcGIS Pro позначає проблеми, які завадили б запуску коду Python або інструментів геообробки на основі Python, і краще пройти цей етап свідомо, ніж виявити все в день заміни машини.

File geodatabase відкривається лише для читання. GDAL до 3.6 читав file geodatabase через OpenFileGDB, а записував лише через окремий драйвер FileGDB, якому під час збирання GDAL потрібна бібліотека FileGDB API від Esri. Растрові шари в .gdb потребують GDAL 3.7 або новішого. Коли конвеєр записує .gdb на одній машині й падає на іншій, порівняйте версії GDAL і списки драйверів, перш ніж звинувачувати дані.

Що почитати далі

Словник