Skip to content

Формат MapData

MapData — внутренний формат карты проекта. В этом формате редактор сохраняет карты, в нём же они передаются вычислительной ноде, и его же вы получаете при скачивании map_data.arp.

Для кого этот раздел

Пользователям сервиса работать с MapData напрямую не нужно — всё происходит через редактор. Этот раздел пригодится интеграторам, разработчикам плагинов и тем, кто хочет программно генерировать или обрабатывать карты.

Верхний уровень

json
{
  "crs": { ... },
  "params": { ... },
  "geometry": { ... }
}
ПолеОбязательноеОписание
crsДаСистема координат карты
paramsТолько для X_YПараметры подложки и масштаб
geometryДаGeoJSON FeatureCollection со всеми объектами карты

crs — система координат

X_Y (прямоугольная)

Используется по умолчанию при создании нового проекта. Координаты — пиксельные, относительно подложки.

json
{
  "crs": {
    "type": "X_Y",
    "distanceUnit": { "ratio": 1.0 }
  }
}

Координаты объектов находятся в диапазоне [0, 1000] по оси X и [0, projHeight] по оси Y, где:

projHeight = (params.height / params.width) × 1000

Ось Y растёт вверх — как в Leaflet, но противоположно растровому изображению на экране.

LAT_LONG (географическая)

Используется для проектов, импортированных из GeoJSON с реальными координатами.

json
{
  "crs": {
    "type": "LAT_LONG"
  }
}

Координаты — стандартные для GeoJSON: [longitude, latitude] в WGS 84.


params — параметры подложки (только X_Y)

json
{
  "params": {
    "background": "data:image/png;base64,...",
    "width": 1920,
    "height": 1080,
    "widthInMeters": 200
  }
}
ПолеТипОписание
backgroundstringBase64-изображение подложки (PNG/JPG) с data-URI-префиксом или без
widthnumberШирина исходного изображения в пикселях
heightnumberВысота исходного изображения в пикселях
widthInMetersnumberРеальная ширина участка в метрах (то самое значение из диалога создания проекта)

geometry — объекты карты

Стандартный GeoJSON FeatureCollection. Каждый объект определяется типом в properties.type и, опционально, подтипами.

json
{
  "geometry": {
    "type": "FeatureCollection",
    "features": [
      {
        "type": "Feature",
        "geometry": { "type": "Polygon", "coordinates": [...] },
        "properties": { "type": "border" }
      }
    ]
  }
}

Типы объектов

Основной дискриминатор — поле properties.type.

properties.typeГеометрияОписание
borderPolygonГраница участка моделирования
generatorPoint / PolygonИсточник, сток или двусторонняя точка притяжения
walkwayPolygonСуществующая дорожка или результирующая сеть
service_roadPolygonСлужебная дорога / площадка (как walkway)
obstaclePolygonНепроходимое препятствие
passable_obstaclePolygon / LineStringПрепятствие, проходимое со штрафом
barrierPolygon / LineStringНепреодолимый барьер (высокий забор)

generator — точки притяжения

Для объектов типа generator дополнительно указываются подтипы:

json
{
  "type": "Feature",
  "geometry": { "type": "Point", "coordinates": [100, 200] },
  "properties": {
    "type": "generator",
    "generator_type": "SOURCE",
    "generator_subtype": "ENTRANCE"
  }
}

generator_type

ЗначениеРоль
SOURCEИсточник — отсюда выходят пешеходы
SINKСток — сюда направляются пешеходы
BOTHДвусторонний объект (и источник, и сток)

Когда рассчитывается маршрут для пешехода, выбирается случайный генератор, который может служить истоком (SOURCE или BOTH), затем случайный генератор, который может служить стоком (SINK или BOTH), и между ними строится маршрут.

Такое разделение на типы позволяет задавать базовые ограничения на логику движения. Например, генераторы создаваемые кнопкой Подъезд в редакторе являются SOURCE. Это значит, что между двумя подъездами пешеходы ходить не будут. А будут, например, между подъездом (SOURCE) и магазином (BOTH). Или между двумя магазинами (оба имеют тип BOTH)

generator_subtype

Семантический подтип, отвечающий инструментам редактора:

