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).
