Визуализация рельефа по данным SRTM и ASTER GDEM в QGis+SAGA

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

В качестве показательной территории взяты Соликамский и Красновишерский районы Пермского края. В качестве подложки карта OpenStreetMap Mapnik Standart:
Соликамск и Красновишерск

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

Рельеф на средне- и крупномасштабных картах в настоящее время в большинстве случаев отображается с помощью данных SRTM или ASTER GDEM, что связано с их глобальным охватом, открытостью и простотой получения. Разрешение этих данных (SRTM 90 м/пикс, ASTER GDEM 30 м/пикс) позволяет, при должной обработке, показывать особенности рельефа примерно до 15 зума. Несмотря на то, что данные ASTER точнее, их использование затруднено необходимостью дополнительной фильтрации для отсеивания значений, не отражающих реальный рельеф (например, высоты леса и жилой застройки). Оптимальных алгоритмов для такой процедуры, которые дают стабильный результат для значительной территории, не разработано, в результате чего, образец визуализации менее точных данных SRTM оказывается обычно более качественным как с геодезической, так и с художественной точек зрения. Однако, севернее 60° с.ш. и южнее 54° ю.ш. данные SRTM отсутствуют, что вынуждает в конечном итоге использовать оба набора данных при визуализации рельефа на территориях, выходящих за границы покрытия SRTM.

Наш случай именно такой (снизу данные SRTM, сверху ASTER GDEM):
ASTER и SRTM

Данные SRTM доступны из различных источников, из которых наиболее удобны сайты cgiar, gis-lab и viewfinderpanoramas. Я предпочитаю использовать последний, поскольку многие сцены там объединены и загружены сразу в geotiff-растры (обычно SRTM представлен в hdt-формате).

ASTER получить немного сложнее: сайты геологической службы США и NASA позволяют скачивать различные данные ДЗЗ, что требует от пользователя определенной подготовки. Кроме того, эти сайты иногда бывают недоступны, либо работают чрезвычайно медленно. В этих случаях можно скачать всю базу через торрент. Дополнительные источники получения данных SRTM и ASTER доступны на странице получения данных.

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

После того как исходные получены, можно запускать QGis:
ASTER и SRTM в QGis

Для начала объединим сцены ASTER в единый растр с помощью меню «растр-прочее-объединение»:
1объединение растров

В диалоговом окне укажем директорию со сценами и название итогового файла.
2объединение растров

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

Теперь сохраним полученный файл уменьшив его разрешение до разрешения SRTM. Если этого не сделать, в месте соприкосновения сцен из разных источников мы получим вот такую картину:
рельеф SRTM и ASTER

Выделяем в ТОСе наш ASTER, и через правую кнопку мыши вызываем диалоговое окно сохранения растра:
Сохранение растра в QGIS

Здесь обратите внимание на то, что-бы растр сохранялся как данные. Разрешение уменьшаем в три раза, т.е. вместо 18001 столбца вписываем 6000, а вместо 7201 строк вписываем 2400:
Сохранение растра в QGIS2

После сохранения растра он выглядит загрубленным, но все-равно более информативным, чем SRTM:
Сохранение растра в QGIS3

Большее сходство данным можно придать разнородной фильтрацией, однако этот вопрос мы здесь в должной глубине не затрагиваем. Дело в том, что отмывка обычно используется в виде почти прозрачного слоя-наложения и тщательное выравнивание разнородных данных для идентичности отмывки не всегда оправдано. Главная задача — сделать незаметной границу между данными, что зачастую, особенно на равнине, не представляет большой сложности. Разнородная фильтрация имеет смысл в основном для создания аналогичной насыщенности изолиний, о чем будет отдельно сказано ниже.

По той-же схеме объединим полученный растр с растром SRTM:
DEM-композит

Получившийся растр охватывает излишне большую территорию, что будет отнимать у нас лишнее время на его обработку. Что-бы избежать этого, отрежем все, что не входит в область наших интересов, указав при сохранении растра видимый охват (не забывайте сохранять растр как данные!):

image

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

Откроем панель инструментов в меню «анализ данных» и в списке геоалгоритмов SAGA-Grid-Filter выберем алгоритм «Простой фильтр»:

После нескольких минут обработки, алгоритм выдаст сглаженный растр:
отфильтрованный растр

Его мы и будем использовать для отмывки. С помощью меню «растр-морфометрический анализ-теневой рельеф»:

вызовем диалог создания карты теней:

