ХБК

Как я создавал картостиль «L»

«Художника каждый может обидеть.
Убежать не каждому удается.»
Народная мудрость

 

Вот все жалуются на теплую зиму, а зря. Замерзло бы Грушевское водохранилище у моего дома, как бы я тогда в нем купался в декабре? А если-бы не купался, а потом не тусил по поселку, разве обалдевал бы я сейчас от дикой боли в горле? Правильно, не обалдевал и над картой города Шахты, за которую периодически берусь, не сидел бы.

Но сегодня, я хочу рассказать вам не столько о карте, сколько о картостиле вообще. Исходные данные мои понятны: OpenStreetMap в шейпах от Geofabrik, плюс собственные картографические наработки. Данных, по нынешним временам — кот наплакл, грех не засеть часов на сорок-пятьдесят и не скомстролить из них контагий красоты. Собственно, я только что это сделал, а потому рад представить вам картостиль под названием «L». Не скажу, что название не имеет отношение к противостоянию Л и Киры, но по большому счету я и сам не знаю, откуда оно взялось. Да и не хочу знать. Лучше вместо всех этих пустяков я расскажу вам о некоторых своих мыслях, которые годами вызревали, пока неожиданно не полезли из меня во все стороны как из старого матраса.

Чего стоят сейчас данные неглобального покрытия? Правильно: ничего или почти ничего. Неважно сколько у тебя данных, важно как ты с ними работаешь. Эту мысль я периодически пытался доносить до аудиторий в виде неструктурированного потока высказываний. Чем полнее базы геоданных, тем меньше значение каждого нового байта, тем выше требования к обработке и отображению пространственной информации. Думаю об этом же говорил и Стив Кост, заявляя: «Сработало-то замечательно, люди отличные, OSM пыхтит и катится… но дни крутых поворотов и рисков позади. Это сводит с ума: открытую карту можно развить сотней способов, а не просто смотреть, как она немного прирастает каждый год, и собирать очередную конференцию.» В нас пропал дух энтузиазма», как говорил еще Ипполит Георгиевич. Наполнение базы геоданных первоочередная задача партии и правительства, а кильками в наш век отравиться гораздо проще, чем не смочь на основе данных изготовить карту.  Скорее всего, этот флер времени рано или поздно развеется, но хотелось бы застать времена когда вопросы картографического дизайна будут если уж не решаться, то хотя-бы подниматься на обсуждение.

Впрочем, довольно лирики. Я же про «L» рассказ веду. Сразу скажу, стиль не включает в себя POI. Это не значит, что он не предназначен для их отображения (скорее наоборот). Дело в том, что при таком ничтожном количестве ангажированных точек интереса, должным образом визуализировать и проверить их читаемость просто невозможно.  Будут POI-будет развитие картостиля «L». Покамест можно оговорить, что предлагаемый картостиль избавлен от точек интереса специально (что на самом деле является одной из главных причин).

Создание картографического стиля — это мучительная процедура выбора из бесконечного числа вариантов того оформления, при котором читатель увидит сердцевидный объект, даже если на его месте картограф нарисовал обычную жопу. Алгоритмизация в картографическом дизайне вещь достаточно спорная: никто не мешает на основе существующих концепций ТРИЗ выработать логические подходы к оформлению карты, однако, большей частью этот процесс остается творческим, осуществляемым на основе интуиции и опыта.

Но при этом, всегда можно определить некоторые субъективные алгоритмы, которые позволят сократить количество возможных комбинаций оформления. В конце-концов, даже шахматисты первые ходы не играют, а разыгрывают известную комбинацию. Никогда раньше не задумывался над классификацией таких алгоритмов, но с ходу могу назвать жадный, табличный, циклический, ступенчатый и базовый алгоритмы.

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

