# ArcGIS

## Що це таке

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-проєктів від розробки й розгортання до підтримки](/uk/portfolio/led-the-development-deployment-and-support-of-over-35/),
і ArcGIS стояв поруч із їхнім стеком як набір API, до яких могли звертатися
карти. Самі карти будували на Mapbox GL і Leaflet, часом із викликами API ArcGIS
чи HERE; рівень застосунку писали на JavaScript, Python, PHP і SQL, просторові
дані лежали в PostgreSQL із PostGIS, а саму роботу з даними вели в QGIS і JOSM.

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

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

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

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

```sh
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 і списки драйверів, перш
ніж звинувачувати дані.

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

- [Developer documentation](https://developers.arcgis.com/documentation/) —
  карта платформи від Esri: SDK, портал і сервіси даних, а також безпека.
- [Query (Feature Service/Layer)](https://developers.arcgis.com/rest/services-reference/enterprise/query-feature-service-layer/)
  — кожен параметр запиту, зокрема `outSR`, формати виводу і три способи гортати
  сторінки.
- [Python migration from 10.x to ArcGIS Pro](https://pro.arcgis.com/en/pro-app/latest/arcpy/get-started/python-migration-for-arcgis-pro.htm)
  — що змінилося між Python 2 і 3 та в самому ArcPy.
- [ArcMap Life Cycle](https://support.esri.com/en-us/products/arcmap/life-cycle)
  — статус підтримки ArcMap і чому 10.8.x — остання серія.
- [ESRI File Geodatabase vector (OpenFileGDB)](https://gdal.org/en/stable/drivers/vector/openfilegdb.html)
  — драйвер GDAL для каталогів `.gdb` із версіями, що додали запис і підтримку
  растрів.
- [ESRIJSON / FeatureService driver](https://gdal.org/en/stable/drivers/vector/esrijson.html)
  — читання результатів сервісу об'єктів через GDAL і як працює його автоматична
  пагінація.

<https://engineer.company/uk/glossary/arcgis/>
