Хабрахабр

Опыт создания позиционных карт для Википедии

Всего мной было создано более 300 карт. В течение нескольких лет я работал над картами, которые используются в русском и других языковых разделах Википедии. Видимо, мне просто нравилось делать карты 🙂 Я не являюсь профессиональным картографом, и не имею специального образования в этой области.

В рамках этой статьи я хочу поделиться опытом создания карт для Википедии, с фокусом на позиционных картах.


Физическая карта Канады

Позиционные карты

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

Особенность тут в том, что это не просто изображение карты, но изображение в известной проекции, с известными географическими координатами для углов. Среди всех типов карт в Википедии особо выделяются так называемые «позиционные карты». Имея такой шаблон, мы можем применять его на любой странице, размещая поверх карты маркеры для интересующих нас объектов. Для такой карты, в каждом языковом разделе где она используется, создаётся специальный шаблон, описывающий эти метаданные. Так, например, на страницу о регионе можно вставить карту этого региона и отметить на ней районные центры и крупные города. Координаты объектов описываются в виде географических координат, формулы в шаблонах рассчитывают куда именно поставить маркер.

Красный маркер и надпись автоматически размещены на месте объекта поверх изображения карты.
Пример использования позиционной карты в карточке статьи об острове Пеббл.

Часто получается так, что сразу после создания позиционной карты она применяется в 20-50 существующих статьях Википедии. Позиционные карты используются во всех статьях об административных единицах: страны/районы/города/посёлки итд., а также во многих статьях о географических объектах.

Контурная карта как правило векторная (SVG), физическая карта может быть векторной, но чаще всего это растр (обычно PNG). В шаблоне позиционной карты, по идее, должны использоваться сразу два рисунка карты: «контурная»/«политическая» карта, и «физическая»/«географическая» карта с теми же самыми координатами, проекцией и размерами.


Пример шаблона позиционной карты с двумя типами карт

Кроме позиционной карты, для всех административных объектов создаётся т.н. Позиционных карт нужно много: они должны покрывать все уровни от мира в целом до отдельных районов, небольших островов и т.д. На «верхнем» уровне (мир, страна) с позиционными картами всё относительно хорошо, но на «нижнем» (уровня районов) часто всё довольно плохо: нет позиционных карт или есть, но недостаточного качества, или выполненные в неподходящем/нестандартном стиле. «локатор», это карта, на которой ярким цветом подсвечен интересующий нас район (пример карты-локатора).

И конечно, во всех таких случаях нужно перерисовать одну или несколько позиционных карт. Только для РФ мы имеем 83 субъекта, если добавить к этому районы, то получим уже наверное тысячу или больше административных единиц, на каждую из которых нужна позиционная карта, включая контурную карту, физическую карту, карту-локатор… К тому же, время от времени происходят изменения вида «вышло новое постановление»: появляется юридический документ, который меняет границы административных единиц, разделяет/объединяет их и т.п.

В общем, я думаю вы уже поняли — карты очень нужны и их нужно много 🙂

Исходные данные для карт

Это значит, что и исходные данные для таких карт должны быть свободными. Для позиционных карт должны использоваться изображения со свободной лицензией.

