Опен стайл пиздинг

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

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

Код писался под Mapnik. Есть еще вариант этого кода написанный на CartoCSS, но он несколько устарел, а потому я его тут не выкладываю. Для отрисовки тайлов в этом стиле рендер должен подсасывать данные OSM в формате шейп-файлов, которые доступны на сайте ГИС-ЛАБа

Конечно-же, результат далек от идеала, однако, как говорил один знакомый прокурор: «похоже до степени смешения». Это еще раз подтверждает, что закрытые проекты сосут перед опенсорсом. Ибо сделать из OpenStreetMap Яндекс-карты — что в носу поковырять, а вот обратно хуй там. Еще есть огромное количество моментов, которые следует исправить, а то и вовсе полностью переделать. Но нет предела совершенству, в отличии от жизни человеческой.

Ну а теперь самое интересное: картинки. Давайте погуляем по зумам. В Яндекс-картах их шестнадцать, со второго по восемнадцатый. Вот второй зум:
2

 

Здесь и далее слева карта Яндекса, справа мое скромное творение.

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

Третий зум:

3

 

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

4

 

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

На пятом зуме пришлось изрядно возиться с водоемами. Будете смеяться, но в OSM нет единых водотоков, одни кусочно-разрывные графики функций, снабженные разными тегами. Например, вы не можете легко отобразить на карте такую реку, как, Енисей, поскольку часть реки riverbank, часть water, а часть вообще непонятно как тегирована. Дай думаю, посмотрю, а как реки в стандартном стиле отображаются? А вот хрен там, они в стандартном стиле на этих зумах никак не отображаются. Ну что тут поделать? Я налил себе стакан и вывел интересующие меня реки просто по их имени, благо крупных рек выводить много и не требовалось.

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

На этом же зуме у Яндекса появились первые иконки. Поскольку красть иконки было бы совсем бесчестно,  а главное скучно, я не стал выносить себе мозг и нарисовал первый примитив, который в голову пришел:5

 

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

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

Седьмой зум (да я уже приехал из тайги, поплнил запасы пива и зарядил батарею ноутбука):

7

 

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

Восьмой зум:
8

 

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

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

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

 

Еще одна трудность, которая начинается на девятом зуме это железные дороги. Данные OpenStreetMap настолько разнятся в этой части от данных Яндекс карт, что для достижения похожести стилей приходиться применять совсем другое обозначение для железных дорог. В OSM  в отличии от Яндекс-карт отрисована каждая ветка захолустного пути, поэтому применение оригинального стиля ведет к тому, что железные дороги начинают выглядеть как толстые черные полосы. А стоит немного отойти от оригинала и сразу все нормально. Десятый зум:
10

 

Одиннадцатый зум, на котором я потерял названия районов и несколько дней не мог их найти, но в итоге нашел:
11

 

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

 

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

 

Четырнадцатый зум:
14

 

Пятнадцатый зум:
15

 

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

 

И слева и справа домики объемны, однако в моих случаях их высота отрицательна. Следствием костыля является невозможность отображения очень высоких зданий, поскольку чем выше домик, тем сильнее смещается на карте его основание, иногда наползая даже на дороги и тротуары. Семнадцатый зум:
17

 

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

 

И еще кое-что. Хоть стиль и можно скачать, но все-таки не забывайте, что пользоваться им незаконно, ибо был он честно спизжен. Как производственный продукт он не годится. А вот для процесса познания того, что OpenStreetMap — круть небесная, в самый раз.

Нечеткое тегирование это просто

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

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

Итак, как говорил Сократ: «Точное логическое определение понятий — условие истинного знания». Тегирование в OpenStreetMap это присвоение набору геоданных некоего смысла и пояснения, которое выражается в виде присвоенного ключа (тега) и его значения. Например, дорога внутри жилых зон обозначается как highway=living_street. Здесь слева от знака равенства в теге прописано отнесение геоданных к классу (класс дорог), а справа дано пояснение (дорога вдоль жилых зон).

