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 – размер значка в пикселях.
Пример стиля точечного слоя с использованием иконок для категорий
/* @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`).
Пример стиля линейного слоя с подписями и информацией о цвете линий из данных
* {
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 – повторение подписи объекта через заданное количество пикселей.
Пример стиля линейного слоя дорожной сети с подписями и разными типами линий для категорий
* {
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. Более широкая линия должна иметь меньшее значение индекса, чтобы не перекрыть более тонкую.
Пример стиля площадного слоя с заливкой по диапазонам
*{
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 – цвет заливки полигона для указанного диапазона. Допускается использовать название или шестнадцатеричный код цвета.
Пример стиля площадного слоя со штриховкой по категориям
/* @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; - толщина обводки символов.
}
6.3. Приложение 3. Примеры настроек и параметров подложки
Предустановленные
Яндекс
Название класса - M.Yandex;
Ключи:
map - схема,
satellite - спутник,
hybrid - гибрид (спутник + схема),
publicMap - народная карта,
publicMapHybrid - гибрид (спутник + народная карта);
Параметры карты - traffic: true|false (включение/выключение слоя дорожных событий).
Название класса - 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 – прозрачность.