Исходные данные для карт, которыми я пользовался:

  • OpenStreetMap — основной источник векторных данных; но нужно учитывать, что данные получаются краудсорсингом, поэтому местами они плотные и качественные, местами очень неполные. Встречаются и ошибки в данных, поэтому полученные карты нужно аккуратно проверять.
  • GSHHG — векторные данные в составе GMT (см. ниже); можно использовать для карт крупных масштабов, плохо подходит для мелких масштабов.
  • ETOPO1 (разрешение ~1,85 км, объём ~890 МБ), ETOPO2 (разрешение 2' ~= 3,6 км) — карты высот, включая рельеф морского дна (батиметрию).
  • TOPO30 (разрешение ~= 0,9 км, объём ~1800 МБ) — карта высот, включая рельеф морского дна.
  • GLOBE (разрешение 30" ~= 0,9 км) — карта высот.
  • SRTM (разрешение SRTM3: 3" ~= 90m) — довольно подробная карта высот, но из-за этого и довольно «увесистая» (каждый файл с данными размером 1x1 градус весит ~2,8 МБ), поэтому обычно приходится скачивать только нужные файлы. Кроме того, исходные данные SRTM имеют разрывы, которые нужно закрывать, интерполируя отсутствующие точки по соседним. Это можно сделать самому, либо использовать «void-filled» исходники, такие как SRTM-Plus. SRTM это карта высот только для суши, не содержит данных о рельефе морского дна.

Проекции

К этому же семейству проекций относится проекция Меркатора и её частный случай — «проекция Гугла» или «Web Mercator projection», которую используют все основные веб-карты. В подавляющем большинстве случаев мы работаем с проекцией которая называется «равнопромежуточная цилиндрическая». Формулы для этой проекции довольно просты, к тому же шаблоны позиционных карт уже «знают» эту проекцию.

Mediawiki имеет развитый механизм вычисления выражений (в том числе с тригонометрическими функциями), его можно использовать для проверки своих карт, ещё до того как вы сделаете по ним шаблон позиционной карты (примеры можно посмотреть здесь). В немногих остальных случаях придётся погуглить нужную проекцию и почитать специальную литературу, чтобы понять, как именно получаются координаты x,y из широты и долготы.

Инструменты для создания карт

Но для того чтобы карта была открытой не обязательно использовать открытую и бесплатную систему, достаточно того чтобы исходные данные были открытыми, и того чтобы вы сами поставили на готовую карту открытую лицензию. Инструментов для создания карт (геоинформационные системы, ГИС) довольно много, в том числе бесплатных и с открытым исходным кодом. (Но тут наверняка есть много нюансов, не берусь залезать в область авторского права, не моё 🙂

Для создания карт я пользовался в основном тремя программами, описанными ниже.

Maperitive

Крайне полезен при работе с данными OpenStreetMap, работает с данными как с сайта OSM, так и с сохранёнными дампами. Maperitive — бесплатный, но закрытый продукт. Есть ряд готовых стилевиков и можно писать свои. Позволяет выбрать стилевик и сохранить карту в формате SVG. Я подготовил несколько файлов стилей, и использую их для экспорта в SVG границ районов, и карт самих районов с поселениями.

Generic Mapping Tools (GMT)

мы можем использовать GMT как консольную ГИС. Вообще, Generic Mapping Tools (GMT) это бесплатный набор утилит командной строки, предназначенный для обработки и визуализации научных данных, в том числе ряд его инструментов позволяют работать с геоданными, т.е. Обычно я пишу командный файл, в котором задаются все параметры и выполняется вызов утилит. Готовая карта (или отдельный слой для будущей карты) получается в результате последовательности вызова утилит. Кроме того, здесь обеспечивается повторяемость: чтобы создать карту снова, я всегда могу запустить скрипт ещё раз. С первого взгляда выглядит сложно, но мне как программисту такой подход кажется понятным и привычным.

также здесь): Пример командного файла (см.

set PATH=C:\programs\GMT5\bin;%PATH%
set GSBIN=C:\PROGRA~1\gs\gs9.04/bin set COORDSCUT=144.7492/157.3007/42.9694/51.3837
rem width = xmaxsvg / 150.0 * 2.54
set PAPERX=14.9352
rem height = ymaxsvg / 150.0 * 2.54
set PAPERY=16.0189333333333 grdcut.exe ETOPO1_Bed_g_gmt4.grd -R%COORDSCUT% -Gh_cor_cut.grd
grdgradient h_cor_cut.grd -Ne0.3 -A315 -M -Ghi.grd grdimage h_cor_cut.grd -Ihi.grd -Cwiki-water-verlauf2.cpt -P -R%COORDSCUT% -JX%PAPERX%cd/%PAPERY%cd --PAPER_MEDIA=Custom_%PAPERX%cx%PAPERY%c -X0 -Y0 -K > map.eps
pscoast.exe -JX%PAPERX%cd/%PAPERY%cd -R%COORDSCUT% -Gc -P -Df --PAPER_MEDIA=Custom_%PAPERX%cx%PAPERY%c -X0 -Y0 -O -K >> map.eps
grdimage h_cor_cut.grd -Ihi.grd -Cmount.cpt -P -R%COORDSCUT% -JX%PAPERX%cd/%PAPERY%cd --PAPER_MEDIA=Custom_%PAPERX%cx%PAPERY%c -X0 -Y0 -O -K >> map.eps
pscoast.exe -JX%PAPERX%cd/%PAPERY%cd -R%COORDSCUT% -Q -P -Df --PAPER_MEDIA=Custom_%PAPERX%cx%PAPERY%c -X0 -Y0 -O -K >> map.eps
pscoast.exe -JX%PAPERX%cd/%PAPERY%cd -R%COORDSCUT% -Na -Ia/0.25p,#0978AB -W0.25,#0978AB -P -Df --PAPER_MEDIA=Custom_%PAPERX%cx%PAPERY%c -X0 -Y0 -O >> map.eps %GSBIN%\gswin32c.exe -dSAFER -dBATCH -dNOPAUSE -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -dEPSCrop -r150 -sOutputFile=Oblast_etopo.png map.eps

Результат:

В составе GMT, вместе с инструментами командной строки также поставляются и данные, этот набор называется GSHHG, карты из этих данных создаются с помощью утилиты pscoast, входящей в GMT.

Inkscape

Inkscape — свободный и открытый векторный графический редактор, основным форматом которого является SVG.

Затем полученные слои импортируются в отдельные слои в документе Inkscape, и вся завершающая работа над картой проходит уже там. Maperitive и GMT я обычно использую как инструменты для подготовки отдельных слоёв будущей карты. Это уже ручная работа над объектами и слоями в Inkscape. Так, например, для позиционной карты нужно, чтобы район, показанный на карте, был «подсвечен» — цветом на контурной карте и затенением на физической карте.

Последним шагом по подготовке изображений карты будет сохранение SVG (для векторной карты) или экспорт PNG (для растровой).

Процесс создания карты

  1. Начинаю я обычно с того, что беру область будущей карты и смотрю на исходные данные, которые у меня есть для этой области. Создаю примитивную контурную карту через GMT на данных GSHHG, пробую рендерить рельеф той же области на данных ETOPO1, TOPO30, смотрю как эта область выглядит в OpenStreetMap. Бывает так, что я отказываюсь от создания карты на этом этапе, если вижу что имеющихся данных недостаточно или они плохого качества, содержат ошибки или крупные пробелы.
  2. Дальше, исходя из прикидочных рендеров, выбираю, на каких именно данных буду делать карту.
  3. Создаём отдельные слои карты. Как правило, отдельно получается слой границ (например, вектор из OSM), отдельно рисунок рельефа для суши и отдельно слой подводного рельефа (батиметрии), отдельно слой береговых линий и слой рек и водоёмов. Часто бывает так, что два растровых слоя имеют разное разрешение, и тут приходится играть с интерполяцией, чтобы вместе они смотрелись более-менее органично. Например, карта рельефа для суши берётся из ETOPO1, потому что этот участок там представлен лучше, а батиметрия взята из TOPO30, и разрешение этих двух источников различается в два раза. Тогда для меньшего разрешения делаем увеличение разрешения с интерполяцией, чтобы не возникало «квадратиков», не появлялся эффект муара и т.п.
  4. Используя Inkscape, собираем вместе отдельные слои карты. Выполняем необходимую ручную работу, если это нужно. Пробуем экспортировать карту в растр, внимательно рассматриваем и выявляем недочёты, исправляем и повторяем. Результатом являются файлы карты, готовые для загрузки на Викисклад.
  5. Загружаем файлы карты на Викисклад, выполняем там документирование. Про каждый файл должно быть написано что это за карта, какого объекта, с какими координатами и в какой проекции, какие использованы исходные данные с какими лицензиями, какими инструментами выполнена работа.
  6. Создаём или обновляем шаблон позиционной карты в ру-вики, проверяем его использование. Убеждаемся, что объекты встают в правильные места карты, т.е. что координаты углов карты заданы правильно, и сама карта этим координатам соответствует. После этого обновляем шаблоны для этой позиционной карты в других языковых разделах.

Заключение

На физическую карту Канады (см. На создание одной карты у меня уходило от 20-30 минут (в простых случаях, когда ряд однотипных карт районов делается как на конвейере), до 4-6 часов (в сложных случаях, когда возникали проблемы с исходными данными и нужно было делать много ручной работы). КДПВ) у меня ушло несколько дней: потребовалось подобрать проекцию, которая уже использовалась на контурной карте.

Если говорить о том «что я от этого получаю», то наверное — массу эстетического удовольствия, от того какие получаются карты.

Спасибо что дочитали, надеюсь, мой опыт вам как-нибудь пригодится 🙂

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть