Pull to refresh

Использование TileMill

Open source *


В прошлом посте я рассказывал о картографической дизайн студии TileMill. Он набрал несколько положительных отзывов, и я решил продолжить.

В этом посте будут рассмотрены:
  • Подготовка данных, перепроецирование в Web Mercator
  • Повышение скорости обработки shape файлов
  • Создание проекта и импорт данных в студию
  • Создание точечного слоя землетрясений
  • Стандартные селекторы и атрибутивная таблица

Интересно? Приглашаю под кат.

Подготовка данных, перепроецирование в Web Mercator


Как я говорил раньше, карты в TileMill всегда проецируются в Web Mercator. Эту проекцию используют Microsoft Bing Maps, Google Maps и ESRI ArcGIS Online. Для того, чтобы упростить дальнейшую работу, перепроецируем наши пространственные данные. Это повысит скорость отображения данных в Mapnik. Кроме того, это хорошая практика, для того чтобы проверить корректность исходных данных.

Для этого я воспользуюсь утилитой OGR, входящей в состав библиотеки GDAL.

ogr2ogr reprojected.shp source.shp -t_srs EPSG:900913

Где source.shp — исходный файл. Эта команда создаст новый файл reprojected.shp, перепроецированный в Web Mercator (его EPSG код 900913).

Важно. Если вы перепроецируете слой из WGS84, вы можете столкнутся с неправильным отображением полигонов на определённых параллелях. Обычно для этого достаточно воспользоватся функцией обрезки в OGR.

ogr2ogr fixed.shp source.shp -t_srs EPSG:900913 -clipsrc -180 -90 180 90

Примечание: версия OGR должна быть не ниже 1.7. Подробное решение этой проблемы можно найти здесь.

Повышение скорости обработки shape файлов


Когда слой shape файла содержит много объектов, скорость его обработки может надолго затянуться. Как вы помните, TileMill работает на основе библиотеки Mapnik. В состав этой библиотеки входит утилита для индексации shape файлов — shapeindex. Индексация может значительно повысить скорость обработки пространственных данных. Эта утилита создаёт файл индексов на основе ваших пространственных данных. Формат файла индексов Mapnik использует расширение .index. Файл индексов описывает элементы входящие в shape файл, позволяя обработчику быстро выяснить где находятся необходимые для визуализации данные, вместо того чтобы производить медленный поиск по всему файлу.

Использовать shapeindex очень просто:

shapeindex shapefile.shp

Эта утилита создаст новый файл индексов с именем shapefile.index, который необходимо хранить вместе с остальными данными коллекции shape файлов (*.shp, *.shx, *.dbf и т.д).

При тестировании заметно, что обработка слоя, содержащего около 100 000 точек и 12 уровней представления, занимает порядка 24 часов. В то время как обработка этого же слоя, содержащего файл индексов, занимает порядка часа.

Теперь, когда всё готово, давайте загрузим данные в студию. Всё что нам необходимо — упаковать нашу коллекцию shape файлов в zip архив и загрузить его в директорию files/data, внутри TileMill.


Создание проекта и импорт данных в студию


Итак, данные подготовлены, начнём создание первого проекта. Имя проекта может содержать только латинские буквы, цифры, тире и подчёркивание.



Новый проект earthquakes создан. Окно нового проекта.



Добавляем слой. ID — это уникальный идентификатор слоя в проекте. Datasource — zip архив с коллекцией shape файлов.



Быстро проверить корректность слоя с точками можно используя свойство marker-height (или marker-width).



Атрибутивную таблицу слоя можно посмотреть нажав пиктограмму с изображением лупы, в разделе с активными слоями.



Поля из атрибутивной таблицы можно использовать в качестве селекторов. Как вы видите, в атрибутивной таблице слоя есть магнитуда землетрясений (поле MLH). Давайте укажем разный цвет и размер для точек с разным магнитудами. Я приведу только часть кода, чтобы был понятен общий принцип.

  [MLH>=0][MLH<1] { 
    marker-fill: #ffff00;
    marker-width: 1;
  }
  [MLH>=1][MLH<2] { 
    marker-fill: #ffdd00;
    marker-width: 2;
  }  
  [MLH>=2][MLH<3] { 
    marker-fill: #ffbb00;
    marker-width: 3;
  }


Кроме того, есть набор стандартных селекторов, которые используются в TileMill.
* { } — для всех слоёв
.red { } — все слои с классом 'red'
.blue[zoom>8] { } — слои с классом 'blue', с уровнем представления выше 8
#countries[NAME='USA'] { } — все элементы слоя с идентификатором 'countries', у которых атрибут 'NAME' равен значению 'USA'


Кроме того, давайте сделаем маркеры и их границы немного прозрачными:

  marker-opacity: .8;
  marker-line-opacity: .8;


Вот что мы получим в итоге



Вот и всё. Наш первый проект готов.

В следующем посте я расскажу о том как добавить в проект интерактивность, как создать легенду и как это всё использовать в деле. Спасибо за внимание.

UPDATE: продолжение.
Tags:
Hubs:
Total votes 29: ↑27 and ↓2 +25
Views 3.6K
Comments Comments 1