Мультитул#

Мультитул – это утилита для публикации слоёв и карт на основе CSV; удаления слоёв описанных в CSV (с возможностью удаления их стилей); проверки того, что папка содержит все необходимые SLD для слоёв описанных в CSV; валидации SLD уже опубликованных слоёв на предмет соответствия БД и требованиям легенды.

Для работы доступны консольная версия Мультитула и docker-версия. Docker-версия запускается на сервере с приложением. Консольная – запускается локально.

Особенности работы Мультитула#

  • мультитул плохо работает на проектах, в которых GeoServer создаётся не «с нуля», а с шаблона другого проекта;

  • необходимо учитывать, что при изменении геосеток, параметров геосетки и привязки слоя к геосеткам в приложениях и службах Geometa такие изменения применяются с задержкой. Подробнее читайте в разделе Обновление настроек GeoServer в приложениях и службах Geometa.

  • для работы Мультитула должны быть открыты все порты на GeoServer, нужные;

  • должна быть обновлена сетка;

  • доступ на папки куда сливаются слои должны иметь доступ на чтение;

  • в структуре GeoServer не должно было быть ложных геосерверов, которых физически не существует.

Важно

  • ВСЕ CSV-файлы (указанные ниже), которые используются для работы, должны иметь кодировку UTF-8 (без BOM).

  • Запускайте команды из той папки, в которой расположена папка GisMultitool, при запуске команд из консоли.

  • Если Мультитул запускается на сервере, то файлы разместите по пути, указанном в переменной gvGISMULTITOOL_SHARE_DIR. При обращении к сервису, развернутому на сервере с приложением, в командах указывайте путь до этих файлов по типу /app/share/....

Установка#

  1. Убедитесь в наличии модуля GisMultitool.Service. Модуль уже присутствует, если вы получили пакет с дистрибутивами для проекта.

  2. Укажите следующие переменные в файле vars.yml.

Название переменной

Значение по умолчанию

Описание переменной

vars.yml:

gvGISMULTITOOL_INSTALL_DIR

/opt/GisMultiTool

Директория, в которую будет установлен Мультитул (GisMultiTool)

gvGISMULTITOOL_SHARE_DIR

/opt/GisMultiTool_Share

Директория, в которую будут помещаться файлы для публикации

gvGEOSERVERS_HOSTS

name: "geoserver8080-devops.gemsdev.ru"

ip: "10.1.5.34"

name: "geoserver7080-devops.gemsdev.ru"

ip: "10.1.5.34"

Список названий и адресов геосерверов

  1. Обновите модуль с помощью тега install_gismultitool.

Краткая справка по инструменту#

  • Чтобы получить список допустимых команд приложения, можно воспользоваться командой:

    // Для локального выполнения
    
    dotnet ./GisMultitool/gistool.dll --help
    
    // Для сервиса, развернутого на сервере с приложением
    
    docker exec gismultitool dotnet gistool.dll –help
    
  • Для получения справки по конкретной команде можно воспользоваться командой:

    // Для локального выполнения
    
    dotnet ./GisMultitool/gistool.dll <название команды> --help
    
    // Для сервиса, развернутого на сервере с приложением
    
    docker exec gismultitool dotnet gistool.dll <название команды> --help
    

Например, для получения справки по публикации слоёв команда будет выглядеть следующим образом:

dotnet ./GisMultitool/gistool.dll publish-layers --help

Публикация SLD#

  1. Поместите необходимые SLD в одну папку.

  2. Откройте консоль и выполните команду публикации SLD.

Для публикации SLD потребуются следующие параметры:

  • -d, --sld-dir-path – путь до папки с SLD стилями;

  • -x, --skip-validation – игнорировать ошибки XSD;

  • -n, --schema-names – список схем (указываются через пробел) или можно указать все -a, --all-schemas;

  • -c, --connection – строка подключения к базе данных.

Примеры команд:

// Для локального выполнения

dotnet ./GisMultitool/gistool.dll publish-sld  -d "D:\Мультитул\SLD" -n schema1 schema2 -c "Server=10.1.1.1;Port=5432;Database=ias;User Id=postgres;Password=password;"
// Для сервиса, развернутого на сервере с приложением

