6. Приложения

6.1. Приложение 1. Примеры скриптов плагинов

Отправка файлов в объект слоя

if after.getServiceObjectLayerId() is not None and after.getServiceObjectId() is not None:
    attach_list = []
    if len(after.getPhotos()) > 0:
        body_photo = list(map(lambda attach_name: {
            'path': f"/department_files/photos/{attach_name.getName().replace('_', '/')}",
            'fileName': attach_name.getName().replace('/', '_'),
            'isUrl': True
        }
        , after.getPhotos()))
        for photo in after.getPhotos():
            photo_location = photo.getOriginLocation() if photo.getOriginLocation() is not None else photo.getAttachmentLocation()
            if photo_location is not None and model.getLocation() is None:
                geom = {'coordinates': [(photo_location[0], photo_location[1])], 'type': 'MultiPoint'}

        if model.getLocation() is not None:
            geom = {'coordinates': [(model.getLocation()[0], model.getLocation()[1])], 'type': 'MultiPoint'}

    if len(after.getVideos()) > 0:
        for item in after.getVideos():
            attach_list.append(item.getName())
        attach_path = 'video'

    if len(after.getSounds()) > 0:
        for item in after.getSounds():
            attach_list.append(item.getName())
        attach_path = 'sounds'

    if len(after.getFiles()) > 0:
        for item in after.getFiles():
            attach_list.append(item.getName())
        attach_path = 'dif_files'

    body_files = list(map(lambda attach_name: {
        'path': f"/department_files/{attach_path}/{attach_name.replace('_', '/')}",
        'fileName': attach_name,
        'isUrl': True
    }
    , attach_list))

    req = patch(f"/layers/{after.getServiceObjectLayerId()}/features/{after.getServiceObjectId()}/files")
    req.props({'photos': body_photo, 'files': body_files})

    return [
        req,
        patch(f"/layers/{after.getServiceObjectLayerId()}/features/{after.getServiceObjectId()}").prop('geometry', geom)
        ]

Проверка количества фото

if after.get('photo_count') is not None and after.get('photo_count') != before.get('photo_count') and subject.getId() != after.getUser().getId():
    return invalid("\nИзменять доп.поле 'Количество ракурсов' может только создатель задания.\n"
                "\nВерните, пожалуйста, прежнее значение.")

if len(after.getPhotos()) is not None and after.get('photo_count') is not None and after.getStatus().getId() != before.getStatus().getId():
    if len(after.getPhotos()) < int(after.get('photo_count')) and after.getStatus().getId() == 4:
        send_photo_count = int(after.get('photo_count')) - len(after.getPhotos())
        return invalid(f"Недостаточно фото для изменения этапа. Вам необходимо добавить еще {send_photo_count}")

6.2. Приложение 2. Примеры расширенных стилей слоев

С правилами создания geocss-стилей можно ознакомиться подробнее на https://docs.geoserver.org/stable/en/user/styling/workshop/css/css.html.

Пример стиля точечного слоя с использованием стандартных значков (кругов) для категорий

/* @title Офисы */
[amenity = 'bank'] {
 mark: symbol('circle');
}
[amenity = 'bank']
 :mark{
  fill:#68904D;
  stroke:black;
  stroke-width:1;
  size:18;
}

/* @title Банкоматы */
[amenity = 'atm'] {
 mark: symbol('circle');
}
[amenity = 'atm']
:mark{
  fill:#EE9B01;
  stroke:#000000;
  stroke-width:1;
  size:9;
}

Где:

/* @title Офисы */ – название категории, которое будет отображаться в легенде.
[amenity = 'bank'] – поле, по которому идет фильтрация, и значение поля.
mark: symbol('circle') – форма значка (круг).
fill:#68904D – цвет заливки значка. Допускается использовать название или шестнадцатеричный код цвета.
stroke: black/#000000 – цвет обводки значка. Допускается использовать название или шестнадцатеричный код цвета (black = #000000).
stroke-width:1 – ширина обводки значка в пикселях.
size:18 – размер значка в пикселях.
_images/mapsurf_adm1000.png