На этом этапе следует знать одно неявное правило. В том случае, когда вы планируете использовать теневую отмывку в качестве подложки саму по себе, можно использовать значения по умолчанию. В том случае, когда ваша отмывка ложится на некую базовую карту (в нашем случае, такой картой служит OpenStreetMap), следует повернуть источник освещения на сто восемьдесят градусов. Дело в том, что стандартная отмывка представляет собой темный растр, который при наложении не только перестает читаться, но и зашумливает перекрываемые слои. Для того, что-бы это избежать, отмывку следует инвертировать, но в этом случае, горы выглядят как впадины, а каньоны напоминают холмы. Учитывая это, мы заранее изменяем источник освещения, что позволит нам при инвертировании сохранить визуальную форму отмывки. По умолчанию, источник освещения расположен в районе трехсот градусов, чего, конечно-же в природе почти никогда не бывает. Еще Салищев указывал на эту особенность — привычная отмывка рельефа обязана своему появлению лампам, которые обычно устанавливали слева от кульмана. Мы поменяем значение «300» на «120» и через несколько секунд алгоритм выдаст нам вот такой результат:

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

Через меню «растр-извлечение-обрезка»

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

В результате получим вот такую картину:

Двойным кликом по полученному растру в ТОСе вызовем меню свойств, где сменим градиент с «от белого к черному» на «от черного к белому». После применения изменений растр инвертируется. В месте сочленения данных ASTER GDEM и SRTM осталась небольшая белая полоса, однако, после того как будет установлена прозрачность, а сама отмывка наложена на подложку, заметить эту полосу будет практически невозможно:

Для того, что-бы не инвертировать растр при каждой новой загрузке, сохраним его как новый слой, но на этот раз в меню сохранения отметим его не как «данные», а как «изображение». На этом создание отмывки закончено. Установим прозрачность отмывки 95% и подложим под нее OpenStreetMap:

Так выглядит чистая карта OSM:

А так выглядит карта OSM с наложенной на нее картой теней в районе соприкосновения данных SRTM и ASTER:

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

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

С практической точки зрения эта проблема решается так. Создадим временный полигональный слой:
Новый временный слой2

Сделаем его редактируемым (иконка желтого карандаш), после чего установим режим добавления нового объекта
Редактирование в QGis

и обведем один из районов:

Сохраним фрагмент растра для этого участка (не фильтрованного растра, а исходного, мы же усложняем себе задачу!), обрежем его по обведенной области и отфильтруем с теми же параметрами, что и при создании отмывки. Затем с помощью геоалгоритма SAGA-Shapes-GRID-Горизонтали по ЦМР создадим изолинии через каждые 50 метров высоты.

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

Отчетливо просматривается линия сочетания данных ASTER и SRTM. При различных способах фильтрации растра ASTER GDEM эту линию можно делать более или менее заметной о чем я упоминал в начале данной статьи.

Изолинии из отфильтрованного растра на этот район выглядят так:

На границе растра изолинии замыкаются и не несут в себе географического смысла. Такие участки в последующем будут удалены. Именно поэтому обрезка dem-растра производилась нами не по границе района а по внешнему слою.

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

Чем больше полигоны обрезки растров, тем дольше времени будет затрачено на обработку, но тем точнее будут соединяться изолинии:

После того, как изолинии извлечены, остается только обрезать их по контуру границ, сохранив оригинальные значения атрибутов изолиний. Для этого успешно применяется алгоритм «SAGA-Shapes-Lines-Пересечение линий и полигонов»:

Небольшая настройка стиля и изолинии готовы:

Обычная карта OpenStreetMap:

Тот же фрагмент карты, но с наложенной картой теней и горизонталями:

Отдельно необходимо вынести проблему неоднородности данных ASTER GDEM по качеству. Даже на нашем примере видно, насколько сильно артефакты отсутствующей и ошибочной информации сказываются на качестве визуализации рельефа в целом:

Данная проблема не имеет однозначного механистического решения. Наиболее оптимальные способы ее устранения зависят от требований к визуализации, выбранного региона и доступной вычислительной мощности. В качестве одного из способов решения я предлагаю использовать последовательное применение фильтра DTM (предельный уклон местности 10 градусов, радиус поиска 2 пикселя), заполнение пропусков в образованном в результате DTM-фильтрации растра (порог напряжения 10) и последующая фильтрация простым фильтром (круговой режим поиска, гладкий фильтр, радиус 5px). Этот метод не позволяет полностью избавиться от артефактов, но существенно снижает их число и сглаживает, что определенно положительно сказывается на визуализации рельефа:

Карта OpenStreetMap без отмывки и изолиний:

Карта OpenStreetMap с отмывкой и изолиниями:

Дорога на Морье

Оргазм, вибратор, онанизм, жесткач, котята, индуизм

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

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

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

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

Да хули пиздеть-то? Давайте лучше прогуляемся с вами на мыс Морье, что в Ленинградской области. Там очевидно какой-то поселок:
мапсми

Сам поселок может и не очень интересен, а вот посмотреть на церковь может быть весьма любопытно:

Да и чего бы туда не сходить, если даже роутинг туда строится без проблем?

Дорога великолепна. Слева слабодренированные кислично-сфагновые березняки, осинники и сероольшатники:
мелиоративная канава

Справа за соснами шумит едва вскрывшееся ото льда Ладожское озеро:
Ладога

Под ногами вполне сносная асфальтовая дорога. Идете вы такой, природе радуетесь. Километр, второй, четвертый, пятый и тут, хуяк!
Стой, стреляют

Что за хуйня? Если кому не видно — надпись на щите гласит: «Стой, стреляют. Проезд и проход запрещен». Бля, да там же поселок по мапсми? А давайте-ка глянем OSM-стандарт, геоданные-то одни и те же:

Мыс Морье

Воттыжблядь-то! Так и есть, я шестой километр иду по вомнскому полигону. А впереди у меня кпп воинской части не то связистов, не то РВСН. Так какого хуя в масми об этом ни слова? Хотя постойте, видите эту тараканью залупу:

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

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

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

консоль WMS-сервера

Установка и настройка OGCServer-master

В прошлый раз мы подняли свой TMS-сервер на базе mapnik. Самое время развернуть на той-же основе свой WMS. Для этого, мы используем библиотеку OGCServer-master написанную Жаном Франсуа Дойоном. Библиотека написана на питоне специально под мапник со следующими ТТХ:

— Поддерживает WMS 1.1.1 и 1.3.0
— CGI/FastCGI, WSGI, mod_python
— Поддерживает все 3 запроса: getcapabilities, getmap и getfeatureinfo
— Выходные файлы в формате JPEG и PNG (только PNG256)
— Обрабатывают ошибки XML/INIMAGE/BLANK
— Поддерживает несколько именованных картографических стилей
— Поддерживает перепроецирование
— Поддерживаются метаданные слоя: title, abstract
— Существует возможность запросить все слои с помощью LAYERS=__all__

При использовании библиотеки следует помнить, что Getfeatureinfo поддерживает только простой текст, не поддерживаются 8-битные растры png (только 256 цветов) и для CGI/FastCGI должна быть доступна запись tempfile.gettempdir() (обычно пишется в «/tmp»). Кроме того, OGCServer-master требует установленных питоновских зависимостей мапника, питоновскую библиотеку для визуализации PIL и модули jonpy.

Подробные инструкции по настройке библиотеки можно почерпнуть из аутентичной страницы гит-хаба. Сама установка элементарна, требуется лишь закачать библиотеку на сервер, после чего в корневой директории библиотеки (она содержит файл setup.py) выполнить команду:

sudo python setup.py install

У библиотеки OGCServer-master есть ряд подводных камней о которых желательно знать до установки. Во-первых, перед установкой рекомендуется исправить имена и заголовки WMS, поскольку их дефолтные значения содержат в себе пробелы. QGis такие записи воспринимает нормально, но у других программ (например, FME) по этой причине могут возникать проблемы с загрузкой WMS-слоев. Для исправления, следует внести правки в шесть файлов из директории ogcserver. Исправленные строки в файлах (прописано «newname») будут выглядеть так:

Файл OGCServer-master\ogcserver\default.conf (2 правки):
Строка 95: wms_name = newname
Строка 98: wms_abstract = newname
Файл OGCServer-master\ogcserver\wms111.py (2 правки):
Строка 147: rootlayertitle.text = 'newname'
Строка 154: rootlayerabstract.text = 'newname'
Файл OGCServer-master\ogcserver\wms130.py (2 правки):
Строка 154: rootlayertitle.text = 'newname'
Строка 161: rootlayerabstract.text = 'newname'

Во-вторых, OGCServer-master более чувствителен к xml-файлу стиля чем сам мапник. Это значит, что при наличии ошибок в файле стиля, которые при старте рендеринга TMS проигнорируются, например line-opacity, сервис WMS не запустится, а выдаст ошибку с указанием всех строк, подлежащих исправлению. С одной стороны, это требует более тщательной работы над стилем, с другой стороны, позволяет легко отловить ошибку. По этой причине, я использую OGCServer-master даже в тех случаях, когда требуется исключительно создание TMS.