docker exec gismultitool dotnet gistool.dll publish-sld -d "/app/share/<название папки с sld>" -n schema1 schema2 -c

Публикация слоёв#

  1. В файле layers.csv разместите список слоёв для публикации, для этого добавьте следующие столбцы:

  • PV слоя – значение Name PV из метаданных слоя. Например, V_GEO_URBAN_ANALYTICS_SOCIAL_STANDARD_DOU;

  • Стиль – стиль применяемый к слою. Стиль следует указывать без уточнения схемы перед именем слоя. Например, вместо: tumenmr:V_GEO_GKN_PARCE, достаточно просто указать V_GEO_GKN_PARCEL;

  • Имя – наименование публикуемого слоя. Имя может быть пустым и не указываться в файле.

  1. Откройте консоль и выполните команду публикации слоёв.

Для публикации слоёв потребуются следующие параметры:

  • -c, --connection – строка подключения к базе данных;

  • -g, --geoserver-name – геосервер (URL геосервера, ключ или отображаемое имя в БД geometa);

  • -n, --schema-names – список схем (указываются через пробел) или можно указать все -a, --all-schemas;

  • -l, --csv-layers – список слоёв в файле .csv.

Примеры команд:

// Для локального выполнения

dotnet ./GisMultitool/gistool.dll publish-layers -c "Server=10.1.1.1;Port=5432;Database=ias;User Id=postgres;Password=password;" -g geoserver80 -l layers.csv -n region mo1
// Для сервиса, развернутого на сервере с приложением

docker exec gismultitool dotnet gistool.dll publish-layers -c "Server=10.1.1.1;Port=5432;Database=ias;User Id=postgres;Password=password;" -g geoserver80 -l /app/share/layers.csv -n region mo1
  1. Дождитесь сообщения о завершении работы приложения и нажмите любую кнопку.

Посмотреть возникшие при публикации слоя ошибки можно в log-файле. Он располагается в папке Мультитул/GisMultitool.

Публикация карт#

  1. В файле maps.csv разместите список слоёв для публикации в карты, для этого добавьте следующие столбцы:

  • PV слоя – значение Name PV из метаданных слоя. Например, V_GEO_URBAN_ANALYTICS_SOCIAL_STANDARD_DOU;

  • Имя карты – наименование карты слоя (создаётся автоматически, если ранее не была создана);

  • Имя слоя – наименование слоя публикуемого в карте;

  • Центр – центр карты в координатах Х и Y. Указывается через «,» в целых числах. Например, 1303011,474984. Если для одной и той же карты в списке указаны разные координаты центра, то в качестве центра по умолчанию применяется координаты первой записи по списку;

  • Масштаб по умолчанию – значение кратности масштаба (возможные значения с 1000000 до 100 с шагом значения 1/2 от предыдущего числа). Значение не должно быть больше значения указанного в качестве максимального масштаба;

  • Максимальный масштаб – значение кратности масштаба (возможные значения с 1000000 до 100 с шагом значения 1/2 от предыдущего числа). Значение не должно превышать значение масштаба по умолчанию и должно быть больше значения «масштаб приближения»;

  • Масштаб приближения – значение кратности масштаба (возможные значения с 1000000 до 100 с шагом значения 1/2 от предыдущего числа). Значение не должно быть больше значения указанного в качестве максимального масштаба.

Важно

  • Имена колонок и значения колонок пишутся через знак «;» без пробелов.

  • Имена колонок – обязательный атрибут. Если в заголовке файла не указано имя колонки, то публикация карт будет завершена с ошибкой.

  • Если какое-либо из значений колонки пустое, то оно не будет применено при публикации карты.

Примечание

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

V_GEO_GISOGD_TERRITORY;;Произвольная территория запроса сведений ГИСОГД
  1. Откройте консоль и выполните команду публикации карт.

Для выполнения команды потребуется следующие параметры:

  • -c, --connection – строка подключения к базе данных;

  • -n, --schema-names – список схем (указываются через пробел) или можно указать все -a, --all-schemas;

  • -l, --csv-layers – список слоёв и их карт в файле .csv.

