Леса юго-запада Ленинградской области на нечеткой карте

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

Я десятый год говорю о ценности нечеткости как технологического решения. И даже добился в этом немалого успеха, например, популярности стикера «нечеткое тегирование» в телеграмм-канале OpenStreetMapRu. Слово «нечеткое» у картографов имеет столь отрицательную коннотацию, что каждый раз мне приходится начинать свое объяснение заново. Может быть более правильным было-бы использовать такой термин как «фаззи-карта» или «континуальный стиль», но я не мастер в словесном жонглировании. Поэтому нечеткую карту обычно представляют себе так:

На мои протесты обычно отзываются предложением, мол если мы не правы, то покажи нам такую карту. И это справедливо. Давайте же раскрасим карту OpenStreetMap в нечеткие цвета. Возьмем сотню точек с присущими им данными о растительности:

Каждая точка находится в лесу и описывает его породный состав таким образом: С(s)Е(e)Б(b)О(o), где С,Е,Б,О — это основные преобладающие породы (сосна, ель, береза, осина), а буквы в скобках — коэффициенты истинности, которые отражают правдивость суждения о том, что лес состоит из данной породы. Например чистый сосновый бор будет выглядеть так: С(1)Е(0)Б(0)О(0). А вот пример обычного березняка с примесью осины и елки: С(0)Е(0,1)Б(0,7)О(0,2). Опытные люди сразу уловят в этой нотации формулу состава древостоя и будут абсолютно правы, поскольку в данном случае я рассматриваю самый простой подход, при котором суммарная истинность константна. Кроме того, каждой точке присвоены данные по запасу. Это не обязательно, но позволит сделать наш пример еще показательнее.

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

Итак, шаг первый. Вспомним что такое интерполяция и создадим на основе точек растры распространения каждой породы. Вот так будет выглядеть результат интерполяции данных по еловым лесам. Чем прозрачнее, тем меньше леса в этом районе похожи на еловые:
Ельники

Нам потребуется пять таких растров. Четыре растра раскрасим по градиенту прозрачности цвета, принятого для обозначения породы на лесотаксационных картах (сосна — оранжевый, ель — фиолетовый, береза — синий, осина — зеленый). Пятый растр будет у нас интерполяцией по запасу. Его мы раскрасим по градиенту от белого с прозрачностью 60% до прозрачного белого. Это позволит нам отличать густые леса от редкостойных, даже если их состав одинаков.

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

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

А потом еще раз поправить стиль. И вот тут еще. И дороги плохо выглядят. И тут тоже следует исправить. Так, спустя семьдесят шесть вариантов стиля приходим к результату, который можно считать приемлимым (хотя все-равно говно):

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

Привет джипег!
легенда

Вот собственно и все. Осталось нарезать эту карту на тайлы и наслаждаться знанием о том, как сосняки сменяются ельниками, а березняки осинниками.

В полном размере карту можно посмотреть по этой ссылке.

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

Любая карта всегда двойственна в плане передачи информации. С одной стороны она передает читателю точную информацию (например, название населенных пунктов или ширина дороги), с другой стороны, иллюстрирует общую ситуацию на местности (много зеленого — лесной район, много дорог и населенных пунктов — заселенная территория). Каждый из этих информационных каналов требует отдельного подхода. Глупо демонстрировать нечетким образом грузоподъемность мостов, но не меньшая глупость — прорисовывать границы там, где они нахрен не нужны. В этом и заключается основной принцип нечеткой картографии.