После установки, запустить WMS можно с помощью команды

ogcserver путь_к_стилю.xml

Если вы работаете через ssh, можете прописать перед командой запуска «nohup» для того, что-бы после разъединения сервер продолжал работать. После этого можно запрашивать слои в браузере командой:

http://localhost:8000/?LAYERS=__all__&STYLES=&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS=EPSG%3A3857&BBOX=-20037508.34,-20037508.34,20037508.3384,20037508.3384&WIDTH=256&HEIGHT=256

Либо, через стандартный интерфейс QGis или любой другой программы.

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

Картостиль I

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

Итак, встречайте. Картографический стиль под названием «I».

Стиль адаптирован для данных OpenStreetMap. Код написан на чистой иксэмельке под мапник. 

В качестве подложки использован обработанный растр Blue Marble Next Generation. Такое решение позволило совместить в одно целое карту и спутниковый снимок. Это особенно ценно потому, что стиль планируется использовать при обследовании объектов вне населенных пунктов, где данных о растительности и рельефе зачастую просто нет.

Безразлично чей Крым

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

Средняя Россия и Поволжье

Для отображения рельефа использованы демки SRTM и ASTER с помощью которых подготовлена отмывка и шейпы горизонталей.

Эльбрус

Большая работа проведена с подписями. Нет, не просто большая — огромная. И все-равно я не могу сказать, что приблизился к идеалу. Максимум — нашел нужное направление движения.

Нерезиновая

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

Объемные домики на высоких зумах всегда влекут за собой проблему заслона части объектов. Эту беду можно решить двумя способами: сделать домики полупрозрачными (как на Яндекс-картах) или уменьшить их высоту. Я не стал играть с прозрачностью: во-первых, это проблематично с технологической стороны, а во-вторых просто вульгарно. Вместо этого, я добавил в здания арки: они не бросаются в глаза, но дороги не упираются в стены домов.

Петербургские дворы-колодцы

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

Фрагмент Челябинска:

Далекие от картографии люди могут спросить: а чем эта карта отличается от остальных подобных? Что ж, смотрите сами. Все картинки кликабельны. Слева вверху картостиль I, внизу картостиль mapnik standart OSM, справа вверху Яндекс-карты, справа внизу карты от Google.

2 зум:

3 зум:

4 зум:

5 зум:

6 зум:

7 зум:

8 зум:

9 зум:

10 зум:

11 зум:

12 зум:

13 зум:

14 зум:

15 зум:

16 зум:

17 зум:

18 зум:

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

Я мог бы часами рассказывать про нюансы картостиля «I». Но лучше не буду растягивать этот бесконечный пост и молча пойду домой. Пусть моя работа говорит сама за себя.

Картографическая парафилия

Картографическая парафилия

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

Над изготовлением этой карты мы трудились около месяца. Она впитала в себя всю звучащую фоном дискографию «Сектора Газа», сборник сочинений Альфреда Шнитке и песню Александра Харчикова «Настоящий коммунист перед Родиною чист».

Но самое главное, карта сделана в фотошопе. От первого до последнего пикселя. Не задавайте глупого вопроса «зачем?». Каждый человек имеет в жизни право на легкую профессиональную девиацию. Зато получившийся результат настолько чудовищен, что вполне может сойти за новомодное авторское решение.

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

Векторная отмывка

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

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

Возьмем модифицированный фрагмент MODIS Blue Marble Next Generation с повышенной яркостью и контрастом для основы:
2

Для того, что-бы изобразить рельеф этой местности можно пойти классическим путем, наложив сверху полупрозрачную карту теней. А можно наложить векторный слой горизонталей и результат будет вполне неплох.
2a

Весь секрет в том, что горизонталей должно быть много (интерполируйте не жалея процессора), но каждая из линий должна быть максимально тонкой. В этом случае отдельные линии становятся незаметными, а склоны с присущими им сгущениями горизонталей проявляются на карте в виде градиента.
izorelef

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

izorelef2

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

3

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

1a

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

index

Из этого не следует, что векторная отмывка лучше растровой или наоборот. В разных ситуациях должны расцветать разные цветы. Интересно другое: отмывку вполне можно считать частным случаем изображения рельефа с помощью изолиний. А значит что? Правильно, если не брать в расчет всякого рода экзотику и цвет, то рельеф на картах изображается двумя способами: с помощью поперечной (отмывка, изолинии) и продольной штриховки. Последняя, к слову, незаслуженно забыта и хранит в себе огромный потенциал по визуализации рельефа. Да что там говорить, сами посмотрите (фрагмент карты взят с геомануала):