Примеры команд:

// Для локального выполнения

dotnet ./GisMultitool/gistool.dll publish-maps -c "Server=10.1.1.1;Port=5432;Database=ias;User Id=postgres;Password=password;" -l maps.csv -n schema1 schema2
// Для сервиса, развернутого на сервере с приложением

docker exec gismultitool dotnet gistool.dll publish-maps -c "Server=10.1.1.1;Port=5432;Database=ias;User Id=postgres;Password=password;" -l /app/share/maps.csv -n schema1 schema2
  1. Дождитесь сообщения о завершении работы приложения и нажмите любую кнопку.

Удаление слоёв#

Когда нужно удалить из средней панели ГИС-Конфигуратора и из левой.

  1. В файле delete-layers.csv разместите список слоёв для удаления.

  2. Откройте консоль и выполните команду удаления слоёв.

Для выполнения команды потребуется следующие параметры:

  • -c, --connection – строка подключения к базе данных;

  • -n, --schema-names – список схем (указываются через пробел) или можно указать все -a, --all-schemas;

  • -l, --csv-layers – список слоёв в файле .csv;

  • -s, --clear-styles – по умолчанию удаляет ещё и стили, можно не удалять стили с помощью флага -S.

Примеры команд:

// Для локального выполнения

dotnet ./GisMultitool/gistool.dll clear-layers -c "Server=10.1.1.1;Port=5432;Database=ias;User Id=postgres;Password=password;" -l delete-layers.csv -n schema4 schema2
// Для сервиса, развернутого на сервере с приложением

docker exec gismultitool dotnet gistool.dll clear-layers -c "Server=10.1.1.1;Port=5432;Database=ias;User Id=postgres;Password=password;" -l /app/share/delete-layers.csv -n schema4 schema2
  1. Дождитесь сообщения о завершении работы приложения и нажмите любую кнопку.

Удаление опубликованных слоёв карт и свободных слоёв#

Когда нужно удалить только из левой панели ГИС-Конфигуратора.

  1. В файле deleteMapLayersAndFreeLayers.csv разместите список слоёв для удаления в формате: имя слоя (русское наименование из левой панели ГИС-Конфигуратора) и имя карты (русское наименование из левой панели ГИС-Конфигуратора).

  2. Откройте консоль и выполните команду удаления слоёв.

Для выполнения команды потребуется следующие параметры:

  • -c, --connection – строка подключения к базе данных;

  • -n, --schema-names – список схем (указываются через пробел) или можно указать все -a, --all-schemas;

  • -l, --csv-layers – список слоёв в файле .csv.

Примеры команд:

// Для локального выполнения

dotnet ./GisMultitool/gistool.dll clear-published-layers -c "Server=10.1.1.1;Port=5432;Database=ias;User Id=postgres;Password=password;" -l deleteMapLayersAndFreeLayers.csv -n schema4 schema2
// Для сервиса, развернутого на сервере с приложением

docker exec gismultitool dotnet gistool.dll clear-published-layers -c "Server=10.1.1.1;Port=5432;Database=ias;User Id=postgres;Password=password;" -l /app/share/deleteMapLayersAndFreeLayers.csv -n schema4 schema2 schema2
  1. Дождитесь сообщения о завершении работы приложения и нажмите любую кнопку.

Валидация SLD слоёв#

  1. Откройте консоль и выполните команду валидации SLD.

Для валидации слоев потребуется следующие параметры:

  • -c, --connection – строка подключения к базе данных;

  • -n, --schema-names – список схем (указываются через пробел) или можно указать все -a, --all-schemas;

  • -x, --ignore-xsd – игнорировать ошибки XSD.

Примеры команд:

// Для локального выполнения

dotnet ./GisMultitool/gistool.dll validate-sld -с "Server=10.1.1.1;Port=5432;Database=ias;User Id=postgres;Password=password;" -a -x
// Для сервиса, развернутого на сервере с приложением