Рис. 6.1 Пример стиля точечного слоя офисов банков и банкоматов с использованием стандартных значков (кругов) для категорий

Пример стиля точечного слоя с использованием иконок для категорий

/* @title Магазины местного значения */
[ shop = 'convenience' ] {
   mark-opacity: 1;
   mark-rotation: 0;
   mark-size: 28;
   mark: url(https://public.activemap.ru/dictionary/icons/78/view);
}
/* @title Супермаркеты */
[ shop = 'supermarket' ] {
   mark-opacity: 1;
   mark-rotation: 0;
   mark-size: 28;
   mark: url(https://public.activemap.ru/dictionary/icons/79/view);
}
/* @title Магазины одежды */
[ shop = 'clothes' ] {
   mark-opacity: 1;
   mark-rotation: 0;
   mark-size: 28;
   mark: url(https://public.activemap.ru/dictionary/icons/80/view);
}
/* @title Магазины обуви */
[ shop = 'shoes' ] {
   mark-opacity: 1;
   mark-rotation: 0;
   mark-size: 28;
   mark: url(https://public.activemap.ru/dictionary/icons/81/view);
}
/* @title Зоомагазины */
[ shop = 'pet' ] {
   mark-opacity: 1;
   mark-rotation: 0;
   mark-size: 28;
   mark: url(https://public.activemap.ru/dictionary/icons/82/view);
}
/* @title Магазины компьютеров и бытовой электроники */
[ shop = 'electronics' or shop = 'computer' ] {
   mark-opacity: 1;
   mark-rotation: 0;
   mark-size: 28;
   mark: url(https://public.activemap.ru/dictionary/icons/83/view);
}
/* @title Магазины автозапчастей */
[ shop = 'car_parts' ] {
   mark-opacity: 1;
   mark-rotation: 0;
   mark-size: 28;
   mark: url(https://public.activemap.ru/dictionary/icons/84/view);
}

Где:

/* @title Магазины местного значения */ – название категории, которое будет отображаться в легенде.
[shop = 'convenience'] – поле, по которому идет фильтрация, и значение поля.
mark-opacity: 1 – прозрачность иконки (изменяется от 0 – полная прозрачность, до 1 – полная непрозрачность).
mark-rotation: 0 – угол вращения иконки в градусах.
mark-size: 28 – размер иконки в пикселях.
url(https://public.activemap.ru/dictionary/icons/78/view) – ссылка на иконку. Ее можно получить, перейдя в блок "Слои", вкладку "Иконки", нажав правой кнопкой мыши по иконке и выбрав "Копировать URL картинки" (:ref:`icon_url`).
_images/mapsurf_adm1001.png

Рис. 6.2 Пример стиля точечного слоя магазинов с использованием иконок для категорий товаров

Пример стиля линейного слоя с подписями и информацией о цвете линий из данных

* {
  stroke: [stroke_color];
  stroke-dashoffset: 0;
  stroke-linecap: butt;
  stroke-width: 4;
  label: [naimen];
  font-family: Arial;
  font-weight: bold;
  font-fill: black;
  font-size: 12;
  halo-color: white;
  halo-radius: 2;
  -gt-label-follow-line: true;
  -gt-label-max-angle-delta: 60;
  -gt-label-max-displacement: 400;
  -gt-label-repeat: 300;
  }

Где:

stroke: [stroke_color] – цвет обводки линии. В данном случае берется из значения указанного поля (stroke_color) и не отображается в легенде.
stroke-dashoffset: 0 - смещение обводки относительно начального положения в пикселях.
stroke-linecap: round – параметр, определяющий форму концов линий (round – закругленные углы, butt - обрыв под прямым углом сразу после окончания линии, square - обрыв под прямым углом через расстояние, равное половине stroke-width).
stroke-width: 4 – ширина линий в пикселях.
label: [naimen] – название поля, значения которого используются для подписи объектов.
font-family: Arial – семейство шрифтов для подписи объектов.
font-weight: bold – насыщенность шрифта (толщина символов подписи).
font-fill: black – цвет шрифта. Допускается использовать название или шестнадцатеричный код цвета (black = #000000).
font-size: 10 – размер шрифта в пикселях.
halo-color: white – цвет обводки подписи. Допускается использовать название или шестнадцатеричный код цвета (black = #000000).
halo-radius: 1 – радиус обводки подписи в пикселях.
-gt-label-follow-line: – следование подписей контурам линейных объектов.
-gt-label-max-angle-delta: 90 – максимальный угол изгиба подписи в градусах.
-gt-label-max-displacement: 400 – максимальное смещение метки в пикселях.
-gt-label-repeat: 150 – повторение подписи объекта через заданное количество пикселей.
_images/mapsurf_adm1002.png

Рис. 6.3 Пример стиля слоя линий метро с подписями и информацией о цвете линий из данных

Пример стиля линейного слоя дорожной сети с подписями и разными типами линий для категорий

  * {
  label: [name];
  font-family: Arial;
  font-weight: bold;
  font-fill: black;
  font-size: 10;
  halo-color: white;
  halo-radius: 1;
  -gt-label-follow-line: true;
  -gt-label-max-angle-delta: 90;
  -gt-label-max-displacement: 400;
  -gt-label-repeat: 150;
  }

/* @title Автомагистрали */
[stylegroup = 'motorway'] {
stroke: #d1386f, #db798f;
stroke-width: 8px, 6px;
stroke-linecap: round;
z-index: 8, 9;
}

/* @title Основные магистрали */
[stylegroup = 'mainroad'] {
stroke: #be9239, #f8ce8c;
stroke-width: 6px, 4px;
stroke-linecap: round;
z-index: 6, 7;
}

/* @title Улицы */
[stylegroup = 'minorroad'] {
stroke: #d9d6d0, #fefefe;
stroke-width: 4px, 3px;
stroke-linecap: round;
z-index: 4, 5;
}

/* @title Проезды */
[stylegroup = 'service'] {
stroke: #d9d6d0, #fefefe;
stroke-width: 3px, 2px;
stroke-linecap: round;
z-index: 2, 3;
}

/* @title Пешеходные зоны */
[stylegroup = 'noauto'] {
stroke: #f99589;
stroke-width: 3px;
stroke-dasharray: 5 2;
z-index: 1;
}

/* @title Другие */
[stylegroup = 'other'] {
stroke: #d9d6d0;
stroke-width: 2px;
z-index: 0;
}

Где:

1.  Общие параметры, определяемые для всего слоя:

label: [name] – название поля, значения которого используются для подписи объектов.
font-family: Arial – семейство шрифтов для подписи объектов.
font-weight: bold – насыщенность шрифта (толщина символов подписи).
font-fill: black – цвет шрифта. Допускается использовать название или шестнадцатеричный код цвета (black = #000000).
font-size: 10 – размер шрифта в пикселях.
halo-color: white – цвет обводки подписи. Допускается использовать название или шестнадцатеричный код цвета (black = #000000).
halo-radius: 1 – радиус обводки подписи в пикселях.
-gt-label-follow-line: – следование подписей контурам линейных объектов.
-gt-label-max-angle-delta: 90 – максимальный угол изгиба подписи в градусах.
-gt-label-max-displacement: 400 – максимальное смещение метки в пикселях.
-gt-label-repeat: 150 – повторение подписи объекта через заданное количество пикселей.


2.  Параметры для отдельных категорий:

Простая линия:

/* @title Другие */ – название категории, которое будет отображаться в легенде.
[stylegroup = 'other']– поле, по которому идет фильтрация, и значение поля.
stroke: #d9d6d0 – цвет обводки линий. Допускается использовать название или шестнадцатеричный код цвета.
stroke-width: 2px – ширина линий в пикселях.
z-index: 0 – порядок показа категории относительно других категорий слоя(начинается с 0, объекты с z-index: 0 будут отображаться под всеми другими объектами с большими значениями индекса).


Пунктирная линия:

/* @title Пешеходные зоны */ – название категории, которое будет отображаться в легенде.
[stylegroup = 'noauto'] – поле, по которому идет фильтрация, и значение поля.
stroke: #f99589 – цвет обводки линий. Допускается использовать название или шестнадцатеричный код цвета.
stroke-width: 3px – ширина линии.
stroke-dasharray: 5 2 – длина штрихов (5) и пробелов (2) в пикселях.
z-index: 1 – порядок показа категории относительно других категорий слоя.


Линия с обводкой:

/* @title Автомагистрали */ – название категории, которое будет отображаться в легенде.
[stylegroup = 'motorway'] – поле, по которому идет фильтрация, и значение поля.
stroke: #d1386f, #db798f – цвета обводок для линий. Допускается использовать название или шестнадцатеричный код цвета.
stroke-width: 8px, 6px – ширина линий в пикселях.
stroke-linecap: round – параметр, определяющий форму концов линий (round – закругленные углы, butt - обрыв под прямым углом сразу после окончания линии, square - обрыв под прямым углом через расстояние, равное половине stroke-width).
z-index: 8, 9 – порядок показа категории относительно других категорий слоя и линий внутри одной категории при имитации стиля с обводкой.

Для линий в CSS нет понятия «заливка», есть только «обводка». Таким образом, в отличие от точек и полигонов невозможно стилизовать «край» линии. Однако этого эффекта можно добиться, нарисовав каждую линию дважды: один раз с определенной шириной и еще раз с немного меньшей шириной. Это создает иллюзию заполнения и обводки. Стиль использует поддержку CSS «многозначных свойств» с указанием двух цветов и ширин. В данном случае автомагистрали окрашиваются сначала темно-красной линией (#d1386f) шириной 8 пикселей, а затем более тонкой розовой линией (#db798f) шириной 5 пикселей. Поскольку каждая линия рисуется дважды, важен порядок рендеринга, определяемый параметром z-index. Более широкая линия должна иметь меньшее значение индекса, чтобы не перекрыть более тонкую.

_images/mapsurf_adm1003.png

Рис. 6.4 Пример стиля линейного слоя дорожной сети с подписями и разными типами линий для категорий

Пример стиля площадного слоя с заливкой по диапазонам

*{
    fill-opacity:0.7;
    stroke:#254911;
    stroke-width:1;
  font-family: "Times New Roman";
  font-style: "normal";
  font-weight: "bold";
  font-size:10;
  font-fill:#000000;
  label-anchor: 0.5 0;
  label: [name];
  label-geometry: [centroid(the_geom)];
  -gt-label-max-displacement: 40;
  -gt-label-auto-wrap: 70;

}

/* @title Население < 20000 человек */
[population_num < 20000] {
  fill:  #BDD880;}

/* @title Население от 20000 до 50000 человек */
 [population_num > 20000 and population_num < 50000]{
  fill:  #FFEB84;}

/* @title Население от 50000 до 100000 человек */
 [population_num > 50000 and population_num < 100000]{
  fill:  #FDBA7B;}

/* @title Население > 100000 человек */
 [population_num > 100000]{
  fill:  #F8696B;}

Где:

1.  Общие параметры, определяемые для всего слоя:

fill-opacity:0.7 – прозрачность заливки полигонов (изменяется от 0 до 1).
stroke:#254911 – цвет обводки полигонов. Допускается использовать название или шестнадцатеричный код цвета.
stroke-width:1 – ширина обводки полигонов в пикселях.
font-family: "Times New Roman" – семейство шрифтов для подписи объектов.
font-style: "normal" – начертание шрифта (обычное, курсивное или наклонное).
font-weight: "bold" – насыщенность шрифта (толщина символов подписи).
font-size:10 – размер шрифта.
font-fill:#000000 – цвет символов подписи. Допускается использовать название или шестнадцатеричный код цвета (black = #000000).
label-anchor: 0.5 0 – точка привязки, определяющая размещение подписи относительно центроида многоугольника. В данном случае подпись сдвинута на 50% по горизонтали от центроида многоугольника и отцентрирована по вертикали.
label: [name] – название поля, значения которого используются для подписи объектов.
label-geometry: [centroid(the_geom)] – относительное расположение подписи (расположение относительно центроида).
-gt-label-max-displacement: 40 – максимальное смещение подписи в пикселях относительно центроида полигона.
-gt-label-auto-wrap: 70 – разбиение подписи на строки, если ее длина превышает указанное значение в пикселях.

2.  Параметры для отдельных диапазонов:

/* @title Население < 20000 человек */*/ – название диапазона, которое будет отображаться в легенде.
[population_num < 20000] – поле, по которому идет фильтрация, и значение поля.
fill:  #BDD880 – цвет заливки полигона для указанного диапазона. Допускается использовать название или шестнадцатеричный код цвета.
_images/mapsurf_adm1004.png

Рис. 6.5 Пример стиля площадного слоя районов с заливкой по диапазонам количества населения

Пример стиля площадного слоя со штриховкой по категориям

/* @title Леса */
  [natural = 'wood'] *{
  fill: symbol('shape://times');
  fill-size: 22px;
  stroke: darkgreen;
  }
  :fill {
  stroke: green;
  size: 8;
 }

  /* @title Луга*/
  [natural = 'grassland'] *{
  fill: symbol('shape://plus');
  fill-size: 12px;
  stroke: darkbrown;
  }
  :fill {
  stroke: brown;
  size: 8;
 }

Где:

/* @title Леса */*/*/ – название категории, которое будет отображаться в легенде.
[natural = 'wood'] – поле, по которому идет фильтрация, и значение поля.
fill: symbol('shape://times') – заливка полигона символами, создающая эффект шртиховки.
fill-size: 22px – размер символов для заливки в пискелях.
stroke: darkgreen – цвет обводки полигонов.
:fill {
  stroke: green; - цвет обводки символов.
  size: 8; - толщина обводки символов.
}
_images/mapsurf_adm1005.png

Рис. 6.6 Пример стиля площадного слоя растительности со штриховкой по категориям земель

6.3. Приложение 3. Примеры настроек и параметров подложки

Предустановленные

Яндекс

Название класса - M.Yandex;

Ключи:
map - схема,
satellite - спутник,
hybrid - гибрид (спутник + схема),
publicMap - народная карта,
publicMapHybrid - гибрид (спутник + народная карта);

Параметры карты - traffic: true|false (включение/выключение слоя дорожных событий).

Google

Название класса - M.Google;

Ключи:
SATELLITE - спутник,
ROADMAP - дорожная карта,
HYBRID - гибрид (спутник + схема),
TERRAIN - рельеф.

Космоснимки

Название класса - M.Kosmosnimki.

OpenStreetMaps

Название класса - M.TileLayer.OpenStreetMap.

Динамически создаваемые

M.TileLayer

Название класса - M.TileLayer;
url – http://{s}.domain/path/{x}/{y}/{z}.png;

Параметры:
minZoom: 0 – минимальный зум;
maxZoom: 18 – максимальный зум;
tileSize: 256 – размер тайла;
subdomains: 'abc' – поддомены;
errorTileUrl: '' – url тайла с ошибкой;
attribution: '' – описание правообладателей;
opacity: 1 – прозрачность;
scheme: 'xyz' – тип xyz  или tms;
zoomOffset: 0 – сдвиг зума;
crs: M.CRS.EPSG900913 – проекция.

M.TileLayer.WMS

Название класса - M.TileLayer.WMS;
url – http://domain/path;

Параметры:
minZoom: 0 – минимальный зум;
maxZoom: 18 – максимальный зум;
tileSize: 256 – размер тайла;
errorTileUrl: '' – url тайла с ошибкой;
attribution: '' – описание правообладателей;
opacity: 1 – прозрачность;
zoomOffset: 0 – сдвиг зума;
crs: M.CRS.EPSG900913 – проекция;
version: '1.1.1' – версия WMS;
layers: '' – список слоев;
styles: '' – список стилей;
format: 'image/jpeg' – формат изображений;
transparent: false – прозрачность.