000109

Нечеткий пацанчик

В труды Лотфри Заде я влюбился с первого прочтения и до сегодняшнего дня любовь эта не только не угасла, но даже окрепла, подведя меня к открытию субъективной логики. Говоря о безмерности такой страсти, достаточно хотя-бы вспомнить историю того утра, которое я провел в компании со свежеприбывшим в часть азером, застав его в армейском толчке с гашишем вместо тряпки. Его родители и предположить не могли, что выбрав имя знаменитого математика, они оберегли сына от хорошей пиздюлины на фоне журчащих чаш Генуя. Судя по тому, как он прожигал дырку в бутылке из под «фанты», проблема здоровья его совершенно не интересовала. Я отобрал у этого идиота бутылку и раскуривались мы с ним через нормальную полторашку отечественного уставного лимонада «Дюшес».

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

Простой пример. В процессе классификации растительности теряется часть информации о классифицируемых объектах (их «индивидуальные особенности») [5]. Это приводит либо к недоиспользованию, либо к перерасходу ресурсов окружающей среды и производства.

Вот было бы заебато, усовершенствовать имеющуюся типологию лесов Северо-Западных районов России [5], для возможности учета индивидуальных особенностей растительного покрова! Такая типология была-бы актуальной при проектировании объектов строительства, сельского и лесного хозяйства.

Говно-вопрос! Для этого только требуется современную типологию [5] перестроить на основе теории нечетких множеств [1].

Классификации лесной растительности, использующие теорию нечетких множеств неизвестны. Аналогом нечеткой классификация в лесной таксации можно считать метод характеристики состава древостоя (Чистые насаждения – классы, коэффициенты в формуле состава древостоя – значения характеристических функций, определяющих степень приближенности к каждому классу). Теоретические аспекты нечетких классификаций рассматриваются в [2].

Я, например, когда покупал в полуторалитровых бутылках портвейн «Агдам» (такие бутылки с углублением для руки) всегда представлял себе двухуровневую типологию. Наименьшая единица – тип леса, выделяется аналогично [5] (на основе преобладающей породы и серии типов леса). Серии типов леса (далее – «серии») выделяются на основе обилия групп индикаторных видов [5]. Для каждой серии характерна индикаторная группа с уникальным набором видов. Растительное сообщество может одновременно относиться к одной (истинной) серии или нескольким (переходным) сериям. Истинная серия характеризуется присутствием только одной индикаторной группы с суммарным проективным покрытием травяно-кустарничкового и мохово-лишайникового яруса 100 %. Показатель истинности серии рассчитывается как мера количественного сходства (коэффициент Чекановского, Эвклидово расстояние и др. [4]) между рассматриваемым растительным сообществом и истинной серией типа леса.

Да что там говорить, я даже серии типов леса выделил:

1. Лишайниковая (ЛШ). Основные индикаторные виды: Arctostaphylos uva-ursi, Carex ericetorum, Cladonia amaurocraea, Cladonia unicalis, Cladina arbuscula, Cladina rangiferina, Cladina stellaris, Cetraria islandica, Licopodium complanatum. Вспомогательные индикаторные виды: Polytrichum juniperinum, Polytrichum piliferum;

2. Кустарничковая (КТ). Основные индикаторные виды: Vaccinium myrtillus, Vaccinium vitis-idaea. Вспомогательные индикаторные виды: Melampyrum pratense;

3. Мелкотравная (МТР). Основные индикаторные виды: Majanthemum bifolium, Trienthalis europaea, Rubus saxatilis, Luzula pilosa, Oxalis acetosella, Pteridium aquilinum. Вспомогательные индикаторные виды: Dryoptheris carthusiana, Linnaea borealis, Melampyrum sylvaticum, Orthilia secunda, Lycopodium annotinum, Platanthera bifolia;

4. Неморальная (НЕМ). Основные индикаторные виды: Melica nutans, Viola riviniana, Carex digitata, Pyrola rotundifolia, Paris quadrifolia, Aegopodium podagraria, Pulmonaria obscura, Stellaria holostea, Actaea spicata, Lathyrus vernus. Вспомогательные индикаторные виды: Veronica officinalis, Veronica chamaedrys, Milium effusum, Dryoptheris filix-mas, Anemone nemorosa, Hepatica nobilis, Galeobdolon luteum, Rhodobryum roseum, Ranunculus cassubicus, Asarum europaeum, Viola mirabilis, Myosotis sylvatica, Galium odoratum;