docker exec gismultitool dotnet gistool.dll validate-sld -с "Server=10.1.1.1;Port=5432;Database=ias;User Id=postgres;Password=password;" -a -x
  1. Дождитесь сообщения о завершении работы приложения и нажмите любую кнопку.

Создастся файл формата sldValidation_{алиас_проекта}.xml. Информацию о результатах можно просмотреть в нём.

Добавление сортировки объектов слоя в SLD стили проекта#

Важно

Для корректного добавления сортировки необходимо обновить Мультитул.

Для добавления сортировки выполните команду:

// Для локального выполнения

dotnet ./GisMultitool/gistool.dll add-sorting-to-sld -с "Server=10.1.1.1;Port=5432;Database=ias;User Id=postgres;Password=password;" -a
// Для сервиса, развернутого на сервере с приложением

docker exec gismultitool dotnet gistool.dll add-sorting-to-sld -с "Server=10.1.1.1;Port=5432;Database=ias;User Id=postgres;Password=password;" -a

или

// Для локального выполнения

dotnet ./GisMultitool/gistool.dll add-sorting-to-sld -с "Server=10.1.1.1;Port=5432;Database=ias;User Id=postgres;Password=password;" -n schema1 schema2
// Для сервиса, развернутого на сервере с приложением

docker exec gismultitool dotnet gistool.dll add-sorting-to-sld -с "Server=10.1.1.1;Port=5432;Database=ias;User Id=postgres;Password=password;" -n schema1 schema2

При выполнении команды во все стили проектов будет добавлен блок для сортировки объектов слоя по ключу:

<sld:VendorOption name="sortBy">key A</sld:VendorOption></sld:FeatureTypeStyle>

Если в какой-то из SLD стиля слоя уже добавлен блок сортировки, то такой стиль будет пропущен.

Исправление ошибки сортировки объектов слоя в SLD стилях проекта#

Невалидно добавленная сортировка имеет вид:

<sld:VendorOption name="sortBy"><Function name="if_then_else"><Function name="PropertyExists"><Literal>date_insert</Literal></Function><Literal>date_insert A</Literal><Literal>key A</Literal></Function></sld:VendorOption></sld:FeatureTypeStyle>

В тэге <sld:VendorOption name="sortBy">, который описывает сортировку, не может быть вложенных тэгов – только текст.

Чтобы исправить невалидную сортировку:

  1. Выполните бэкап геосервера командой в Linux:

zip -r gs_8077_030724.zip ./8060
  1. Перейдите в директорию data_dir в консоли Linux на сервере, где развернут Geoserver. Например:

cd /opt/geoserver/2.23.2/8060/
  1. Найдите все файлы с некорректным содержимым стиля и сохраните в файл info:

find . -type f -iname "*.sld" -exec grep -li '<sld:VendorOption name="sortBy"><Function name="if_then_else"><Function name="PropertyExists"><Literal>date_insert</Literal></Function><Literal>date_insert A</Literal><Literal>key A</Literal></Function></sld:VendorOption></sld:FeatureTypeStyle>' {} + > info.txt
  1. Просмотрите список некорректных стилей:

less info.txt
  1. Выполните замену:

find . -type f -iname "*.sld" -exec sed -i 's#<sld:VendorOption name="sortBy"><Function name="if_then_else"><Function name="PropertyExists"><Literal>date_insert</Literal></Function><Literal>date_insert A</Literal><Literal>key A</Literal></Function></sld:VendorOption></sld:FeatureTypeStyle>#<sld:VendorOption name="sortBy">key A</sld:VendorOption></sld:FeatureTypeStyle>#g' {} +
  1. Проверьте, остались ли стили с некорректным содержимым, и сохраните их в файл info:

find . -type f -iname "*.sld" -exec grep -li '<sld:VendorOption name="sortBy"><Function name="if_then_else"><Function name="PropertyExists"><Literal>date_insert</Literal></Function><Literal>date_insert A</Literal><Literal>key A</Literal></Function></sld:VendorOption></sld:FeatureTypeStyle>' {} + > info.txt
  1. Проверьте, что все стили исправлены:

less info.txt