Можно ошибочно подумать, что схема тегирования OSM представляет собой примитивный аналог иерархических классификаций, состоящий всего из двух уровней. На самом деле это большое заблуждение, поскольку в верно построенной иерархической классификации два элемента относящиеся к разным надмножествам элементов не могут быть похожи до степени смешения, или говоря более строго, близость элементов различных подмножеств иерархической системы всегда меньше близости содержащих их надмножеств. Практически это выражается в том, что два объекта, относящиеся к разным образцам надклассов не могут быть более близки, чем сами эти надклассы. В OSM такое встречается сплошь и рядом: мой любимый пример natural=wood и landuse=forest. Близкие и часто взаимозаменяемые значения относятся к разным тегам. Такое в иерархической системе невозможно.

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

Что это значит в переводе на язык бытового жанра? Это значит, что в нотации «ключ»=»значение», знак равенства абсолютно избыточен и выполняет карго-функцию. Это не более чем формализм и ничем необоснованное усложнение нотации. А значит и вся схема тегирования данных проекта OpenStreetMap сводится к присвоению геоданным пояснительного текста, содержащего в себе знак равенства. С таким же успехом можно было подписывать данные в виде «natural_wood», «naturalwood» или просто «wood» (забыл сказать, каждый тег содержит только уникальные значения, а это еще один довод против иерархичности схемы тегирования OSM). Говоря еще проще: никакой схемы тегирования в OSM нет, есть лишь набор странно оформленных подписей для каждого набора геоданных. Если вы сможете переступить через себя настолько, что признаете этот вывод, дальнейшее пояснение будет для вас совсем легким.

Повторюсь: данные OSM не имеют схемы тегирования, это лишь набор геоданных со странно оформленными подписями. но не подумайте, что это недостаток, как раз наоборот, это наиболее сильное преимущество проекта. Проблема в том, что преимущество это используется не до конца. Если-бы каждому объекту был присвоен только один тег, то можно было бы в полной мере говорить о примитивном булевом тегировании, которое безусловно давно устарело. Но тегов можно присвоить огромное количество. Например, не просто указать, что это здание и оно является магазином, но и дополнить информацию о нем часами работы, инженерными параметрами здания и еще чем в голову взбредет. Значит ли это, что объекту можно присвоить любое сочетание тегов (разумеется соответствующее действительности)? Нет. Каждый из тегов, присваиваемых объекту должен однозначно и независимо характеризовать какое-либо из свойств объекта. Есть у улицы свойство в виде ее названия — пожалуйста, тег «name». Есть у той же улицы свойство в виде покрытия дороги — пожалуйста, тег «surface». Для каждого свойства свой тег.

Но вот она, квинтэссенция моей сегодняшней речи. Одно и то-же свойство объекта можно (и нужно) выражать не посредством одного тега, а с помощью любого количества необходимых тегов. Зачем выбирать каким тегом обозначить лес с густым подлеском: natural=wood или natural=scrub, если можно использовать оба этих тега одновременно? А для большей ясности можно присвоить каждому тегу характеристическое значение истинности, от нуля до единицы. Ноль означает, что это свойство отсутствует, единица означает наличие этого свойства (не будем здесь поднимать дискуссию о критерии определений значений характеристических функций нечетких тегов и области значений таких функций). Конечно, придется изменить нотацию, но выглядеть это будет примерно так:
Лес с редким подлеском: wood(0.9),scrub(0.2);
Кустарниковые заросли с редким пологом леса: wood(0.4),scrub(1.0);

Так можно смешивать между собой абсолютно любые теги, что даст осмерам необычайно гибкий инструмент для описания реальной обстановки на местности. Вот несколько реальных примеров:
Юго-Запад Ленинградской области, дорога к базе охотников и рыбаков «Кривая Лука». Пять месяцев назад осмер под ником Sergey Astakhov отрисовал эту дорогу, обозначив ее как highway=track. На большем протяжении так оно и есть, но в паре мест, как бы вам это сказать… в паре мест то, что сейчас иначе кроме как highway=track не назовешь, в системе нечеткого тегирования выглядело бы как track(0.5),water(0.5). Или может вам больше по душе обозначение surface=water?

Другой пример из Кингиссепского района. Нарисованные по космосу тем же осмером дороги являются не чем иным как минерализованными противопожарными полосами и в системе нечеткого тегирования выглядели бы как road(0.2),ditch(1,0),forest(1.0) в том смысле, что это слабо похожая (0.2) на дорогу траншея используемая в лесном хозяйстве:

 