5. Сфагновая (СФ). Основные индикаторные виды: Carex globularis, Sphagnum girgensohnii, Sphagnum capilifolium, Polytrichum commune, Sphagnum magellanicum. Вспомогательные индикаторные виды: Rubus chamaemorus, Molinia coerulea, Aulacomnium palustre, Sphagnum wulfianum;

6. Багульниковая (БАГ). Основные индикаторные виды: Ledum palustre, Chamaedaphne calyculata, Vaccinium uliginosum, Oxycoccus palustris, Andromeda polifolia, Eriophorum vaginatum, Empetrum nigrum, Drosera rotundifolia, Oxycoccus microcarpus, Sphagnum fuscum. Вспомогательные индикаторные виды: Sphagnum angustifolium, Carex pauciflora, Carex limosa, Betula nana;

7. Долгомошная (ДОЛ). Основные индикаторные виды: Pleurozium schreberi, Hylocomium splendens, Dicranum scoparium, Dicranum majus, Dicranum polysetum;

8. Болотнотравяная (БТР). Основные индикаторные виды: Comarum palustre, Menyanthes trifoliate, Equisetum fluviatile, Carex lasiocarpa, Phragmites australis, Calla palustris. Вспомогательные индикаторные виды: Carex rhynchophysa, Scirpus sylvaticus, Solanum dulcamara, Carex vesicaria, Naumburgia thyrsiflora, Equisetum palustre, Carex acuta, Eriophorum polystachyon, Sphagnum riparium

9. Таволжная (ТАВ). Основные индикаторные виды: Filipendula ulmaria, Geum rivale, Ranunculus repens, Galium palustre, Viola epipsila, Cirsium oleraceum. Вспомогательные индикаторные виды: Caltha palustris, Carex cespitosa, Scutellaria galericulata, Cardamine amara, Impatiens noli-tangere, Chrysosplenium alternifolium, Equisetum pratense, Calliergon cordifolium, Plagiomnium undulatum;

10. Приручейная (ПР). Основные индикаторные виды: Athyrium filix-femina, Dryopteris expansa, Deschampsia cespitosa, Rubus-idaeus, Gymnocarpium dryopteris, Plagiochila major. Вспомогательные индикаторные виды: Phegopteris connectilis, Cirsium heterophyllum, Crepis paludosa, Circaea alpine, Aconitum septentrionale, Plagiomnium medium, Sphagnum squarrosum.

Что у нас тут? Брусничная серия говорите, согласно [5]? А это что? Ах, это тоже брусничная? А это? Позвольте, сударь, может мы прекратим отметать явные различия в увиденном и согласимся с тем, что наша прогулка проходит по кустарничково-лишайниковому типу КТx ЛШy, где x и y просто принимают различные значения?

Нечеткая классификация более достоверно описывает условия произрастания. Так при сравнении серий типов леса и ценозов в координатной системе, где оси означают богатство и влажность (рисунок) видно, что большинство растительных сообществ, которые по старой классификации относятся к «чистым» (лишайниковая, таволжная) на самом деле являются переходными. Ординация произведена по методу [3]. Проективное покрытие основных индикаторных видов принималось больше 8%, вспомогательных – единично.

ramensk
Рисунок. Четкие [5] (серый цвет) и нечеткие серии типов леса соординированные по влажности и богатству почвы.

 

Использование нечеткой типологии дает нехуевые преимущества:

1. Возможность более точного определения и планирования объема необходимых работ.

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

3. Возможность более обоснованного утверждения границ проектных решений.

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

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

Или вот вам, другой пример. Потребовалось однажды нитку ЛЭП вести через ООПТ [6]. А тогда все дико задрачивались на лобарию пульмонарию и мирику гале. Но восковник в месте проектирования не растет, а вот лишай надо было оберегать всеми силами. Да и кроме него хватало видов, которые требовалось охранить. Нужна была карта на которой сразу бы читался породный состав во всем его многообразии, полнота древостоя, да еще, что-бы карту эту можно было как подложку использовать. Так, что-бы человек смотря на карту сказал, что в этой точке лес гуще и елки больше. Не в абсолютных показателях, их можно и из таксации посмотреть, а именно относительно прилегающих участков.

При такой задаче, обычным планом лесонасаждений можно только жопу подтереть.