Поиск SLD для слоёв в директории с SLD#

  1. В файле layers.csv разместите список слоёв для публикации ввиде столбца имени PV слоя и столбца стиля, применяемого к слою. Стиль следует указывать без уточнения схемы перед именем слоя. Например, вместо tumenmr:V_GEO_GKN_PARCE достаточно просто указать V_GEO_GKN_PARCEL.

  2. Откройте консоль и выполните команду поиска SLD.

Для поиска слоёв потребуется следующие параметры:

  • -c, --connection – строка подключения к базе данных;

  • -l, --csv-layers – путь до .csv файла со слоями;

  • -d, --sld-dir-path – папка с SLD стилями.

Примеры команд:

// Для локального выполнения

dotnet ./GisMultitool/gistool.dll find-sld -с "Server=10.1.1.1;Port=5432;Database=ias;User Id=postgres;Password=password;" -l layers.csv -d "D:\SVN\SLD\Эталон"
// Для сервиса, развернутого на сервере с приложением

docker exec gismultitool dotnet gistool.dll find-sld -с "Server=10.1.1.1;Port=5432;Database=ias;User Id=postgres;Password=password;" -l /app/share/layers.csv -d "/app/share"

Создастся файл foundSld.csv с результатами, где: 1 напротив имени слоя означает что его стиль был найден, 0 – что нет.

Публикация слоя с несуществующим стилем или перенос стиля с другого проекта/GeoServer#

В случае, если необходимо опубликовать слой с несуществующим стилем или перенести стиль с другого проекта/GeoServer, необходимо запустить публикацию слоя через мультитул.

Инструмент создаст стиль с необходимым названием и описанием «gold polygon» по умолчанию.

Далее можно править стиль через конфигуратор или перенести на сервер файл формата .sld с другого проекта/геосервера. Сменить права командой: sudo chown -R geoserver:geoserver /путь до файлов формата .sld/. Перезапустить GeoServer.

Регенерация слоёв#

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

Примечание

В скрипте подставьте свои параметры.

Чтобы сделать регенерацию слоёв:

  1. Подключитесь к серверу геосервера.

  1. Запустите команду из каталога Мультитула для регенерации:

// Для локального выполнения

dotnet gistool.dll regenerate-layer -c "Server=10.1.1.1;Port=5432;Database=ias;User Id=postgres;Password=password;" -n schema1
// Для сервиса, развернутого на сервере с приложением

docker exec gismultitool dotnet gistool.dll regenerate-layer -c "Server=10.1.1.1;Port=5432;Database=ias;User Id=postgres;Password=password;" -n schema1

Где:

  • -l, или --layer-names – список слоёв;

  • -n, --schema-names – список схем (указываются через пробел) или можно указать все -a, --all-schemas;

  • -c, или --connection – строка подключения к базе данных (обязательная).

  1. Дождитесь сообщения о завершении работы приложения и нажмите любую кнопку.

Синхронизация стилей между геосерверами#

Чтобы синхронизировать стили между геосерверами, запустите команду в bat файле:

dotnet Gems.Tools.Gis.CsvPublisher sync-styles -c "Server=10.4.1.67;Port=5432;Database=mrvl;User Id=ias;Password=yh?7JEE9GpZJ6aF;ApplicationName=Regenerator;" -n СХЕМА [-a] [-l [-g]]

В данной команде переменные являются:

  • -a или --all-schemas – признаком того, что выполнять нужно на все схемы;

  • -l или --only4layers – признаком того, что нужно выполнять синхронизацию только тех стилей, что связаны со слоями;

  • -g или --geoserver-of-layers-only – признаком того, что нужно восстановить стили только на том геосервере который используется слоями.

Запуск Мультитула через .bat файл#

Для запуска Мультитула с помощью .bat файла создайте .bat файл в той же директории, где расположена папка GisMultitool.

Пример содержимого .bat файла:

dotnet "%~dp0GisMultitool\gistool.dll" publish-layers -с "Server=10.1.1.1;Port=5432;Database=ias;User Id=postgres;Password=password;" -g geoserver80 -l layers.csv -n schema pause;