---
metadata:
  - name: generator
    content: Diplodoc Platform v5.39.1
alternate:
  - https://yandex.com/dev/jsapi-v2-1/doc/en/v2-1/dg/concepts/remote-object-manager/backend.md
  - https://yandex.com/dev/jsapi-v2-1/doc/ru/v2-1/dg/concepts/remote-object-manager/backend.md
---
> **Documentation Index:** Fetch the complete configuration index at https://yandex.com/dev/jsapi-v2-1/doc/ru/llms.txt

# Разработка серверной части

[Формат описания объектов](#format)

[Оборачивание JSON-описания в callback](#callback)

Для работы с [RemoteObjectManager](https://yandex.com/dev/jsapi-v2-1/doc/ru/v2-1/ref/reference/RemoteObjectManager.md) разработчику необходимо спроектировать архитектуру серверной части. Прежде всего следует определить, как будут размещены данные на сервере и как будут обрабатываться запросы, приходящие со стороны клиента. Также необходимо продумать организацию серверного кэширования данных.

`RemoteObjectManager` работает по такому же принципу, что и [LoadingObjectManager](https://yandex.com/dev/jsapi-v2-1/doc/ru/v2-1/ref/reference/LoadingObjectManager.md). Он загружает на сторону клиента необходимые данные по URL, которые указаны при создании менеджера. Основное различие заключается в том, что `RemoteObjectManager` не кластеризует данные на стороне клиента, но он может отображать результаты серверной кластеризации. Разработчику необходимо самостоятельно выбрать, какой алгоритм кластеризации использовать.

Как и `LoadingObjectManager`, `RemoteObjectManager` поддерживает два режима загрузки данных: по всей области видимости и по отдельным тайлам. Режим загрузки данных учитывается при разработке серверной части. В разделе [Режимы загрузки данных](https://yandex.com/dev/jsapi-v2-1/doc/ru/v2-1/dg/concepts/loading-object-manager/loading-mode.md) можно ознакомиться с режимами загрузки, а также с некоторыми рекомендациями по размещению данных на сервере.

## Формат описания объектов {#format}

JSON-описание объектов должно иметь следующую структуру:

```javascript
{
  "type": "FeatureCollection",
  "features": [
      ... 
  ]
}
```

Поле `features` – это массив объектов (меток, кластеров, линий и др.), которые попадают в запрашиваемую область. Каждый объект описывается следующими полями:

#|
|| **Поле** | **Тип** | **Описание** ||
|| `type`[*](*star) | String | 

Тип объекта. Доступные значения:
- "Feature" – одиночный объект (метка, линия, круг или многоугольник);
- "Cluster" – объект-кластер. ||

|| `id`[*](*star) | Number | Уникальный идентификатор объекта. Разработчик должен сформировать идентификаторы объектов самостоятельно. Обратите внимание, идентификаторы одиночных объектов и объектов-кластеров не должны пересекаться.

```json
"id": 0
```

||
|| `geometry`[*](*star) | Object |
Геометрия объекта. Содержит поля:
- `type` – тип геометрии объекта. Доступные значения: «Point» (метка или кластер), «LineString» (линия), «Cicrle» (круг), «Polygon» (многоугольник).
- `coordinates` – координаты объекта. Следует задавать в той последовательности, которая указана в параметре [coordorder](https://yandex.com/dev/jsapi-v2-1/doc/ru/v2-1/dg/concepts/load.md) (если параметр не задан, используется последовательность «широта, долгота»).
- `radius` (только для объекта с типом «Circle») – радиус круга в метрах.

{% cut "Примеры задания геометрии" %}

Для метки:

```json
"geometry": {
    "type": "Point",
    "coordinates": [55.780898, 37.642889]
}
```

Для линии:

```json
"geometry": {
    "type": "LineString",
    "coordinates": [
        [55.780898, 37.642889],
        [55.780898, 37.642889]
    ]
}
```

Для многоугольника:

```json
"geometry": { 
    "type": "Polygon",
    "coordinates": [
        [55.801280971180454, 37.552642822265625],
        [55.81285742969946, 37.518310546875],
        [55.8367712028016, 37.540283203125],
        [55.801280971180454, 37.552642822265625]
    ]
}
```

Для круга:

```json
"geometry": {
    "type": "Circle",
    "coordinates": [55.780898, 37.642889],
    "radius": 1000
}
```

Для объекта-кластера:

```json
"geometry": {
    "type": "Point",
    "coordinates": [55.780898, 37.642889]
}
```

{% endcut %}

||
|| `bbox`[*](*star) | Number[][] | Географические координаты прямоугольной области, которая охватывает все объекты данного кластера. Указываются координаты левого нижнего и правого верхнего углов области.

```json
"bbox": [[35, 46], [46, 57]]
```

Поле используется только в описании объекта-кластера (поле `type` принимает значение "Cluster"). ||
|| `number`[*](*star) | Number | Количество объектов в кластере.

```json
"number": 50
```
Используется только в описании объекта-кластера (поле `type` принимает значение "Cluster"). ||
|| `features` | Object | Массив объектов в составе кластера.

Используется только в описании объекта-кластера (поле `type` принимает значение "Cluster").

Если в описании кластера данное поле отсутствует или оно пустое, на карте будет отображен пустой значок кластера. ||
|| `properties` | Object | Свойства объекта (например, содержимое балуна или метки). Список доступных свойств объектов описан в классе [GeoObject](https://yandex.com/dev/jsapi-v2-1/doc/ru/v2-1/ref/reference/GeoObject.md). Кроме того, в свойствах могут быть указаны произвольные поля.

Пример:
```json
"properties": {
    "balloonContent": "Текст балуна",
    "clusterCaption": "Метка 1",
    "hintContent": "Текст подсказки",
    "myDescription": "Произвольное описание"
}
```

||
|| `options` | Object | Опции одиночного объекта (например, стиль метки или цвет линии). Список доступных опций описан в классе [GeoObject](https://yandex.com/dev/jsapi-v2-1/doc/ru/v2-1/ref/reference/GeoObject.md).

```json
"options": {
    "preset": "islands#yellowIcon"
}
```

||
|#

\* Обязательное поле.

{% cut "Пример JSON-описания объектов" %}

```json
{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "id": 0,
      "geometry": {
        "type": "Point",
        "coordinates": [55.831903, 37.411961]
      },
      "properties": {
        "balloonContent": "Магазин на углу",
        "data": {
          "organization": "shop",
          "open": "9am - 9pm"
        }
      }
    },
     {
      "type": "Cluster",
      "id": 1,
      "bbox": [[35, 46], [46, 57]],
      "number": 34,
      "features": [...],            
      "geometry": {                         
        "type": "Point",                         
        "coordinates": [40.5, 51]                     
      },                     
      "properties": {                
        "iconContent": "Кластер"                     
      }
    }
    {
      "type": "Feature",
      "id": 1,
      "geometry": {
        "type": "Point",
        "coordinates": [55.763338, 37.565466]
      },
      "properties": {
        "balloonContent": "Аптека",
         "data": {
          "organization": "pharmacy",
          "open": "8am - 10pm"
        }
      }
    }
  ]
}
```

{% note alert %}

Идентификатор однозначно определяет каждый объект менеджера. По идентификатору можно получить доступ к нужному объекту и, например, изменить его свойства или опции. Идентификаторы объектов являются _обязательным_ полем, и разработчик должен сформировать их самостоятельно.

{% endnote %}

{% endcut %}

## Оборачивание JSON-описания в callback {#callback}

Менеджер и сервер обмениваются данными в формате [JSONP](https://ru.wikipedia.org/wiki/JSONP). Это означает, что сервер должен возвращать менеджеру JSON-описание, обернутое в callback-функцию:

```javascript
callback_function({
  "type": "FeatureCollection",
  "features": [
    ... 
  ]
})
```

Имя функции, в которую сервер должен обернуть ответ, менеджер будет формировать автоматически и передавать в запросе в GET-параметре `callback`:

```http
/?callback=id_436554526&...
```

При создании менеджера можно задать шаблон, на основе которого менеджер будет формировать имена callback-функций. Для этого конструктору менеджера нужно указать параметр [paddingTemplate](https://yandex.com/dev/jsapi-v2-1/doc/ru/v2-1/ref/reference/LoadingObjectManager.md#param-options.paddingTemplate). Например:
```javascript
// Создание менеджера. Укажем шаблон для именования callback-функций.
var remoteObjectManager = new ymaps.RemoteObjectManager('https://server.ru/tile/?%с', {
    paddingTemplate: 'myCallback_%c'
});
```

Тогда для тайла с номером [1,2] и z=5 менеджер отправит запрос по URL:

```http
https://server.com/tile/?x=1&y=2&z=5&callback=myCallback_x_1_y_2_z_5
```

Ответ необходимо обернуть следующим образом:

```javascript
myCallback_x_1_y_2_z_5({
  "type": "FeatureCollection",
  "features": [
    ... 
  ]
})
```

Использование параметра [paddingTemplate](https://yandex.com/dev/jsapi-v2-1/doc/ru/v2-1/ref/reference/LoadingObjectManager.md#param-options.paddingTemplate) упростит реализацию серверной части, так как для каждого запроса серверу будут заранее известны названия callback-функции. Для каждого тайла JSON-описание можно формировать сразу обернутым в заданную callback-функцию и сохранять в статическом файле.



[*star]: Обязательный параметр