ПодтипИнструмент редактораГеометрияgenerator_type
ENTRANCEПодъездPointSOURCE
PARKINGПарковкаPolygonSINK
BUS_STOPОстановкаPolygonBOTH
SHOPМагазин (вход)PointBOTH
OFFICEОфис (вход)PointBOTH
PLAYGROUNDПлощадкаPolygonBOTH
EXITВыход с терр.PolygonBOTH
CUSTOM_AREAИной полигонPolygonBOTH
CUSTOM_POINTИная точкаPointBOTH

В дальнейшем в проекте появится возможность задавать конкретные сценарии движения пешеходов, указывая последовательность подтипов генераторов, которые они должны посетить.

spawn_type

Для полигональных генераторов указывается:

json
"spawn_type": "AREA"

Это значит, что пешеходы появляются/исчезают не в одной точке, а распределённо по всей площади полигона.

Полигональные генераторы — не обычные полигоны

Для некоторых инструментов редактор создаёт сразу два объекта: сам генератор и полигон с твёрдым покрытием той же геометрии — чтобы область была покрыта твёрдым покрытием и одновременно служила целью движения. Для Парковки это полигон service_road, для Площадкиwalkway.


obstacle и passable_obstacle

Препятствия различаются проходимостью:

  • obstacle — полностью непроходимо (пешеходы обходят)
  • passable_obstacle — проходимо со штрафом (пересекают, если нет удобного обхода)

obstacle_type

Дополнительное уточнение типа:

ЗначениеИнструментТип
buildingЗданиеobstacle
WATERВодаobstacle
(без значения)Препятствиеobstacle
PLANTSРастительностьpassable_obstacle
PASSABLE_FENCEПр. заборpassable_obstacle (LineString)
ROADПроезжая частьpassable_obstacle

walkway, service_road, border, barrier

Эти типы не имеют подтипов:

json
{ "properties": { "type": "border" } }
{ "properties": { "type": "walkway" } }
{ "properties": { "type": "service_road" } }
{ "properties": { "type": "barrier" } }
  • border — полигон-граница участка;
  • walkway — существующие дорожки или результат расчёта (в выходных файлах).
  • service_road — дворовой проезд или площадка с твёрдым покрытием (проезды, парковочные карманы). Для алгоритма генерации дорог эквивалентна walkway; выделена отдельным типом для удобства разметки и экспорта в CAD.
  • barrier — высокий забор или стена; пешеходы его не преодолевают.

Задавать границу участка не обязательно, но в таком случае вся область за пределами нарисованных объектов считается пустой и проходимой. Пешеходы смогут обходить препятствия, выходя на это пустое пространство.


Полный пример

Минимальная карта с границей, подъездом и выходом:

json
{
  "crs": {
    "type": "X_Y",
    "distanceUnit": { "ratio": 1.0 }
  },
  "params": {
    "background": "",
    "width": 1000,
    "height": 600,
    "widthInMeters": 200
  },
  "geometry": {
    "type": "FeatureCollection",
    "features": [
      {
        "type": "Feature",
        "geometry": {
          "type": "Polygon",
          "coordinates": [[[0, 0], [1000, 0], [1000, 600], [0, 600], [0, 0]]]
        },
        "properties": { "type": "border" }
      },
      {
        "type": "Feature",
        "geometry": { "type": "Point", "coordinates": [100, 300] },
        "properties": {
          "type": "generator",
          "generator_type": "SOURCE",
          "generator_subtype": "ENTRANCE"
        }
      },
      {
        "type": "Feature",
        "geometry": {
          "type": "Polygon",
          "coordinates": [[[900, 250], [990, 250], [990, 350], [900, 350], [900, 250]]]
        },
        "properties": {
          "type": "generator",
          "generator_type": "BOTH",
          "generator_subtype": "EXIT",
          "spawn_type": "AREA"
        }
      },
      {
        "type": "Feature",
        "geometry": {
          "type": "Polygon",
          "coordinates": [[[400, 200], [600, 200], [600, 400], [400, 400], [400, 200]]]
        },
        "properties": { "type": "obstacle", "obstacle_type": "building" }
      }
    ]
  }
}

Программный доступ через API

Исходные данные проекта доступны как файл через REST API:

http
GET /api/v1/projects/{projectId}/files
Authorization: Bearer <jwt>

Среди возвращённых файлов тот, у которого fileType=arp, содержит сериализованный MapData. Скачать сам файл:

http
GET /api/v1/projects/{projectId}/files/{fileId}/download
Authorization: Bearer <jwt>

Полная спецификация API доступна в Swagger UI: https://app.antroadplanner.com/swagger-ui.html.