GIS-LAB

Географические информационные системы и дистанционное зондирование

Конвертация Mapnik XML в SLD с использованием mapnik2geotools

Обсудить в форуме Комментариев — 5Редактировать в вики

Эта страница опубликована в основном списке статей сайта
по адресу 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:


Применения SLD-стиля

[править] 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!

Окно настроек mapnik2geotools

Стоит отметить, что на выходе получаем такое количество 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/ - каталог, в который будет помещён результат конвертирования.

Обсудить в форуме Комментариев — 5Редактировать в вики

Последнее обновление: 2014-05-15 01:45

Дата создания: 24.09.2012
Автор(ы): Денис Рыков


(Геокруг)

Если Вы обнаружили на сайте ошибку, выберите фрагмент текста и нажмите Ctrl+Enter