четкая

 

И никакие ГИСы (а в то время был только старый добрый ArcView 3.2a) вам не помогут решить эту задачу, пока вы не откроете свое сердце фаззи-множествам и не смиритесь с мыслью о том, что четкость элементов карты может быть не только достоинством, но и недостатком.

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

Но все-что связано с природными ресурсами у нас не логично, а упраздненное в 2007 году лесное хозяйство и вовсе парадоксально. У нас квартала квадратные, а выдела имеют форму животных из ЛСД-шного наркотрипа, в то время как должно быть совершенно наоборот! Просто почувствуйте масштабы пиздеца. В сельском хозяйстве, где все на порядок проще, сходные вопросы поднимал, если не ошибаюсь, академик Виноградов, но один хрен за пределы опытных полей Новочеркасского НИИ виноградорства ничего не сдвинулось.

Так что-же делать? Все? Пиздец? Спокойно, товарищи! Это как плавание: для начала перестаньте бояться воды. В нашем случае, перестаньте бояться того, что вы не сможете, указав на карте точку, озвучить абсолютное значение показателя в этой точке. Оно вам нахуй не надо: важно знать, что в этой точке показатель больше чем в соседней. Распределяем цвета по породам, согласно правилам оформления лесотаксационных документов, далее создадим отдельные слои по каждой породе, установив для каждого выдела прозрачность, пропорциональную четверти полноты древостоя в этом выделе. Если распечатать каждый из слоев, получится карта полноты ельников, карта полноты сосняков и т.д. А теперь магия — наложим слои друг на друга.

нечеткая

 

Согласен, выглядит непривычно. Чем ярче цвет — тем гуще лес. Чем чище цвет — тем однороднее состав. Конечно, это только условно нечеткая карта — что поделать, исходные данные накладывают известные ограничения. Сама карта тоже явно требует доработки стиля, однако стоит ли требовать игру актеров от фильма «Прибытие поезда на вокзал Ла-Сьота»?

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

Жаль только за время жизненных пертурбаций оригинал этой карты исчез, оставив после себя только свою уменьшенную копию:

fuzzymap

 

А парня того, говорят, через пол-года менты в увольнении взяли с целым пакетом травы. И ничего, подержали пару часов и отпустили. Видимо в школах милиции тоже изучают нечеткие множества.

 

Литература:

1. Заде Л. Понятие лингвистической переменной и его применение к принятию приближенных решений / Пер. с англ.— М.: Мир, 1976.— 167 с.;

2. Нечеткие множества и теория возможностей. Последние достижения: Пер. с англ. / Под ред. Р.Р. Ягера. – М.: Радио и связь, 1986, — 408 с.;

3. Раменский Л.Г., Цаценкин И.А., Чижиков О.Н., Антипин Н.А. Экологическая оценка кормовых угодий по растительному покрову – М.: Государственное издательство сельскохозяйственной литературы, 1956, 472 с.;

4. Словарь понятий и терминов современной фитоценологии / Б.М. Миркин, Г.С. Розенберг, Л.Г. Наумова. – М.: Наука, 1989. – 223 с.;

5. Федорчук В.Н., Нешатаев В.Ю., Кузнецова М.Л. Лесные экосистемы северо-западных районов России: Типология, динамика, хозяйственные особенности. – С.-Пб., 2005. 382 с.

6. Материалы комплексного экологического обследования участков территории, обосновывающие внесение изменений в положение о природном комплексном заказнике регионального значения «Лисинский». — С.-Пб., 2011. 159 с.

Сийская дерация

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

Так получается, что я когда сижу неизменно утыкаюсь взглядом в район Новой Зеландии.
DSCN8229

 

Видите остров Окленд? К юго-востоку от него под буквой «Т» находится еще один остров — маленькая неподписанная точка. Я упираюсь взглядом в эту точку почти каждый день. И каждый раз думаю: что здесь? Нет, ясно что архипелаг какой-то, но хотелось бы деталей. Название, население, климат, геология, растительность, история, да хоть что-то. Ведь это на карте точка выглядит будто картограф что-то из носа выковырял и прилепил, а в реальности там наверняка полно безграничного и бесконечно интересного.

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

Итак, что нам надо? Для начала узнать название этого архипелага. Открываем карту OpenStreetMap, выбираем искомый район и … открываем главный секрет веб-картографии. С нулевого по десятый зум все карты рисуются наотъебись и выглядят как говно:

Классика:

1

 