Применяя табличный алгоритм вы прежде чем приступить непосредственно к работе с данными создаете таблицы условных обозначений. Это настолько старый, проверенный и рекомендуемый метод, что я более чем уверен: хрен кто им пользуется в реальной практике. Потому что для того, что-бы построить гармоничную таблицу условных обозначений требуется космические запасы времени, а я сейчас и без всяких таблиц все по-быстрому нарисую…

Суть циклического алгоритма ясна из названия: настраиваете первый слой, отключаете его и добавляете следующий. Начинаете настройку второго слоя на белом фоне, завершаете на фоне включенного первого слоя. Далее отключаете второй слой и по тому-же алгоритму настраиваете третий. Если принять за x редактируемый в текущий момент слой, включенный слой принять за единицу, отключенный за ноль, а место в последовательности за номер слоя, то алгоритм можно записать так: x-0x-1x-00x-10x-11x… Кажется сложным, но не переживайте, если слоев много, вы легко сойдете с ума.

Используя ступенчатый алгоритм вы добавляете слой максимального заполнения, настраиваете его цветовую гамму по вашему вкусу. После добавляете слой с меньшим наполнением, настраиваете его так, что-бы оба слоя хорошо читались. Добавив третий слой, отключаете первые два и настраиваете его по своему усмотрению. Позже изменяете яркость, контраст или прозрачность первых двух слоев на минимальную величину, достаточную для нормального отображения третьего слоя. Потом добавляете четвертый и далее пока не закончатся слои, либо пока не упретесь в предел такого метода. С физической точки зрения метод не выдерживает никакой критики, но иногда бывают случаи, которые просто не разрешить стройными алгоритмами. «Здесь нужна живая кровь, катарсис, преступление». Ибо на каждую хитрую бритву Оккама всегда можно найти теорему Геделя с винтом.

Повторюсь, я не претендую на ценность этих конкретных алгоритмов. У каждого повара своя галинабланка. Но я хочу сказать, что к вопросу создания картостиля можно подходить более формализованно чем: «-Давай дороги пошире сделаем. -Вроде лучше стало, давай еще домики перекрасим. -Блин здорово, но надписи не видны, нужно размер текста увеличить — А как? — А ты дороги поуже сделай!»

При разработке картостиля «L», я исходил из базового алгоритма, при котором первой рисуется максимально бледная подложка, на которую накладываются слои с обратно пропорциональной количеству объектов насыщенностью и яркостью слоя. Чем больше объектов в слое, тем бледнее и невзрачнее слой. В моем случае, в качестве подложки выступал слой с индивидуальными жилыми строениями:

Подложка-privacy

 

В OSM этому слою в теории должно соответствовать значение landuse=residential. Но в связи с трудоемкостью обрисовки участков, тег с таким значением обычно покрывает почти весь город целиком и практически не несет никакого смысла. В моем случае, этот слой (privacy) отрисован руками на весь город, что позволяет сделать вывод о наличии и характере проездов даже на территориях, лишенных дорожного графа OpenStreetMap.

Вообще, вопрос картирования частных земельных участков не так уж прост. Я писал уже об этом (смотри пост «Скилл прогрессивности«). Американо-европейская традиция картирования домиков перекочевала к нам в первозданном виде. При этом никто не задумывается над тем, что на западе не столь развита нездоровая традиция огораживать себя сплошными заборами, устраивая внутри каждого, социализм на отдельно взятом участке. Если в Пало-Альто для навигации мне требуются в качестве ориентиров дома, до в шахтинском поселке мне требуются границы частных участков. Если там каждый дом имеет свой номер, а улицы простреливаются во всех направлениях, то здесь номер имеет непосредственно участок, на котором может располагаться до пяти крупных строений (дом, сарай, баня, летняя кухня, гараж). Территория просматривается в лучшем случае вдоль улицы, а невозможность приблизиться к большинству строений никак не отмечена.

Приведу пример из упомянутого поста. Фрагмент карты поселка ХХ лет РККА, созданной в гугле по американскому образцу. Ощущение, что это уютный закрытый коттеджный поселок на берегу реки

665

 

