5.6. Стили векторных слоёв¶
Стили служат для описания способов визуализации геоданных и являются одним из ресурсов NextGIS Web. Именно стиль добавляется на карты для представления на ней геоданных.
Стиль связан с конкретным слоем, поэтому пункта «Стиль» в основном списке ресурсов нет. Для создания стиля необходимо сначала зайти в ресурс слоя, для которого он создаётся.
5.6.1. Форматы¶
Сейчас NextGIS Web поддерживает две библиотеки рендеринга: «Mapserver» и «QGIS».
Стиль Mapserver можно писать в текстовом виде.
У стиля QGIS гораздо больше настроек и несколько варинатов содания.
5.6.2. Векторный стиль QGIS¶
Зайдите в ресурс слоя, для которого хотите создать стиль.
Для того, чтобы создать стиль QGIS с настройками по умолчанию, достаточно нажать кнопку на странице слоя.

Рис. 5.104. Создание стиля QGIS по умолчанию¶
Если вы хотите настроить создаваемый стиль, то нужно в блоке операций на правой боковой панели в разделе «Создать ресурс» выбрать «Векторный стиль QGIS» (см. Рис. 5.105.).

Рис. 5.105. Выбор стиля QGIS¶
После выбора «Стиль QGIS» откроется диалог создания ресурса.
Вы можете загрузить файл стиля или создать простой векторный стиль самостоятельно.
Стиль QGIS из файла¶
Для того, чтобы загрузить готовый стиль, на вкладке Стиль QGIS необходимо выбрать qml-файл стиля на устройстве или перетащить его в эту область (см. Рис. 5.106.).
Здесь же при необходимости можно выбрать ресурс библиотеки маркеров SVG, в которой находится иконка для отображения на веб-карте.

Рис. 5.106. Загрузка файла QML¶
Предупреждение
Необходимый для загрузки файл может быть получен с помощью NextGIS QGIS и сохранен на компьютере (см. Рис. 5.107.). Для создания стиля, использующего SVG-маркеры, необходимо указать в свойствах слоя тип SVG-маркер и прописать полный путь до файла на машине (см. Рис. 5.108.). Название и формат файла должны совпадать с тем, что загружен в ресурс Библиотека маркеров SVG, который пользователь выбирает при загрузке файла QML.

Рис. 5.107. Сохранение qml-файла в NextGIS QGIS¶

Рис. 5.108. Настройка свойств стиля в NextGIS QGIS¶
На вкладке «Ресурс» вы можете задать пользовательское наименование стиля. Можно также ввести описание и метаданные на соответствующих вкладках. Настройки тайлового кэша подробно описаны в данном разделе.
После загрузки файла QML нажмите на кнопку «Создать». После обработки запроса откроется окно ресурса QGIS стиля (см. Рис. 5.109.).

Рис. 5.109. Созданный ресурс QGIS стиля¶
Загруженный файл QML стиля можно заменить.
Пользовательский стиль QGIS¶
Если вы хотите самостоятельно создать простой векторный стиль, выберите в выпадающем меню «Пользовательский стиль». Для него можно настроить:
Форму символа (круг, квадрат, треугольник, звезда, крест)
Размер символа и ширину контура (можно ввести с клавиатуры или увеличить/уменшить стрелочками)
Цвет и прозрачность заливки и контура (можно выбрать пипеткой, настроить ползунками или ввести значения в системе HEX, HSB или RGB)

Рис. 5.110. Настройка пользовательского стиля¶
На вкладке «Ресурс» вы можете задать пользовательское наименование стиля. Можно также ввести описание и метаданные на соответствующих вкладках. Настройки тайлового кэша подробно описаны в данном разделе.
Задав нужные параметры, нажмите на кнопку «Создать». После обработки запроса откроется окно ресурса QGIS стиля (см. :numref:``).

Рис. 5.111. Созданный ресурс QGIS стиля¶
Созданный стиль QGIS можно редактировать.
5.6.3. Редактирование стиля QGIS¶
Для того, чтобы изменить стиль, нажмите на иконку карандаша справа от стиля в списке ресурсов.

Рис. 5.112. Вызов окна редактирования¶
В открывшемся окне вы можете заменить стиль, загрузив новый со своего устройства. Для этого нужно на вкладке «Стиль QGIS» в выпадающем меню выбрать «Стиль из файла» и затем добавить файл QML или SLD и нажать Сохранить.
Простой векторный стиль QGIS, например, стиль по умолчанию, можно редактировать прямо в браузере.
Для этого на вкладке «Стиль QGIS» в выпадающем меню выберите «Пользовательский стиль». Вы можете настроить:
Форму символа (круг, квадрат, треугольник, звезда, крест)
Размер символа и ширину контура (можно ввести с клавиатуры или увеличить/уменшить стрелочками)
Цвет и прозрачность заливки и контура (можно выбрать пипеткой, настроить ползунками или ввести значения в системе HEX, HSB или RGB)

Рис. 5.113. Редактирование маркера векторного стиля¶
5.6.4. Стиль Mapserver¶
Для создания стиля MapServer необходимо сначала зайти в слой, для которого вы его создаёте. В окне свойств поля «Создать ресурс» выбрать «Стиль MapServer».

Рис. 5.114. Выбор стиля MapServer¶
После выбора «Стиль MapServer» откроется диалог создания ресурса (см. Рис. 5.115.). В открывшемся окне на вкладке «Ресурс» необходимо внести данные в обязательное к заполнению поле - «Наименование».

Рис. 5.115. Наименование стиля Mapserver¶
Поле «Ключ» является опциональным. Можно также ввести описание и метаданные на соответствующих вкладках. Настройки тайлового кэша подробнее описаны в данном разделе.
При желании на вкладке «Стиль MapServer» можно построчно ввести стиль вручную (см. Рис. 5.116.). Если этого не сделать, будут использованы значения по умолчанию.

