Конвертация Mapnik XML в SLD с использованием mapnik2geotools: различия между версиями
мНет описания правки |
м (→SLD) |
||
(не показано 16 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
{{Статья| | {{Статья|Опубликована|mapnik2geotools}} | ||
{{Аннотация|Рассмотрен процесс конвертирования файлов описания стилей из формата Mapnik XML в формат SLD | {{Аннотация|Рассмотрен процесс конвертирования файлов описания стилей из формата Mapnik XML в формат SLD, установка инструментов описана для операционной системы Debian.}} | ||
[https://github.com/dwins/mapnik2geotools mapnik2geotools] - это небольшой проект, написанный на Scala, для конвертации файлов описания стилей в формате [https://github.com/mapnik/mapnik/wiki/XMLConfigReference Mapnik XML] в формат [http://www.opengeospatial.org/standards/sld SLD]. | [https://github.com/dwins/mapnik2geotools mapnik2geotools] - это небольшой проект, написанный на [http://ru.wikipedia.org/wiki/Scala_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F) Scala], для конвертации файлов описания стилей в формате [https://github.com/mapnik/mapnik/wiki/XMLConfigReference Mapnik XML] в формат [http://www.opengeospatial.org/standards/sld SLD]. | ||
Данный проект распространяется в виде исходных кодов и требует предварительной компиляции. Для этого в системе должен быть установлен инструмент для генерации и сборки Scala проектов [https://github.com/harrah/xsbt/wiki SBT]. | Данный проект распространяется в виде исходных кодов и требует предварительной компиляции. Для этого в системе должен быть установлен инструмент для генерации и сборки Scala проектов [https://github.com/harrah/xsbt/wiki SBT]. | ||
== Краткое введение в SLD и Mapnik XML == | |||
=== SLD === | |||
SLD (Styled Layer Descriptor) - основанный на базе XML стандарт OGC, предназначенный для описания символики пространственных данных. Любой SLD-файл представляет собой документ, имеющий следующую структуру: | |||
<pre> | |||
•Header | |||
•FeatureTypeStyle | |||
•Rule | |||
•Symbolizer | |||
</pre> | |||
''Header'' - заголовок, содержащий метаинформацию и пространства имён XML, эта часть в большинстве случаев одинакова для всех SLD-документов. | |||
''FeatureTypeStyle'' - секция, содержащая набор правил (Rules). Группировка правил в FeatureTypeStyle выполняется с тем расчётом, что рендеринг данных осуществляется в порядке их следования, проще говоря слой сначала рендерится в соответствии с первым FeatureTypeStyle, затем в соответствии со вторым и так далее. На выходе полученные результаты накладываются друг на друга. | |||
''Rule'' - правило применения стиля. Оно может быть задано как глобально, так и иметь логику некоторого фильтра. Например, используя правила, можно настроить символику в соответствии с атрибутивными полями слоя или текущим масштабным уровнем. | |||
''Symbolizer'' - секция в которой непосредственно задаётся сама символика. Symbolizer может принимать одно из пяти значений, назначение которых можно понять из их названия: | |||
* PointSymbolizer | |||
* LineSymbolizer | |||
* PolygonSymbolizer | |||
* RasterSymbolizer | |||
* TextSymbolizer | |||
В одном документе SLD может быть несколько секций FeatureTypeStyles, несколько секций Rules на каждую секцию FeatureTypeStyles и несколько Symbolizer на каждую секцию Rule. | |||
Пример SLD-документа: | |||
<syntaxhighlight lang="xml"> | |||
<StyledLayerDescriptor version="1.0.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ogc="http://www.opengis.net/ogc" xmlns="http://www.opengis.net/sld"> | |||
<NamedLayer> | |||
<Name>test</Name> | |||
<UserStyle> | |||
<Name>test</Name> | |||
<FeatureTypeStyle> | |||
<Rule> | |||
<LineSymbolizer> | |||
<Stroke> | |||
<CssParameter name="stroke-width">4</CssParameter> | |||
<CssParameter name="stroke">#dddddd</CssParameter> | |||
</Stroke> | |||
</LineSymbolizer> | |||
</Rule> | |||
</FeatureTypeStyle> | |||
<FeatureTypeStyle> | |||
<Rule> | |||
<PolygonSymbolizer> | |||
<Fill> | |||
<CssParameter name="fill">#fa5000</CssParameter> | |||
</Fill> | |||
</PolygonSymbolizer> | |||
</Rule> | |||
</FeatureTypeStyle> | |||
</UserStyle> | |||
</NamedLayer> | |||
</StyledLayerDescriptor> | |||
</syntaxhighlight> | |||
Применительно к реальным данным это означает, что слой будет вначале отрисован в виде линий цвета ''#dddddd'' и толщиной 4 пиксела, поверх которого будет наложен тот же самый слой без обводки, но с заливкой цвета ''#fa5000'': | |||
[[Файл:Sld.png|720px|thumb|center|<center>Применения SLD-стиля</center>]] | |||
=== Mapnik XML === | |||
Mapnik XML - это формат более широкого спектра действия нежели SLD, что объясняется его назначением. Mapnik XML - это основной инструмент конфигурирования Mapnik (как map-файл для [http://mapserver.org/ MapServer]). Синтаксис подсистемы описания символики в [https://github.com/mapnik/mapnik/wiki/XMLConfigReference Mapnik XML] несколько похож на SLD, но в то же время имеет и свои отличия. Не вдаваясь в детали устройства Mapnik XML, приведём пример того, как он может выглядеть: | |||
<syntaxhighlight lang="xml"> | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<!DOCTYPE Map[]> | |||
<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="#dddddd"> | |||
<Parameters> | |||
<Parameter name="bounds">-180,-85.05112877980659,180,85.05112877980659</Parameter> | |||
<Parameter name="center">0,0,2</Parameter> | |||
<Parameter name="format">png</Parameter> | |||
<Parameter name="minzoom">0</Parameter> | |||
<Parameter name="maxzoom">22</Parameter> | |||
<Parameter name="name"><![CDATA[Test]]></Parameter> | |||
<Parameter name="description"><![CDATA[For testing]]></Parameter> | |||
</Parameters> | |||
<Style name="test" filter-mode="first"> | |||
<Rule> | |||
<PolygonSymbolizer fill="#aaffaa" /> | |||
</Rule> | |||
</Style> | |||
<Style name="test-outline" filter-mode="first"> | |||
<Rule> | |||
<LineSymbolizer stroke="#ffffff" stroke-width="4" /> | |||
</Rule> | |||
</Style> | |||
<Layer name="test" | |||
srs="+proj=longlat +ellps=WGS84 +no_defs"> | |||
<StyleName>test-outline</StyleName> | |||
<StyleName>test</StyleName> | |||
<Datasource> | |||
<Parameter name="file"><![CDATA[C:\Users\rda\Documents\MapBox\project\layers\test\test.shp]]></Parameter> | |||
<Parameter name="type"><![CDATA[shape]]></Parameter> | |||
</Datasource> | |||
</Layer> | |||
</Map> | |||
</syntaxhighlight> | |||
Секции <Style>, <Rule>, <*Symbolizer> соответствуют по своему назначению секциям <FeatureTypeStyle>, <Rule>, <*Symbolizer> SLD. | |||
== Установка SBT == | == Установка SBT == | ||
Установка SBT с помощью различных систем управления пакетами описана в [https://github.com/harrah/xsbt/wiki/Getting-Started-Setup документации]. Рассмотрим | Установка SBT с помощью различных систем управления пакетами описана в [https://github.com/harrah/xsbt/wiki/Getting-Started-Setup документации]. Рассмотрим | ||
это | это процесс на примере системы Apt, используемой в Debian: | ||
<syntaxhighlight lang="Bash"> | <syntaxhighlight lang="Bash"> | ||
Строка 58: | Строка 168: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== | == Запуск утилиты с графическим интерфейсом == | ||
mapnik2geotools может быть запущен как в режиме с графическим интерфейсом, так и в режиме командной строки. Для запуска утилиты с графическим интерфейсом вам потребуется наличие [http://ru.wikipedia.org/wiki/X_Window_System X-сервера]. Если на машине "иксы" не установлены, то графический интерфейс можно вывести на другую машину. Автор статьи подключался из Windows к машине с установленным Debian с помощью Putty, используя X-сервер Xming (настройка связки Putty+Xming описана [http://debback.blogspot.com/2008/03/linux-windows-xming-ssh.html здесь]). | |||
из Windows к машине с установленным Debian с помощью Putty | |||
[http://debback.blogspot.com/2008/03/linux-windows-xming-ssh.html здесь]). | |||
Для запуска конвертора переходим в каталог mapnik2geotools и запускаем его: | Для запуска конвертора переходим в каталог mapnik2geotools и запускаем его: | ||
Строка 82: | Строка 184: | ||
[[Файл:Mapnik2geotools.png|541px|thumb|center|<center>Окно настроек mapnik2geotools</center>]] | [[Файл:Mapnik2geotools.png|541px|thumb|center|<center>Окно настроек mapnik2geotools</center>]] | ||
Стоит отметить, что на выходе получаем такое количество SLD-файлов, сколько раз секция <Style> встречается в файле Mapnik XML. | Стоит отметить, что на выходе получаем такое количество SLD-файлов, сколько раз секция <Style> встречается в файле Mapnik XML. Так, например, при попытке конвертирования Mapnik XML файла, приведённого в начале статьи в SLD получилось два *.sld файла: | ||
<syntaxhighlight lang="xml"> | |||
<StyledLayerDescriptor version="1.0.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ogc="http://www.opengis.net/ogc" xmlns="http://www.opengis.net/sld"> | |||
<NamedLayer> | |||
<Name>test</Name> | |||
<UserStyle> | |||
<Name>test</Name> | |||
<FeatureTypeStyle> | |||
<Rule> | |||
<PolygonSymbolizer> | |||
<Fill> | |||
<CssParameter name="fill">#aaffaa</CssParameter> | |||
</Fill> | |||
</PolygonSymbolizer> | |||
</Rule> | |||
</FeatureTypeStyle> | |||
</UserStyle> | |||
</NamedLayer> | |||
</StyledLayerDescriptor> | |||
</syntaxhighlight> | |||
<syntaxhighlight lang="xml"> | |||
<StyledLayerDescriptor version="1.0.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ogc="http://www.opengis.net/ogc" xmlns="http://www.opengis.net/sld"> | |||
<NamedLayer> | |||
<Name>test-outline</Name> | |||
<UserStyle> | |||
<Name>test-outline</Name> | |||
<FeatureTypeStyle> | |||
<Rule> | |||
<LineSymbolizer> | |||
<Stroke> | |||
<CssParameter name="stroke-width">4</CssParameter> | |||
<CssParameter name="stroke">#ffffff</CssParameter> | |||
</Stroke> | |||
</LineSymbolizer> | |||
</Rule> | |||
</FeatureTypeStyle> | |||
</UserStyle> | |||
</NamedLayer> | |||
</StyledLayerDescriptor> | |||
</syntaxhighlight> | |||
== Запуск утилиты без графического интерфейса == | |||
Как уже было сказано выше mapnik2geotools можно запустить и без графического интерфейса, что позволяет использовать его в пакетном режиме. Для этого необходимо следовать инструкциям, представленным на [https://github.com/dwins/mapnik2geotools/wiki/Hacking данной] странице, а именно: | |||
<syntaxhighlight lang="Bash"> | |||
cd ~/mapnik2geotools | |||
sbt "run-main me.winslow.d.mn2gt.Driver /home/rykovd/mapnik/test.xml --output /home/rykovd/mapnik/output/" | |||
</syntaxhighlight> | |||
где <code>/home/rykovd/mapnik/test.xml</code> - путь до файла Mapnik XML, <code>/home/rykovd/mapnik/output/</code> - каталог, в который будет помещён результат конвертирования. |
Текущая версия от 16:01, 2 октября 2012
по адресу http://gis-lab.info/qa/mapnik2geotools.html
Рассмотрен процесс конвертирования файлов описания стилей из формата Mapnik XML в формат SLD, установка инструментов описана для операционной системы Debian.
mapnik2geotools - это небольшой проект, написанный на Scala, для конвертации файлов описания стилей в формате Mapnik XML в формат SLD.
Данный проект распространяется в виде исходных кодов и требует предварительной компиляции. Для этого в системе должен быть установлен инструмент для генерации и сборки Scala проектов SBT.
Краткое введение в SLD и Mapnik XML
SLD
SLD (Styled Layer Descriptor) - основанный на базе XML стандарт OGC, предназначенный для описания символики пространственных данных. Любой SLD-файл представляет собой документ, имеющий следующую структуру:
•Header •FeatureTypeStyle •Rule •Symbolizer
Header - заголовок, содержащий метаинформацию и пространства имён XML, эта часть в большинстве случаев одинакова для всех SLD-документов.
FeatureTypeStyle - секция, содержащая набор правил (Rules). Группировка правил в FeatureTypeStyle выполняется с тем расчётом, что рендеринг данных осуществляется в порядке их следования, проще говоря слой сначала рендерится в соответствии с первым FeatureTypeStyle, затем в соответствии со вторым и так далее. На выходе полученные результаты накладываются друг на друга.
Rule - правило применения стиля. Оно может быть задано как глобально, так и иметь логику некоторого фильтра. Например, используя правила, можно настроить символику в соответствии с атрибутивными полями слоя или текущим масштабным уровнем.
Symbolizer - секция в которой непосредственно задаётся сама символика. Symbolizer может принимать одно из пяти значений, назначение которых можно понять из их названия:
- PointSymbolizer
- LineSymbolizer
- PolygonSymbolizer
- RasterSymbolizer
- TextSymbolizer
В одном документе SLD может быть несколько секций FeatureTypeStyles, несколько секций Rules на каждую секцию FeatureTypeStyles и несколько Symbolizer на каждую секцию Rule.
Пример SLD-документа:
<StyledLayerDescriptor version="1.0.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ogc="http://www.opengis.net/ogc" xmlns="http://www.opengis.net/sld">
<NamedLayer>
<Name>test</Name>
<UserStyle>
<Name>test</Name>
<FeatureTypeStyle>
<Rule>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke-width">4</CssParameter>
<CssParameter name="stroke">#dddddd</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
</FeatureTypeStyle>
<FeatureTypeStyle>
<Rule>
<PolygonSymbolizer>
<Fill>
<CssParameter name="fill">#fa5000</CssParameter>
</Fill>
</PolygonSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
Применительно к реальным данным это означает, что слой будет вначале отрисован в виде линий цвета #dddddd и толщиной 4 пиксела, поверх которого будет наложен тот же самый слой без обводки, но с заливкой цвета #fa5000:
Mapnik XML
Mapnik XML - это формат более широкого спектра действия нежели SLD, что объясняется его назначением. Mapnik XML - это основной инструмент конфигурирования Mapnik (как map-файл для MapServer). Синтаксис подсистемы описания символики в Mapnik XML несколько похож на SLD, но в то же время имеет и свои отличия. Не вдаваясь в детали устройства Mapnik XML, приведём пример того, как он может выглядеть:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Map[]>
<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over" background-color="#dddddd">
<Parameters>
<Parameter name="bounds">-180,-85.05112877980659,180,85.05112877980659</Parameter>
<Parameter name="center">0,0,2</Parameter>
<Parameter name="format">png</Parameter>
<Parameter name="minzoom">0</Parameter>
<Parameter name="maxzoom">22</Parameter>
<Parameter name="name"><![CDATA[Test]]></Parameter>
<Parameter name="description"><![CDATA[For testing]]></Parameter>
</Parameters>
<Style name="test" filter-mode="first">
<Rule>
<PolygonSymbolizer fill="#aaffaa" />
</Rule>
</Style>
<Style name="test-outline" filter-mode="first">
<Rule>
<LineSymbolizer stroke="#ffffff" stroke-width="4" />
</Rule>
</Style>
<Layer name="test"
srs="+proj=longlat +ellps=WGS84 +no_defs">
<StyleName>test-outline</StyleName>
<StyleName>test</StyleName>
<Datasource>
<Parameter name="file"><![CDATA[C:\Users\rda\Documents\MapBox\project\layers\test\test.shp]]></Parameter>
<Parameter name="type"><![CDATA[shape]]></Parameter>
</Datasource>
</Layer>
</Map>
Секции <Style>, <Rule>, <*Symbolizer> соответствуют по своему назначению секциям <FeatureTypeStyle>, <Rule>, <*Symbolizer> SLD.
Установка SBT
Установка SBT с помощью различных систем управления пакетами описана в документации. Рассмотрим это процесс на примере системы Apt, используемой в Debian:
cd ~
mkdir sbt
cd sbt
wget http://apt.typesafe.com/repo-deb-build-0002.deb
sudo dpkg -i repo-deb-build-0002.deb
sudo apt-get update
sudo apt-get install sbt
rm -r ~/sbt
Установка mapnik2geotools
cd ~
git clone git://github.com/dwins/mapnik2geotools.git
cd ~/mapnik2geotools
sbt update
После запуска последней команды может появиться следующее сообщение, свидетельствующее о том, что не найден launcher версии 0.11.2, поскольку в Debian по умолчанию устанавливается версия 0.11.3:
$ sbt update
Detected sbt version 0.11.2
Cannot find sbt launcher 0.11.2
Please download:
From http://typesafe.artifactoryonline.com/typesafe/ivy-releases/org.scala-tools.sbt/sbt-launch/0.11.2/sbt-launch.jar
To /home/rykovd/.sbt/.lib/0.11.2/sbt-launch.jar
Создадим указанный каталог и поместим в него нужный файл:
mkdir -p ~/.sbt/.lib/0.11.2
cd ~/.sbt/.lib/0.11.2
wget http://typesafe.artifactoryonline.com/typesafe/ivy-releases/org.scala-tools.sbt/sbt-launch/0.11.2/sbt-launch.jar
Выполняем компиляцию:
cd ~/mapnik2geotools
sbt update
sbt compile
Запуск утилиты с графическим интерфейсом
mapnik2geotools может быть запущен как в режиме с графическим интерфейсом, так и в режиме командной строки. Для запуска утилиты с графическим интерфейсом вам потребуется наличие X-сервера. Если на машине "иксы" не установлены, то графический интерфейс можно вывести на другую машину. Автор статьи подключался из Windows к машине с установленным Debian с помощью Putty, используя X-сервер Xming (настройка связки Putty+Xming описана здесь).
Для запуска конвертора переходим в каталог mapnik2geotools и запускаем его:
cd ~/mapnik2geotools
sbt
run
В разделе Input выбираем Mapnik XML-файл с описанием стиля, в разделе Operation отмечаем Just save SLD files to local disk и, наконец, в разделе Local Output выбираем директорию в которую будет сохранён результат. Попутно для себя замечаем, что mapnik2geotools может автоматически копировать сконвертированные стили на GeoServer. Нажимаем кнопку Convert!
Стоит отметить, что на выходе получаем такое количество SLD-файлов, сколько раз секция <Style> встречается в файле Mapnik XML. Так, например, при попытке конвертирования Mapnik XML файла, приведённого в начале статьи в SLD получилось два *.sld файла:
<StyledLayerDescriptor version="1.0.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ogc="http://www.opengis.net/ogc" xmlns="http://www.opengis.net/sld">
<NamedLayer>
<Name>test</Name>
<UserStyle>
<Name>test</Name>
<FeatureTypeStyle>
<Rule>
<PolygonSymbolizer>
<Fill>
<CssParameter name="fill">#aaffaa</CssParameter>
</Fill>
</PolygonSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
<StyledLayerDescriptor version="1.0.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ogc="http://www.opengis.net/ogc" xmlns="http://www.opengis.net/sld">
<NamedLayer>
<Name>test-outline</Name>
<UserStyle>
<Name>test-outline</Name>
<FeatureTypeStyle>
<Rule>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke-width">4</CssParameter>
<CssParameter name="stroke">#ffffff</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
Запуск утилиты без графического интерфейса
Как уже было сказано выше mapnik2geotools можно запустить и без графического интерфейса, что позволяет использовать его в пакетном режиме. Для этого необходимо следовать инструкциям, представленным на данной странице, а именно:
cd ~/mapnik2geotools
sbt "run-main me.winslow.d.mn2gt.Driver /home/rykovd/mapnik/test.xml --output /home/rykovd/mapnik/output/"
где /home/rykovd/mapnik/test.xml
- путь до файла Mapnik XML, /home/rykovd/mapnik/output/
- каталог, в который будет помещён результат конвертирования.