На самом деле, ситуация обстоит вот-так:

666

 

Конечно-же, если бы я составлял карту для прокладки маршрутов танковой дивизии, без домиков было бы не обойтись. Но в моем случае, я оставил только те из них, которые не расположены в границах частных жилых территорий.

Оформление границы населенных пунктов не представляет большого интереса. Главное, что-бы она была всюду видна, однозначна, но не заслоняла собой объкты и надписи. Исходя из этого она сделана тонкой, непрозрачной и идущей поверх почти всех объектов (кроме надписей населенных пунктов.

граница

 

Примерно то-же можно сказать о железных дорогах. Железку должны узнавать и легко выделять все. Для города Шахты это особенно важно, поскольку здесь до недавнего времени существовала кольцевая железная дорога:

railway

 

Сейчас часть этой дороги разобрали на рельсы, поэтому в этом слое карта безусловно содержит грубую ошибку. Но актуальных данных, к большому сожалению у меня нет, да и ров/насыпь от железнодорожного полотна до сих пор прекрасно сохранилась.

В отличие от железных, отображение автомобильных дорог является одним из самых важных и сложных этапов. Особенно, если ваш граф взят из OpenStreetMap. Как образуются значения тегов дорог в OSM? Очень просто, вы берете название ближайшей улицы, транслитерируете его на английский, умножаете количество букв на случайное число, а потом случайной комбинацией получаете значение тега highway. Если как следует поискать, в OSM можно найти дорогу, подходящую для каждого. Даже если вы одноухий цирковой мишка на восьмиколесном стеклянном велосипеде, будьте уверены, где-то на Земле для вас есть соответствующим образом тегированная дорога.

Шутки-шутками, но разнообразие дорог для целей картографии (роутинг сейчас не обсуждаем) действительно очень велико. Классифицировать их можно по разному, в зависимости от задачи. Но в нашем случае, единственная достойная классификация по покрытию и ширине невозможна. Поэтому приходится вносить порядок на основе типа дороги. Иначе этим горгоньим террариумом не овладеть.

road1

 

Дороги в провинции это исключительно водительская информация. Здесь, в далекой глубинке велодорожек нет, пешеходы ходят там где грязи меньше, а утренний highway=living_street легко превращается в ночной highway=raceway. Соответственно, всю классификацию достаточно просто разбить на пешеходные линии, в которых придется покинуть машину (footway, path, pedestrian, steps), степные, полевые и лесные дороги на которые не рекомендуется выезжать в распутье на заниженных вазах (track), обычные центральные дороги, основным отличием которых является наличие асфальта на всем протяжении (trunk, secondary), главные центральные дороги, отличающиеся дополнительными ограничениями, вероятностью пробок и ямочного ремонта (primary). Все остальные дороги рассматриваются как проезды во всех смыслах этого слова. Проезды могут быть заасфальтированы в зоне высотной застройки, но чаще имеют грунтовое покрытие, либо покрытие из брусчатки, выложенной еще пленными немцами после войны.

После классификации дорожная сеть выглядит так:

road2

 

Деление на типы достаточно произвольно, но с другой стороны в условиях недостатка данных позволяет максимально отобразить дорожные свойства, необходимые читателю. Обратите внимание на то, что основное количество дорог исполнено тонкой линией. Строго говоря при обдумывании карты я планировал, что линиями будут обозначены только дороги с твердым покрытием, а все остальные легко читаются на карте благодаря детальной прорисовке слоя privacy (индивидуальные жилые участки). Возможно, в будущем я так и сделаю, но сейчас разделить дороги даже по покрытию невозможно.

Самый потрясающий объект в современных геоинформационных системах — это, вне всякого сомнения, гидрография. Все можно пережить, все можно обосновать, принять на веру, проникнуться, войти в положение, выдать за фичу. Но гидрография — это адская картографическая дьвольщина! Это, черт возьми, философское отражение всей нашей жизни: каждый видит, что происходит какая-то шняга, но все могут привести сотню доводов в качестве оправдания. Занимаюсь картами в общей сложности шестнадцать лет и до сих пор не понимаю: почему гидрографию мне приходится показывать тремя типами слоев?! Нет, я знаю как это оправдать, но понимать — все равно не понимаю. Водоемы — полигонами, водотоки — линиями, источники — точками — это невероятный бескомпромиссный феерический бред. Да-да, водотоки можно буферизировать в полигоны, а источники перевести в POI, но открываешь новый проект, а там, етитская богомышь! — опять тот же маразм.

А ведь еще нужно исхитриться так, что-бы водотоки лежали под водоемами, а водоемы (которые при экспорте OSM-Geofabrik запихнуты в слой natural) не перекрывали водотоки. Сделать это минимальными усилиями можно только используя единое цветовое оформление:

вода

 

Слой nature, несмотря на его популярность оказался едва ли не самым простым для отображения. Все многообразие значений этого тега легко сводится к значению water, о котором я говорил выше и fores+park.

— Но позвольте! Как можно объединять в одну группу стоь разные значения? — наверняка спросите вы. А вот и можно. Ибо, за исключением ничтожной площади в центральном парке, различия между зоной лесовыращивания и рекреационным лесом полностью отсутствуют. Полностью. Нет, совсем полностью. Хозяйство не ведется ни там, ни там. Породный состав одинаков. Возраст, бонитет, состояние, характер посадки (все лесные культуры) — одинаково. Если эти леса и различаются чем-то между собой, то только тем, что документы на них хранятся в разных местах. А при тотальном бардаке и неразберихе, которая не прекращается уже четверть века, это и вовсе теряет всякое значение.

nature

 

Обратите внимание, объекты слоя natural исполнены светлой заливкой с темным кантом, в то время как базовая подложка исполнена с белым кантом и более темной заливкой. Но и тут и там подложка и кант имеют сходные цвета. Это старющщий метод, о чем я узнал еще когда на флоте служил. Почему этим простым правилом так часто пренебрегают я искренне не понимаю.

Про оформление слоя landuse можно говорить долго. Это, наряду с дорогами один из самых сложных слоев для визуализации. Я лучше покажу что получилось:

Сам слой:

landuse1

 

Поля, промышленные объекты, военные части  и тюрьмы (да, это «девятка»)

поля, военные части, промышленные зоны

 

Промышленные объекты, скверы, пустоши, гаражи, объекты торговли (розовые) и стройки (серые с пунктирной границей):

Гаражи, стройки, скверы, пустоши, коммерческие зоны, промышленные объекты

 

Я долго думал как показать кладбища. Так, что-бы с одной стороны они были близки к оформлению лесов и скверов, с другой стороны, что-бы они ясно передавали все архитектурное безумие наших кладбищ, с третьей стороны, что-бы от них не веяло депрессией, а с четвертой, что-бы изображать их было технически очень просто.

Кладбища:

kladb

 

Промышленные зоны, карьеры и садовые участки:

сады, промышленные зоны и карьеры

 

Кстати, о карьерах, едва не забыл. Пару месяцев назад, я неожиданно обнаружил, что в OpenStreetMap отсутствует общепринятый тег для обозначения терриконов. Все шахтинские терриконы на мапнике показаны как карьеры, хотя это уж точно вопиющее недоразумение. В этом году руки у меня не дошли, но в следующем, надо-бы внести соответствующее предложение.

А пока, можете наслаждаться моей работой. Террикон шахты Пролетарской диктатуры. Есть претензии к геометрии (у него в реальности несколько вершин), но внешний образ передан верно.

терриконы

 

А как же текст? Подписи дорог (видимы в диапазоне масштабов [1;40 000]) на карте исполнены черным цветом с белым буфером 1 мм, шрифтом: Ubuntu Condensed Regular, 8 точек, с размещением поверх кривых.

Подписи гидрографии на карте исполнены #1f78b4-цветом с белым буфером 1 мм, наклонным шрифтом: Ubuntu Condensed, 9 точек, с размещением над линиями вдоль кривых во всех масштабах. Вообще, гидрография, о которой я писал выше, выносит мозг не только своей разнослоевостью, но и траблами при попытке автоматического расставления подписей. Время от времени на один участок озера или водохранилища попадает дублирующая надпись «река такая-то». В результате смотришь на предпечатный макет, а там на месте летнего купания надпись: «Грушевское вдГхрру.шевка» или что-то подобное. Приходится лезть в геометрию и беспощадно ее резать.

Нумерация зданий выполнена шрифтом Ubuntu Condensed Regular, 9 точек, черный с белый буфером в 1 мм, на расстоянии от центроида видимой части в диапазоне масштабов [1;10 000].

Подписи населенных пунктов вокруг точки, видимы на всех масштабах. Черным цветом с белым буфером в 1 мм:
places_type__city: Impact Обычный, 20 точек,
places_type__hamlet: Impact Наклонный, 18 точек,
places_type__town: FreeSerif Курсив, 18 точек,
places_type__suburb: FreeSerif Обычный, 14 точек,
places_type__village: Ubuntu Condensed Regular, 14 точек,

 

Населенные пункты

 

Здесь, казалось бы, явное противоречие: подписи деревень исполнены более широким «импактом», да еще и крупнее по размеру чем названия небольших городов. В этом есть своя логика: любой, даже небольшой город всегда выделяется на карте, даже без подписи. Здесь играет роль и размеры, и сгущение дорог, и значительное количество зданий. По логике, подпись небольшого города должна быть больше подписи деревни, но нарушая эту логику я рассеиваю внимание читателя, позволяя ему с легкостью находить не только крупные населенные пункты, но и небольшие хутора.

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

Номера индивидуальных жилых территорий выполнены черным цветом без фона, наклонным шрифтом: Ubuntu Condensed, 8 точек, с размещением в центроиде объекта с видимостью в диапазоне масштабов [1;5 000].

надписи ижс

 

В совместном итоге получается вот такая картина:

Центр

 

Или вот такая:

Артем

 

Честно говоря, я и сам не понял, про что у меня пост получился. Вроде как про «L», а с другой стороны про рассуждения о небесных пирожках. Я так думаю. Создание картостилей вещь сложная и ответственная, а уж картографический дизайн и подавно. Я вот только что на себе испытал. Если вам понравилось, советую повторить опыт. Если нет, не беда, можно пиво пить, праздники же. Вот вам мои файлы стилей, берите кто хотите, выкладываю под Beerware-лицензией (Revision 42). А я спать пойду.

Знаете что самое сложное? Научиться не реагировать на идиотов

P.S. Если примите решение использовать эти наработки в коммерческом проекте, уточните лицензионную чистоту шрифтов Impact

P.P.S. Порядок слоев в проекте:
names
boundary
railways
mask_building
roads
waterways
natural
terricons
landuse
privacy

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

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

6 comments

  1. […] карта. О том, как она разрабатывалась вы можете почитать в отдельном посте, а здесь можете насладиться готовым […]

  2. Спасибо за ссылки. Действительно по тегированию терриконов у меня были заблуждения. По поводу гидрографии дополнить могу только следующее: иногда даже ошибочные решения попадают в стандарт, в данном случае мы продолжаем расплачиваться за косяки компании ESRI двадцатилетней давности. Этот бред привычен и знаком, но это бред.

  3. aaa:

    Оказывается, для терриконов есть ещё относительно недавное нововведение:
    http://wiki.openstreetmap.org/wiki/Tag:man_made%3Dspoil_heap

  4. aaa:

    Насчёт же гидрографии, малопонятные возмущения, которые без «а вот так надо бы по культуре» совершенно не воспринимаются.

  5. Исправить отображение домиков на фоне рынков (например, задав белый кант домикам)