Рис. 5.116. Вкладка «Стиль MapServer»¶
После нажатия кнопки «Создать» начнется процесс обработки запроса, по окончании которого откроется ресурс стиля Mapserver:

Рис. 5.117. Созданный стиль Mapserver¶
5.6.5. Тайловый кэш¶
На вкладке Тайловый кэш при создании стиля (слоя для WMS и TMS) пользователь имеет возможность задать настройки кэширования стиля (слоя для WMS и TMS) (см. Рис. 5.118.):
Включение -включение/выключение кэширования тайлов;
Разрешить тайлы для запросов изображений - при запросе изображения (не тайла) использовать закэшированные тайлы при их наличии;
Максимальный масштабный уровень - пороговое значение, выше которого обращение к кэшу не происходит, изображение карты рендерится на лету;
TTL, сек (Time to live) - “время жизни” или хранения тайлов на сервере в секундах, после которого при следующем запросе изображение будет формироваться заново. Если TTL = 0, то время хранения тайлов не ограничено;
Очистить - write only - очищает тайловый кэш при сохранении стиля.

Рис. 5.118. Настройки тайлового кэша¶
5.6.6. Добавление стиля на карту¶
Для добавления на веб-карту слоя со стилем QGIS необходимо открыть её в режиме редактирования (изменения). На вкладке Слои нужно добавить стиль соответствующего слоя (или слой, если этого требует специфика данных - TMS, WMS) и нажать Сохранить (см. Рис. 5.119.).
Также на данной вкладке можно:
Добавить слой
Добавить группу
Удалить слой или группу
Изменить отображемый порядок слоев

Рис. 5.119. Добавления QGIS стиля на веб-карту¶
Чтобы посмотреть карту, нажмите Открыть на правой боковой панели, находясь внутри ресурса веб-карта. Откроется окно веб-карты с загруженными стилями. Если в свойствах qml-файлов были прописаны пути до svg-маркеров и в настройках стилей в веб-интерфейсе указаны библиотеки соответствующих маркеров, то слой на карте отобразится соответствующим образом (см. Рис. 5.120.).

Рис. 5.120. Веб-карта с QGIS стилем (с svg-маркерами)¶
5.6.7. Теги языка картостилей Mapserver¶
Для правки стиля, или написания нового рекомендуется взять код какого-нибудь существующего стиля из примера, и потом дополнять его, а не писать с нуля.
Общие теги¶
<color red=»255» green=»170» blue=»127»/> - цвет заливки или линии
<outlinecolor red=»106» green=»106» blue=»106»/> - цвет обводки
<width>0.5</width> - толщина линии или границы полигона в пикселях.
<outlinewidth>3</outlinewidth> - ширина обводки
<minscaledenom>1</minscaledenom> - не рисовать объект на масштабе больше указанного (когда карта крупнее чем)
<maxscaledenom>100000</maxscaledenom> - не рисовать объект на масштабе меньше указанного (когда карта мельче чем)
Значки¶

Рис. 5.121. Демонстрация различных видов штриховок¶
<symbol>std:circle</symbol> - тип значка
std:rectangle - квадратик
std:circle - кружок
std:diamond - ромбик
std:triangle - треугольник острием вверх
std:triangle-equilateral - треугольник острием вниз
std:star - пятиконечная звёздочка
std:pentagon - пятиугольник
std:arrow - стрелка (по умолчанию вверх, можно поворачивать тегом <angle>45</angle>)
std:cross - +
std:xcross - x
std:line - коротенькая линия
std:hatch - длинная линия, стыкующаяся в текстуру
Эти значки можно использовать для рисования линии, заливки полигонов, или обозначения точек. Так же их можно комбинировать в такую конструкцию:
<class>
<expression>"industrial"</expression>
<!-- Промзоны -->
<style> <!-- штриховка направо -->
<color red="255" green="50" blue="50"/>
<width>1.4</width>
<symbol>std:hatch</symbol>
<gap>10</gap>
<size>5</size>
<angle>45</angle>
</style>
<style> <!-- штриховка налево-->
<color red="255" green="50" blue="50"/>
<width>1.4</width>
<symbol>std:hatch</symbol>
<gap>10</gap>
<size>5</size>
<angle>-45</angle>
</style>
<style> <!-- Обводка -->
<outlinecolor red="255" green="50" blue="50"/>
<width>0.5</width>
</style>
</class>
<size>2</size> - размер значка в пикселях
Линейные объекты¶
<gap>10</gap> - шаг пунктира (используется вместе с <symbol>std:circle</symbol>)
<width>8</width> - ширина линии в пикселах
<classitem>PLACE</classitem> - выборка по атрибуту с названием PLACE. Так же смотрите пример в #Выборка. Поддерживаются следующие операторы
имя атрибута
!=
>=
<=
<
>
=* - сравнение строк без учёта раскладки.
=
lt - меньше
gt - больше
ge - больше или равно
le - меньше или равно
eq - равно
ne - не равно
and - И
&& - И
or - ИЛИ
|| - ИЛИ
<linejoin>round</linejoin> - рисование линии в углах поворота
<linecap>round</linecap> - рисование начала и конца линии

