ArcGIS FeatureServer

> Кратко. /api/arcgis/rest/services/TGID/FeatureServer отдаёт слои сети по протоколу GeoServices REST (как у ArcGIS Server), только для чтения. Слои те же, что у OGC API; подключают ArcGIS Pro, ArcGIS Online, QGIS, Esri Leaflet и GDAL. Вход — ключ ArcGIS из личного кабинета.

Читаю как

Ключ

Выдать. Личный кабинет → «ArcGIS и QGIS (FeatureServer)» → «Выдать ключ» (POST /api/v1/arcgis/token с токеном входа). Ответ: token, expires_at, days, service_url. Выдача пишется в журнал действий (ARCGIS_TOKEN).

  • Ключ — JWT с scope: arcgis на ARCGIS_TOKEN_DAYS дней (по умолчанию 90, не больше 365), права — пользователя; действует только на адресах FeatureServer.
  • Передаётся параметром token= в адресе (так подключают ArcGIS Pro и Online), полем token в POST-форме или заголовком Authorization: Bearer. Обычный токен входа тоже принимается.
  • Закрывается сменой пароля или блокировкой; отозвать один ключ нельзя.
  • Шлюз AUTH_REQUIRED_GET эти адреса пропускает — они проверяют ключ сами.

Адреса

Адрес Что
GET /api/arcgis/rest/info версия (currentVersion 10.81), без ключа
GET /api/arcgis/rest/services каталог: один сервис TGID
GET …/FeatureServer сервис: слои, охват, maxRecordCount 2000, capabilities: Query
GET …/FeatureServer/layers все слои с полями
GET …/FeatureServer/{n} слой: поля, тип геометрии, охват
GET или POST …/FeatureServer/{n}/query объекты
№ Слой Геометрия Поля
0 Участки теплосети полилиния name, node_start, node_end, sign, diameter_mm, diameter_internal_mm, length_m, state_supply, state_return
1 Узлы сети точка name, node_type
2 Потребители точка name, kind, source_id, node_id, load_gcal_h
3 Источники тепла точка name, node_id
4 Задвижки точка name, line_id, diameter_mm, state

У всех слоёв — OBJECTID (id объекта в базе) и fileid (фрагмент). В слое 2 реальные и обобщённые потребители из разных таблиц, и номера в них повторяются, поэтому у обобщённых OBJECTID сдвинут на 1 000 000 000, а номер в таблице — в поле source_id («Id в таблице потребителей»). OBJECTID уникален во всех слоях: выбор и подсветка в ArcGIS захватывают ровно один объект. Участков внутренних схем (камер, ЦТП) в слое 0 нет.

Параметры query

Параметр Что понимает
where 1=1, «поле = число» (числовое поле слоя, fileid, OBJECTID), OBJECTID IN (…). Другое — ошибка 400: свой SQL не принимается
objectIds номера через запятую
geometry, inSR оболочка Esri JSON ({"xmin":…}) или xmin,ymin,xmax,ymax; 4326 или Web Mercator (3857, 102100)
outFields * или список полей
returnGeometry false — без геометрии
outSR 4326 или 3857/102100
resultOffset, resultRecordCount страница до 2000; exceededTransferLimit: true — есть ещё
returnCountOnly, returnIdsOnly число объектов; список OBJECTID
f json/pjson (Esri JSON) или geojson (всегда WGS 84, outSR не действует)

Ошибки — как у ArcGIS Server: HTTP 200 и {"error": {"code", "message", "details"}}. Коды: 499 — нет ключа, 498 — ключ не принят (истёк, чужое назначение, пароль сменён), 400 — неверный запрос.

Примеры (копия Алматы)

Число задвижек фрагмента 74 и две задвижки Ду 500 в Web Mercator:

FS="$API/api/arcgis/rest/services/TGID/FeatureServer"
curl -s "$FS/4/query?where=fileid%3D74&returnCountOnly=true&f=json&token=$KEY"
# {"count":35}
curl -s "$FS/4/query?where=diameter_mm%3D500&outFields=OBJECTID,name,diameter_mm,state&resultRecordCount=2&f=json&token=$KEY"
{"objectIdFieldName":"OBJECTID","geometryType":"esriGeometryPoint","spatialReference":{"wkid":4326,"latestWkid":4326},
 "fields":[{"name":"OBJECTID","type":"esriFieldTypeOID","alias":"OBJECTID"},{"name":"diameter_mm","type":"esriFieldTypeDouble","alias":"Ду, мм"},"…"],
 "features":[{"attributes":{"OBJECTID":40733,"name":null,"diameter_mm":500.0,"state":1},"geometry":{"x":76.9583618,"y":43.2625072}},"…"],
 "exceededTransferLimit":true}

Свой SQL отвергается:

curl -s "$FS/0/query?where=name%20like%20%27x%27&f=json&token=$KEY"
# HTTP 200 {"error":{"code":400,"message":"where: поддерживается 1=1, «поле = число» и OBJECTID IN (…)","details":[]}}

Число объектов по слоям на копии Алматы — весь город / фрагмент 74: участки 49 953 / 3821, узлы 51 812 / 1777, потребители 32 640 / 1037, источники 134 / 2, задвижки 217 / 35. Во фрагменте 74 числа совпадают с OGC API.

Клиенты

  • ArcGIS Pro, ArcGIS Online: «Добавить данные → по адресу» — адрес сервиса с ?token=<ключ>. Вживую не проверялись (нет лицензии на стенде).

  • QGIS: соединение «ArcGIS REST Server», адрес сервиса, проверка подлинности «API Header»: Authorization: Bearer <ключ>.

  • GDAL (тот же путь, что у QGIS), выполнено на стенде, GDAL 3.9.2:

    ogrinfo -ro -so "ESRIJSON:$FS/4/query?where=fileid%3D74&outFields=*&f=json" ESRIJSON
    # Geometry: Point / Feature Count: 35 / OBJECTID: Integer, fileid: Integer, name: String (255.0), line_id: Integer, …
    

    GDAL сам листает страницы по exceededTransferLimit. Выгрузка в файл — ogr2ogr -f GPKG out.gpkg "ESRIJSON:…".

Ключ в адресе попадает в журналы прокси и истории браузера: в журнал действий ТГИД параметр token пишется звёздочками, а за журналы своего прокси отвечаете вы.

Для разработчика

  • API: routers/arcgis.py (вход, ошибки Esri), database/arcgis_features.py (build_query, parse_where, MAX_RECORD_COUNT, WEB_MERCATOR; where разбирается в параметры запроса, поле — только из полей слоя). Описание — docs/arcgis-featureserver.md.
  • Веб: components/ArcgisClientPanel.vue в AccountDialog.
  • Тесты: API — tests/test_arcgis.py; веб — tests/utils/arcgisClient.spec.ts; e2e — e2e/functions/developer-api.spec.ts (числа против OGC, Web Mercator, отказ своего SQL).
Хотите увидеть эту функцию на своих данных?Покажем ТГИД на демонстрации и ответим на вопросы инженеров.
Запросить демо