Вообще стандартный стиль OSM — это какое-то недоразумение. Ощущение, что он разрабатывался только как иллюстрация к уровню наполненности базы геоданных. Мой любимый зум — четвертый. Тот самый, где географическое расположение России соответствует анатомическому,  появляется новое островное государство «сийская дерация»,

4

 

Эй порноактеры! Эй проститутки! Да что вы знаете о ебле если не пользовались картой OpenStreetMap?

6

7

 

А еще я обожаю идею подписей локальными языками.

— Прикинь, мы в прошлом месяце в авиакомпанию взяли чувака, который разрабатывал картостиль OSM.

— И что теперь?

— Теперь все наши самолеты летают по маршруту: ليبيا — O`zbekiston — 上海

5

 

Карта гуманитарной команды тоже не лучше.  Я не микробиолог, у меня для таких закорючек микроскопа нет:

2

 

МапКвест утопил мой остров в текстурном океане. Зато города со звездочками. Ну заебись теперь.

3

 

— Так тебе нужно какой-нибудь геграфический стиль смотреть. Это же стили скорее политические, здесь текст принадлежности к государству имеет больший приоритет, чем название физического объекта. На какой-нибудь OpenTopoMap все должно быть заебись.

— А вот хуй.

12

 

В OpenStreetMap все данные открыты. Не нравится стиль — пиши свой.  Но как обстоит дело с коммерческими картами?

Яндекс вообще не заморачивается со всякими островами в южном полушарии. Просто гуру похуизма:

8

 

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

9

 

На картах Бинг та же хуйня. Для тех кто не в теме, Бинг — это поисковик от майкрософта, с джентельменским набором веб-сервисов. Здесь хоть названия стран можно читать. Похуй на красоту. Если текст физиологически читабелен, то уже заебись.

10

 

Наипиздатейше из всего этого мракобесия выглядит только открытый MapSurfer.net. Но говоря по чесноку, рядом с картой полушарий для начальной школы он и близко не стоит. Но здесь хотя-бы можно прочесть «Campbell Island».

11

 

При этом остров прорисован весьма неплохо. Вот он в том же стиле MapSurfer.net:

osm2

 

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

Но самая большая проблема даже не в этом. При создании любых современных карт в той или иной форме воссоздается всегда один и тот же диалог:

— Слушай, а мы материки будем одним цветом красить или каждый материк по особому?

— Да похуй как! Главное что-бы тропинки от велодорожек отличались.

 

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

Как я создавал картостиль «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

Первая производная по дизайну карт

Написав вчера заметку о косяке отображения Mapnika, весь день сегодня думаю о математических методах в картографическом дизайне. В свое время этому были посвящены довольно-таки интересные работы (например А.В. Востокова «Оформление карт»), но в последние годы ничего подобного мне на глаза не попадалось.

Идею подсказал Илья Зверев в блоге OSM, своей мыслью по поводу того, что Mapnik в OSM вовсе не косячит, а делает все как надо, поскольку «дороги важнее, чем контуры домиков». У меня-таки есть что на это ответить.

Первостепенные дороги важнее чем второстепенные это да. Первостепенные здания важнее чем второстепенные — тоже да. Но ни дороги, ни здания не могут быть важнее друг друга. Задача картографа не в том, что-бы выбрать приоритетный для показа объект, а в том, что-бы показать оба объекта, не перегрузив при этом карту. Вот, в гуманитарной карте это получилось (я про ситуацию с домиками). Что мешает сделать это в mapnik-е?

Но не о том речь. Периодически из под всех плинтусов слышно: «Я то в советское время Ооооо!» «Раньше карты были лучше!, Раньше карты были хуже!»

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

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

Да чего уж кокетничать. Можно тогда и вторую производную взять, получив значение ускорения развития картостиля.

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

Первое что приходит в голову: такие производные дают ключ к определению влияния каждого из элементов картостиля на общую читаемость карты. Действительно, поэтапно добавляя элемнты с разным цветом, светлотой, текстурой, геометрией, размером и прочими характеристиками, мы сможем итеративно рассчитывать производную, после чего соотнести полученные значения с параметрами добавленных на карту элементов… А вот херасдва! Я ставлю ящик пива на то, что читаемость карты подчиняется не аддитивному, а эмергентному закону. Более того, не удивлюсь, если при выборе влиящих на отображение показателей мы столкнемся с принципом, который в экологии называется «бочка Либиха», согласно которому решающее значение имеет только критичный фактор среды (в нашем случае визуализации данных).

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

Где-то я о таком уже слышал.