Другой похожий пример из Любанского района. На карте он не обозначен и честно говоря, не уверен, что есть отдельные теги для лесных волоков. Это один из главных недостатков привычной булевой классификации объектов по сравнению с нечетким тегированием. Пока старообрядцы будут выдвигать пропозалы с миллионами новых тегов, новое поколение картографов, владеющих знанием о нечетком тегировании легко опишет любой ранее невиданный объект. Например так: road(0.3),log(1,0),forest(1.0) — подобие дороги (0.3), устланное бревнами для целей лесного хозяйства.DSCN9054

Тут, пожалуй, наступило самое подходящее время, что-бы рассказать о потрясающей конструкции со вложенными нечеткими тегами, которая позволяет описывать реальность еще гибче, проще и правдоподобнее, но увы. Время уже позднее, а мне еще в деревню за трактором идти. Надо же как-то выбираться из этого track(0.3),water(0.7).

Математическая формализация единиц растительного покрова

Математическая формализация единиц растительного покрова

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

Для сложно устроенных (Растригин, 1981) природных систем, характерна не аддитивность, а эмергентность признаков.  Пренебрежение этим фактом ведёт к тому, что растительность внутри синтаксонов недостаточно охарактеризована, либо число синтаксонов неоправданно велико.

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

Метод классификации растительности, который я предлагаю построен на обобщённом математическом аппарате теории множеств. Характеристика синтаксонов базируется на теории нечётких множеств (Заде, 1976).

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

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

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

Основной единицей растительного покрова является специалитет – группа растений одного вида, целиком занимающая в пространстве объём своего мажорирующего контура.

Каждый специалитет обладает свойством истинности, выражающим степень его принадлежности к тому или иному синтаксону. Истинность характеризует степень заполненности мажорирующего контура органами растений. Примером абсолютно истинного  специалитета (истинность равна 1) можно считать накипной лишайник Rhizocarpon geographicum (L.) DC.:

IMG_1332

 

Большинство специалитетов имеет значительно меньшую истинность.  Так расчётная истинность еловых специалитетов на Северо-Западе России составляет в среднем 0,001-0,003.

Специалитеты объединяются в группы. Группы — это комплекс специалитетов в границах мажорирующего контура доминантного специалитета. Во многом этот класс напоминает эколого-ценотическую группу или тип леса в лесной типологии (Федорчук и др., 2005). В естественных лесах Северо-Запада России встречаются лишайниковая, кустарничковая, мелкотравная, неморальная, сфагновая, багульниковая, долгомошная, болотнотравяная, таволжная и приручейная группы (Голубев, 2012). Луга представлены насыпной, влажнозлаковой, злаковой и травяной группами (на основе данных: Нешатаев, Егоров, 2006). Поскольку мажорирующие контуры специалитетов (в том числе доминирующих) пересекаются, зачастую наблюдается пересечение групп.

Группы формируют формы. Формы — комплекс групп, занимающих в пространстве объем, ограниченный мажорирующим контуром групп с единой жизненной формой доминантов. Выделены древесные, кустарниковые, кустарничковые, травяные, моховые, лишайниковые, водорослевые, лиановые, подушковые и гетеротрофные формы.

Если особь вида s одновидового сообщества S={s1, s2, s3,…, sn} представить как множество клеток с параметрами: длина, ширина, высота, время s={(x1, y1, z1, t1) , (x2, y2, z2, t2),…, (xn, yn, zn, tn)}, то понятие специалитета можно формализовать как множество Sp={s1, s2, s3,…, sn}, такое, что:

Дальше в исходном тексте шли формулы, а так-же формализация понятий группы и формы. Но за давностью лет информация проебалась. Если не ошибаюсь, полный текст опубликован в сборнике материалов конференции «Математическое моделирование в экологии», что проходила в Пущино между 2010 и 2014 годами. Там же есть и недостающие формулы. Я их здесь публиковать не буду, поскольку, во-первых, у меня их почему-то нет под рукой, во-вторых, я сейчас еду в уазике и по тряской дороге пью пиво, а в-третьих, хуйню эту все-равно никто читать не будет, так что и так сойдет.