Рис. 5.122. Пример <linecap>butt</linecap> / <linecap>round</linecap> / <linecap>square</linecap>.¶
<pattern>2.5 4.5</pattern> - шаблон пунктира
<angle> - угол поворота значка. Так же можно поворачивать штриховку.
Подписи¶
<labelitem>a_hsnmbr</labelitem> - название атрибута, из которого берётся подпись.
<minscaledenom>100</minscaledenom> - не выводить подпись на масштабе крупнее 1:1000
<maxscaledenom>100000</maxscaledenom> - не выводить подпись на масштабе мельче 1:100000
LABELCACHE [on|off] - не проверял, нашел в исхониках
<position>ur</position> - направление сдвига подписи.
ur - ↗ вверх вправо (в книгах по картографии рекомендуют так делать по умолчанию.
ul - ↖
uc - ↑
cl - ←
cc - строго по центру
cr - →
ll - ↙
lc - ↓
lr - ↘
auto
<Maxoverlapangle> - ?
Неизвестные атрибуты¶
MAXGEOWIDTH
MINGEOWIDTH
OFFSITE
OPACITY [integer|alpha]
SIZEUNITS [feet|inches|kilometers|meters|miles|nauticalmiles|pixels]
SYMBOLSCALEDENOM [double]
TYPE [chart|circle|line|point|polygon|raster|query]
5.6.8. Примеры картостилей Mapserver (OSM-default)¶
Полигональный слой с ограничением по масштабу и подписями¶
<map>
<layer>
<labelitem>a_hsnmbr</labelitem>
<class>
<style>
<color red="255" green="170" blue="127"/>
<outlinecolor red="106" green="106" blue="106"/>
<width>0.425196850394</width>
<maxscaledenom>10000</maxscaledenom> <!-- Ограничение по масштабу -->
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>8.25</size>
<color blue="0" green="0" red="0"/>
<outlinewidth>3</outlinewidth>
<outlinecolor blue="255" green="255" red="255"/>
<position>ur</position>
<maxscaledenom>10000</maxscaledenom>
</label>
</class>
</layer>
</map>
Точечный белый кружок¶
<style>
<color red="255" green="255" blue="255"/>
<outlinecolor red="0" green="0" blue="0"/>
<size>8.50393700787</size>
<symbol>std:circle</symbol>
</style>
Линия из маленьких чёрных кружков¶
<style>
<angle>auto</angle>
<gap>-10</gap>
<color red="255" green="255" blue="255"/>
<outlinecolor red="0" green="0" blue="0"/>
<size>2</size>
<symbol>std:circle</symbol>
</style>
Выборка¶
<map>
<layer>
<labelitem>NAME</labelitem>
<classitem>PLACE</classitem>
<class>
<expression>"city"</expression>
<style>
<color red="255" green="170" blue="0"/>
<outlinecolor red="0" green="0" blue="0"/>
<size>11.3385826772</size>
<symbol>std:circle</symbol>
</style>
<style>
<color red="255" green="170" blue="0"/>
<outlinecolor red="0" green="0" blue="0"/>
<size>5.66929133858</size>
<symbol>std:circle</symbol>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>18</size>
<color blue="0" green="0" red="0"/>
<outlinewidth>3</outlinewidth>
<outlinecolor blue="255" green="255" red="255"/>
<position>ur</position>
</label>
</class>
<class>
<expression>"town"</expression>
<style>
<color red="255" green="255" blue="255"/>
<outlinecolor red="0" green="0" blue="0"/>
<size>11.3385826772</size>
<symbol>std:circle</symbol>
</style>
<style>
<color red="0" green="0" blue="0"/>
<outlinecolor red="0" green="0" blue="0"/>
<size>5.66929133858</size>
<symbol>std:circle</symbol>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>14</size>
<color blue="0" green="0" red="0"/>
<outlinewidth>3</outlinewidth>
<outlinecolor blue="255" green="255" red="255"/>
<position>ur</position>
</label>
</class>
<class>
<expression>"village"</expression>
<style>
<color red="255" green="255" blue="255"/>
<outlinecolor red="0" green="0" blue="0"/>
<size>6.8031496063</size>
<symbol>std:circle</symbol>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>8.25</size>
<color blue="0" green="0" red="0"/>
<outlinewidth>3</outlinewidth>
<outlinecolor blue="255" green="255" red="255"/>
<position>ur</position>
</label>
</class>
<class>
<expression>"hamlet"</expression>
<style>
<color red="255" green="255" blue="255"/>
<outlinecolor red="0" green="0" blue="0"/>
<size>4.25196850394</size>
<symbol>std:circle</symbol>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>8.25</size>
<color blue="0" green="0" red="0"/>
<outlinewidth>3</outlinewidth>
<outlinecolor blue="255" green="255" red="255"/>
<position>ur</position>
</label>
</class>
<class>
<expression>"locality"</expression>
<style>
<color red="255" green="255" blue="255"/>
<outlinecolor red="0" green="0" blue="0"/>
<size>2.83464566929</size>
<symbol>std:circle</symbol>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>6.5</size>
<color blue="0" green="0" red="0"/>
<outlinewidth>3</outlinewidth>
<outlinecolor blue="255" green="255" red="255"/>
<position>ur</position>
</label>
</class>
<class>
<expression>''</expression>
<style>
<color red="255" green="255" blue="255"/>
<outlinecolor red="0" green="0" blue="0"/>
<size>2.83464566929</size>
<symbol>std:circle</symbol>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>8.25</size>
<color blue="0" green="0" red="0"/>
<outlinewidth>3</outlinewidth>
<outlinecolor blue="255" green="255" red="255"/>
<position>ur</position>
</label>
</class>
</layer>
</map>
Площадной слой с классификацией по значению поля и подписями¶
<map>
<layer>
<labelitem>NAME</labelitem>
<class>
<expression>(([num] gt 18) and ([num] le 26.1))</expression>
<style>
<color red="255" green="255" blue="212"/>
<outlinecolor blue="64" green="64" red="64"/>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>8.25</size>
<color blue="0" green="0" red="0"/>
<outlinewidth>3</outlinewidth>
<outlinecolor blue="255" green="255" red="255"/>
<position>ur</position>
<maxscaledenom>7000000</maxscaledenom>
</label>
</class>
<class>
<expression>(([num] gt 26.1) and ([num] le 28.1))</expression>
<style>
<color red="254" green="217" blue="142"/>
<outlinecolor blue="64" green="64" red="64"/>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>8.25</size>
<color blue="0" green="0" red="0"/>
<outlinewidth>3</outlinewidth>
<outlinecolor blue="255" green="255" red="255"/>
<position>ur</position>
<maxscaledenom>7000000</maxscaledenom>
</label>
</class>
<class>
<expression>(([num] gt 28.1) and ([num] le 30))</expression>
<style>
<color red="254" green="153" blue="41"/>
<outlinecolor blue="64" green="64" red="64"/>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>8.25</size>
<color blue="0" green="0" red="0"/>
<outlinewidth>3</outlinewidth>
<outlinecolor blue="255" green="255" red="255"/>
<position>ur</position>
<maxscaledenom>7000000</maxscaledenom>
</label>
</class>
</layer>
</map>
Кластеризация точек на сервере¶
<map>
<symbol>
<type>ellipse</type>
<name>shop</name>
<anchorpoint x="0.5" y="0.5" />
<points>1 1</points>
<filled>true</filled>
</symbol>
<layer>
<labelitem>Cluster_FeatureCount</labelitem>
<classitem>Cluster_FeatureCount</classitem>
<cluster>
<maxdistance>20</maxdistance>
<region>"ellipse"</region>
</cluster>
<class>
<expression>("[Cluster_FeatureCount]" != "1")</expression>
<style>
<symbol>shop</symbol>
<size>20</size>
<color blue="0" green="0" red="180"/>
<outlinecolor blue="64" green="64" red="64"/>
</style>
<label>
<type>truetype</type>
<font>bold-italic</font>
<size>10</size>
<color blue="255" green="255" red="255"/>
<outlinewidth>1</outlinewidth>
<outlinecolor blue="0" green="0" red="0"/>
<position>cc</position>
<offset x="10" y="0" />
</label>
</class>
<class>
<expression>"1"</expression>
<style>
<symbol>shop</symbol>
<size>10</size>
<color blue="0" green="0" red="180"/>
<outlinecolor blue="64" green="64" red="64"/>
</style>
</class>
</layer>
</map>
OSM settlement-point¶
<!-- Стиль с разделением по масштабам-->
<!-- Версия 2015-07-24 -->
<map>
<layer>
<labelitem>NAME</labelitem>
<classitem>PLACE</classitem>
<class>
<expression>"city"</expression> <!-- Большой город -->
<style>
<color red="255" green="170" blue="0"/>
<outlinecolor red="0" green="0" blue="0"/>
<size>11.3385826772</size>
<symbol>std:circle</symbol>
</style>
<style>
<color red="255" green="170" blue="0"/>
<outlinecolor red="0" green="0" blue="0"/>
<size>5.66929133858</size>
<symbol>std:circle</symbol>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>18</size>
<color blue="0" green="0" red="0"/>
<outlinewidth>3</outlinewidth>
<outlinecolor blue="255" green="255" red="255"/>
<position>ur</position>
</label>
</class>
<class>
<expression>"town"</expression> <!-- Средний или малый город -->
<style>
<color red="255" green="255" blue="255"/>
<outlinecolor red="0" green="0" blue="0"/>
<size>11.3385826772</size>
<symbol>std:circle</symbol>
<maxscaledenom>6000000</maxscaledenom>
</style>
<style>
<color red="0" green="0" blue="0"/>
<outlinecolor red="0" green="0" blue="0"/>
<size>5.66929133858</size>
<symbol>std:circle</symbol>
<maxscaledenom>6000000</maxscaledenom>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>14</size>
<color blue="0" green="0" red="0"/>
<outlinewidth>3</outlinewidth>
<outlinecolor blue="255" green="255" red="255"/>
<position>ur</position>
<maxscaledenom>6000000</maxscaledenom>
</label>
</class>
<class>
<expression>"village"</expression> <!-- Посёлок -->
<style>
<color red="255" green="255" blue="255"/>
<outlinecolor red="0" green="0" blue="0"/>
<size>6.8031496063</size>
<symbol>std:circle</symbol>
<maxscaledenom>1000000</maxscaledenom>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>8.25</size>
<color blue="0" green="0" red="0"/>
<outlinewidth>3</outlinewidth>
<outlinecolor blue="255" green="255" red="255"/>
<position>ur</position>
<maxscaledenom>1000000</maxscaledenom>
</label>
</class>
<class>
<expression>"hamlet"</expression> <!-- Деревня -->
<style>
<color red="255" green="255" blue="255"/>
<outlinecolor red="0" green="0" blue="0"/>
<size>4.25196850394</size>
<symbol>std:circle</symbol>
<maxscaledenom>500000</maxscaledenom>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>8.25</size>
<color blue="0" green="0" red="0"/>
<outlinewidth>3</outlinewidth>
<outlinecolor blue="255" green="255" red="255"/>
<position>ur</position>
<maxscaledenom>500000</maxscaledenom>
</label>
</class>
<class>
<expression>"locality"</expression> <!-- Необитаемая местность -->
<style>
<color red="255" green="255" blue="255"/>
<outlinecolor red="0" green="0" blue="0"/>
<size>2.83464566929</size>
<symbol>std:circle</symbol>
<maxscaledenom>500000</maxscaledenom>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>6.5</size>
<color blue="0" green="0" red="0"/>
<outlinewidth>3</outlinewidth>
<outlinecolor blue="255" green="255" red="255"/>
<position>ur</position>
<maxscaledenom>500000</maxscaledenom>
</label>
</class>
<class>
<expression>''</expression>
<style>
<color red="255" green="255" blue="255"/>
<outlinecolor red="0" green="0" blue="0"/>
<size>2.83464566929</size>
<symbol>std:circle</symbol>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>8.25</size>
<color blue="0" green="0" red="0"/>
<outlinewidth>3</outlinewidth>
<outlinecolor blue="255" green="255" red="255"/>
<position>ur</position>
</label>
</class>
</layer>
</map>
OSM highway-lowzoom¶
Дороги общего пользования (мелкие вынесены в отдельный стиль дальше, чтобы можно было отдельно включать-выключать). Цветовая схема - с openstreetmap.de

Рис. 5.123. Фрагмент цветовой схемы дорог общего пользования.¶
<map>
<!-- Highways for low-zoom from openstreetmap (from motorway to residential) version 2015-11-06 -->
<layer>
<classitem>Highway</classitem>
<labelitem>Name</labelitem>
<class>
<expression>"motorway"</expression>
<style>
<color red="185" green="49" blue="49" />
<linejoin>round</linejoin>
<width>8</width>
<linecap>round</linecap>
</style>
<style>
<color red="226" green="114" blue="114" />
<linejoin>round</linejoin>
<width>4</width>
<linecap>round</linecap>
</style>
<style>
<color red="255" green="255" blue="255" />
<linejoin>round</linejoin>
<width>1</width>
<linecap>round</linecap>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>7</size>
<color blue="0" green="0" red="0" />
<outlinewidth>1</outlinewidth>
<outlinecolor blue="255" green="255" red="255" />
<angle>follow</angle>
<antialias>true</antialias>
<repeatdistance>300</repeatdistance>
<maxoverlapangle>20.0</maxoverlapangle>
</label>
</class>
<class>
<expression>"motorway_link"</expression>
<style>
<color red="185" green="49" blue="49" />
<linejoin>round</linejoin>
<width>8</width>
<linecap>round</linecap>
</style>
<style>
<color red="226" green="114" blue="114" />
<linejoin>round</linejoin>
<width>4</width>
<linecap>round</linecap>
</style>
<style>
<color red="255" green="255" blue="255" />
<linejoin>round</linejoin>
<width>1</width>
<linecap>round</linecap>
</style>
</class>
<class>
<expression>"trunk"</expression>
<style>
<color red="185" green="49" blue="49" />
<linejoin>round</linejoin>
<width>8</width>
<linecap>round</linecap>
</style>
<style>
<color red="226" green="114" blue="114" />
<linejoin>round</linejoin>
<width>4</width>
<linecap>round</linecap>
</style>
<style>
<color red="255" green="255" blue="255" />
<linejoin>round</linejoin>
<width>1</width>
<linecap>round</linecap>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>7</size>
<color blue="0" green="0" red="0" />
<outlinewidth>1</outlinewidth>
<outlinecolor blue="255" green="255" red="255" />
<angle>follow</angle>
<antialias>true</antialias>
<repeatdistance>300</repeatdistance>
<maxoverlapangle>20.0</maxoverlapangle>
</label>
</class>
<class>
<expression>"trunk_link"</expression>
<style>
<color red="185" green="49" blue="49" />
<linejoin>round</linejoin>
<width>8</width>
<linecap>round</linecap>
</style>
<style>
<color red="226" green="114" blue="114" />
<linejoin>round</linejoin>
<width>4</width>
<linecap>round</linecap>
</style>
<style>
<color red="255" green="255" blue="255" />
<linejoin>round</linejoin>
<width>1</width>
<linecap>round</linecap>
</style>
</class>
<class>
<expression>"primary"</expression>
<style>
<color red="141" green="67" blue="70" />
<linejoin>round</linejoin>
<width>6.4062992126</width>
<linecap>round</linecap>
</style>
<style>
<color red="226" green="114" blue="114" />
<linejoin>round</linejoin>
<width>3.57165354331</width>
<linecap>round</linecap>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>7</size>
<color blue="0" green="0" red="0" />
<outlinewidth>1</outlinewidth>
<outlinecolor blue="255" green="255" red="255" />
<angle>follow</angle>
<antialias>true</antialias>
<repeatdistance>300</repeatdistance>
<maxoverlapangle>20.0</maxoverlapangle>
</label>
</class>
<class>
<expression>"primary_link"</expression>
<style>
<color red="141" green="67" blue="70" />
<linejoin>round</linejoin>
<width>6.4062992126</width>
<linecap>round</linecap>
</style>
<style>
<color red="226" green="114" blue="114" />
<linejoin>round</linejoin>
<width>3.57165354331</width>
<linecap>round</linecap>
</style>
</class>
<class>
<expression>"secondary"</expression>
<style>
<color red="163" green="123" blue="72" />
<linejoin>round</linejoin>
<width>4</width>
<linecap>round</linecap>
</style>
<style>
<color red="246" green="232" blue="86" />
<linejoin>round</linejoin>
<width>3</width>
<linecap>round</linecap>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>7</size>
<color blue="0" green="0" red="0" />
<outlinewidth>1</outlinewidth>
<outlinecolor blue="255" green="255" red="255" />
<angle>follow</angle>
<antialias>true</antialias>
<repeatdistance>300</repeatdistance>
<maxoverlapangle>20.0</maxoverlapangle>
</label>
</class>
<class>
<expression>"secondary_link"</expression>
<style>
<color red="163" green="123" blue="72" />
<linejoin>round</linejoin>
<width>4</width>
<linecap>round</linecap>
</style>
<style>
<color red="246" green="232" blue="86" />
<linejoin>round</linejoin>
<width>3</width>
<linecap>round</linecap>
</style>
</class>
<class>
<expression>"tertiary"</expression>
<style>
<color red="187" green="187" blue="187" />
<linejoin>round</linejoin>
<width>4</width>
<linecap>round</linecap>
</style>
<style>
<color red="255" green="255" blue="179" />
<linejoin>round</linejoin>
<width>3</width>
<linecap>round</linecap>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>7</size>
<color blue="0" green="0" red="0" />
<outlinewidth>1</outlinewidth>
<outlinecolor blue="255" green="255" red="255" />
<angle>follow</angle>
<antialias>true</antialias>
<repeatdistance>300</repeatdistance>
<maxoverlapangle>20.0</maxoverlapangle>
</label>
</class>
<class>
<expression>"tertiary_link"</expression>
<style>
<color red="187" green="187" blue="187" />
<linejoin>round</linejoin>
<width>4</width>
<linecap>round</linecap>
</style>
<style>
<color red="255" green="255" blue="179" />
<linejoin>round</linejoin>
<width>3</width>
<linecap>round</linecap>
</style>
</class>
<class>
<expression>"unclassified"</expression>
<style>
<color red="187" green="187" blue="187" />
<linejoin>round</linejoin>
<width>4</width>
<linecap>round</linecap>
</style>
<style>
<color red="255" green="255" blue="179" />
<linejoin>round</linejoin>
<width>3</width>
<linecap>round</linecap>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>7</size>
<color blue="0" green="0" red="0" />
<outlinewidth>1</outlinewidth>
<outlinecolor blue="255" green="255" red="255" />
<angle>follow</angle>
<antialias>true</antialias>
<repeatdistance>300</repeatdistance>
<maxoverlapangle>20.0</maxoverlapangle>
<minscaledenom>1</minscaledenom>
<maxscaledenom>40000</maxscaledenom>
</label>
</class>
<class>
<expression>"residential"</expression>
<style>
<color red="187" green="187" blue="187" />
<linejoin>round</linejoin>
<width>2</width>
<linecap>round</linecap>
</style>
<style>
<color red="255" green="255" blue="179" />
<linejoin>round</linejoin>
<width>1</width>
<linecap>round</linecap>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>7</size>
<color blue="0" green="0" red="0" />
<outlinewidth>1</outlinewidth>
<outlinecolor blue="255" green="255" red="255" />
<angle>follow</angle>
<antialias>true</antialias>
<repeatdistance>300</repeatdistance>
<maxoverlapangle>20.0</maxoverlapangle>
<minscaledenom>1</minscaledenom>
<maxscaledenom>40000</maxscaledenom>
</label>
</class>
<class>
<expression>"living_street"</expression>
<style>
<color red="187" green="187" blue="187" />
<linejoin>round</linejoin>
<width>2</width>
<linecap>round</linecap>
</style>
<style>
<color red="255" green="255" blue="179" />
<linejoin>round</linejoin>
<width>1</width>
<linecap>round</linecap>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>7</size>
<color blue="0" green="0" red="0" />
<outlinewidth>1</outlinewidth>
<outlinecolor blue="255" green="255" red="255" />
<angle>follow</angle>
<antialias>true</antialias>
<repeatdistance>300</repeatdistance>
<maxoverlapangle>20.0</maxoverlapangle>
<minscaledenom>1</minscaledenom>
<maxscaledenom>40000</maxscaledenom>
</label>
</class>
</layer>
</map>
OSM highway-maxzoom¶
Дороги подъездные, технологические, грунтовые, пешеходные

Рис. 5.124. Фрагмент изображения карты дорог.¶
<map>
<!-- Highways for high-zoom from openstreetmap (from service to track) version 2015-11-06 -->
<layer>
<classitem>Highway</classitem>
<labelitem>Name</labelitem>
<class>
<expression>"service"</expression>
<style>
<color red="187" green="187" blue="187" />
<linejoin>round</linejoin>
<width>2</width>
<linecap>round</linecap>
</style>
<style>
<color red="255" green="255" blue="255" />
<linejoin>round</linejoin>
<width>1</width>
<linecap>round</linecap>
</style>
</class>
<class>
<expression>"footway"</expression>
<style>
<color red="255" green="0" blue="0" />
<linejoin>round</linejoin>
<width>1</width>
<linecap>round</linecap>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>7</size>
<color blue="0" green="0" red="0" />
<outlinewidth>1</outlinewidth>
<outlinecolor blue="255" green="255" red="255" />
<angle>follow</angle>
<antialias>true</antialias>
<repeatdistance>300</repeatdistance>
<maxoverlapangle>20.0</maxoverlapangle>
</label>
</class>
<class>
<expression>"pedestrian"</expression>
<style>
<color red="255" green="0" blue="0" />
<linejoin>round</linejoin>
<width>2</width>
<linecap>round</linecap>
</style>
</class>
<class>
<expression>"path"</expression>
<style>
<color red="255" green="0" blue="0" />
<linejoin>round</linejoin>
<width>1</width>
<linecap>round</linecap>
<pattern>5 5</pattern>
</style>
</class>
<class>
<expression>"track"</expression>
<style>
<color red="153" green="116" blue="43" />
<linejoin>round</linejoin>
<width>2</width>
<pattern>16 8</pattern>
<linecap>round</linecap>
</style>
</class>
</layer>
</map>
OSM railway-line¶
<!-- Стиль railway-line с разделением по масштабам
version 2015-07-24 -->
<map>
<layer>
<classitem>RAILWAY</classitem>
<class>
<expression>"abandoned"</expression>
<style>
<color red="255" green="255" blue="255"/>
<linejoin>round</linejoin>
<width>2.83464566929</width>
<linecap>round</linecap>
</style>
<style>
<pattern>2.35275590551 4.70551181102</pattern>
<color red="165" green="165" blue="165"/>
<linejoin>round</linejoin>
<width>2.35275590551</width>
<linecap>round</linecap>
</style>
</class>
<class>
<expression>"razed"</expression>
<style>
<color red="255" green="255" blue="255"/>
<linejoin>round</linejoin>
<width>2.83464566929</width>
<linecap>round</linecap>
</style>
<style>
<pattern>2.35275590551 4.70551181102</pattern>
<color red="255" green="165" blue="210"/>
<linejoin>round</linejoin>
<width>2.35275590551</width>
<linecap>round</linecap>
</style>
</class>
<class>
<expression>"construction"</expression>
<style>
<color red="255" green="255" blue="255"/>
<linejoin>round</linejoin>
<width>2.83464566929</width>
<linecap>round</linecap>
</style>
<style>
<pattern>2.35275590551 4.70551181102</pattern>
<color red="255" green="0" blue="127"/>
<linejoin>round</linejoin>
<width>2.35275590551</width>
<linecap>round</linecap>
</style>
</class>
<class>
<expression>"crossing"</expression>
<style>
<color red="37" green="37" blue="255"/>
<linejoin>bevel</linejoin>
<width>0.737007874016</width>
<linecap>square</linecap>
</style>
</class>
<class>
<expression>"light_rail"</expression>
<style>
<color red="0" green="0" blue="0"/>
<linejoin>bevel</linejoin>
<width>1.41732283465</width>
<linecap>square</linecap>
</style>
</class>
<class>
<expression>"narrow_gauge"</expression>
<style>
<color red="150" green="150" blue="150"/>
<linejoin>bevel</linejoin>
<width>1.41732283465</width>
<linecap>square</linecap>
</style>
</class>
<class>
<expression>"platform"</expression>
<style>
<color red="0" green="0" blue="0"/>
<linejoin>bevel</linejoin>
<width>4.25196850394</width>
<linecap>square</linecap>
</style>
</class>
<class>
<expression>"rail"</expression>
<style>
<color red="0" green="0" blue="0"/>
<linejoin>bevel</linejoin>
<width>2.83464566929</width>
<linecap>square</linecap>
<maxscaledenom>25000</maxscaledenom> <!-- Чёрно-белая линия на крупном масштабе -->
</style>
<style>
<pattern>9.41102362205 14.1165354331</pattern>
<color red="255" green="255" blue="255"/>
<linejoin>bevel</linejoin>
<width>2.35275590551</width>
<linecap>square</linecap>
<maxscaledenom>25000</maxscaledenom> <!-- Чёрно-белая линия на крупном масштабе -->
</style>
<style>
<color red="0" green="0" blue="0"/>
<linejoin>bevel</linejoin>
<width>2</width>
<linecap>square</linecap>
<minscaledenom>25000</minscaledenom> <!-- Чёрная линия на среднем масштабе -->
</style>
</class>
<class>
<expression>"siding"</expression>
<style>
<color red="145" green="145" blue="145"/>
<linejoin>bevel</linejoin>
<width>1.41732283465</width>
<linecap>square</linecap>
</style>
</class>
<class>
<expression>"subway"</expression>
<style>
<pattern>1.41732283465 2.83464566929</pattern>
<color red="155" green="155" blue="155"/>
<linejoin>round</linejoin>
<width>1.41732283465</width>
<linecap>round</linecap>
</style>
</class>
<class>
<expression>"tram"</expression>
<style>
<color red="0" green="0" blue="0"/>
<linejoin>bevel</linejoin>
<width>1.41732283465</width>
<linecap>square</linecap>
</style>
</class>
</layer>
</map>
OSM water-line¶
<!-- Стиль water-line с разделением по масштабам-->
<!-- Версия 2015-07-24 -->
<map>
<layer>
<classitem>Waterway</classitem>
<labelitem>name</labelitem>
<class>
<expression>"river"</expression>
<style>
<color red="102" green="153" blue="204"/>
<linejoin>round</linejoin>
<width>3</width>
<linecap>round</linecap>
<!-- Остались необработанные атрибуты: width_unit, offset_unit, customdash_unit -->
</style>
<label>
<type>truetype</type> <!-- Подпись -->
<font>bold</font>
<size>7</size>
<color blue="255" green="255" red="255"/>
<outlinewidth>1</outlinewidth>
<outlinecolor red="102" green="153" blue="204"/>
<angle>auto</angle>
<repeatdistance>300</repeatdistance>
<maxoverlapangle>90.0</maxoverlapangle>
<maxscaledenom>500000</maxscaledenom>
</label>
</class>
<class>
<expression>"canal"</expression>
<style><!-- вертикальные линии -->
<angle>auto</angle>
<gap>-8.50393700787</gap>
<!-- Остались необработанные атрибуты: interval_unit, placement, offset_unit, offset -->
<color red="102" green="153" blue="204"/>
<outlinecolor red="0" green="0" blue="0"/>
<size>15.66929133858</size>
<symbol>std:line</symbol>
<!-- Остались необработанные атрибуты: outline_width, offset_unit, outline_width_unit, size_unit -->
</style>
<style>
<color red="102" green="153" blue="204"/>
<linejoin>round</linejoin>
<width>3</width>
<linecap>round</linecap>
<!-- Остались необработанные атрибуты: width_unit, offset_unit, customdash_unit -->
</style>
<label>
<type>truetype</type> <!-- Подпись -->
<font>bold</font>
<size>7</size>
<color blue="255" green="255" red="255"/>
<outlinewidth>1</outlinewidth>
<outlinecolor red="102" green="153" blue="204"/>
<angle>auto</angle>
<repeatdistance>300</repeatdistance>
<maxoverlapangle>90.0</maxoverlapangle>
<maxscaledenom>500000</maxscaledenom>
</label>
</class>
<class>
<expression>"stream"</expression>
<style>
<color red="102" green="153" blue="204"/>
<linejoin>round</linejoin>
<width>1.5</width>
<linecap>round</linecap>
<maxscaledenom>250000</maxscaledenom>
<!-- Остались необработанные атрибуты: width_unit, offset_unit, customdash_unit -->
</style>
</class>
<class>
<expression>"drain"</expression>
<style>
<color red="102" green="153" blue="204"/>
<linejoin>round</linejoin>
<width>1</width>
<linecap>round</linecap>
<maxscaledenom>250000</maxscaledenom>
<!-- Остались необработанные атрибуты: width_unit, offset_unit, customdash_unit -->
</style>
</class>
</layer>
</map>
OSM water-polygon¶
<!-- стиль water-polygon
Версия 2015-07-24
Нужно добавить
-водохранилища
-штриховку для болот
-->
<map>
<layer>
<labelitem>NAME</labelitem>
<classitem>NATURAL</classitem>
<class>
<expression>"water"</expression> <!-- Вода -->
<style>
<color red="102" green="153" blue="204"/>
<outlinecolor red="102" green="153" blue="204"/>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>7</size>
<color red="102" green="153" blue="204"/>
<outlinewidth>2</outlinewidth>
<outlinecolor red="255" green="255" blue="222"/>
<!-- Ограничение подписи по масштабу -->
<minscaledenom>1</minscaledenom>
<maxscaledenom>100000</maxscaledenom>
</label>
</class>
<class>
<expression>"wetland"</expression> <!-- Болото -->
<style>
<color red="102" green="153" blue="204"/>
<outlinecolor red="102" green="153" blue="204"/>
</style>
<label>
<type>truetype</type>
<font>regular</font>
<size>7</size>
<color red="102" green="153" blue="204"/>
<outlinewidth>2</outlinewidth>
<outlinecolor red="255" green="255" blue="222"/>
<!-- Ограничение подписи по масштабу -->
<minscaledenom>1</minscaledenom>
<maxscaledenom>100000</maxscaledenom>
</label>
</class>
</layer>
</map>
Использование стиля из поля векторного слоя¶
Имеется возможность настройки стиля отрисовки векторных данных для каждой записи индивидуально. Для этого необходимо завести поле с описание стиля в формате ORG Style. Например,
ogr2ogr -f GeoJSON -sql "select *, OGR_STYLE from Australia" australia.geojson Australia.TAB
Описание формата ORG Style можно изучить по странице Feature Style Specification.
Для векторного слоя с полем OGR_STYLE которое содержит стиль записи необходимо выставить следующий стиль NextGIS Web Mapserver:
<map>
<layer>
<styleitem>OGR_STYLE</styleitem>
<class>
<name>default</name>
</class>
</layer>
</map>
5.6.9. Стиль OSM-black¶
OSM landuse-polygon¶
Стили NextGIS Web поддерживают различные штриховки (см. Рис. 5.121.).
<map> <!-- Демонстрация штриховок, предполагается что под этим слоем будет чёрный фон-->
<layer>
<labelitem>OSM_ID</labelitem>
<classitem>LANDUSE</classitem>
<class>
<expression>"residential"</expression>
<!-- Жилые зоны -->
<style>
<!-- штриховка направо -->
<color red="255" green="185" blue="33"/>
<width>1.4</width>
<symbol>std:line</symbol>
<gap>3</gap>
<size>1</size>
<angle>90</angle>
</style>
<style>
<!-- Обводка -->
<outlinecolor red="255" green="185" blue="33"/>
<width>0.5</width>
</style>
</class>
<class>
<expression>"grass"</expression>
<!-- Газоны зоны -->
<style>
<!-- Линии -->
<color red="20" green="255" blue="33"/>
<width>1</width>
<symbol>std:line</symbol>
<gap>6</gap>
<size>4</size>
<angle>0</angle>
<pattern>2.5 4.5</pattern>
</style>
<style>
<!-- Обводка -->
<outlinecolor red="20" green="255" blue="33"/>
<width>0.5</width>
</style>
</class>
<class>
<expression>"commercial"</expression>
<!-- Жилые зоны -->
<style>
<!-- штриховка направо -->
<color red="133" green="33" blue="25"/>
<width>1.4</width>
<symbol>std:line</symbol>
<gap>10</gap>
<size>5</size>
<angle>45</angle>
</style>
<style>
<!-- Обводка -->
<outlinecolor red="133" green="33" blue="25"/>
<width>0.5</width>
</style>
</class>
<class>
<expression>"industrial"</expression>
<!-- Промзоны -->
<style>
<!-- штриховка направо -->
<color red="255" green="50" blue="50"/>
<width>0.4</width>
<symbol>std:hatch</symbol>
<gap>10</gap>
<size>5</size>
<angle>45</angle>
</style>
<style>
<!-- штриховка налево-->
<color red="255" green="50" blue="50"/>
<width>0.4</width>
<symbol>std:hatch</symbol>
<gap>10</gap>
<size>5</size>
<angle>-45</angle>
</style>
<style>
<!-- Обводка -->
<outlinecolor red="255" green="50" blue="50"/>
<width>0.5</width>
</style>
</class>
<class>
<expression>"cemetery"</expression>
<!-- Кладбоны -->
<style>
<!-- оградки -->
<color red="14" green="166" blue="0"/>
<width>1.4</width>
<symbol>std:rectangle</symbol>
<gap>20</gap>
<size>11</size>
<angle>0</angle>
</style>
<style>
<!-- оградки -->
<color red="0" green="0" blue="0"/>
<width>1.2</width>
<symbol>std:rectangle</symbol>
<gap>20</gap>
<size>10</size>
<angle>0</angle>
</style>
<style>
<!-- кресты -->
<color red="14" green="166" blue="0"/>
<width>1.4</width>
<symbol>std:cross</symbol>
<gap>20</gap>
<size>9</size>
<angle>0</angle>
</style>
<style>
<!-- Обводка -->
<outlinecolor red="14" green="166" blue="0"/>
<width>0.5</width>
</style>
</class>
</layer>
</map>