карта-говно

Не карта, а говно

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

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

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

Вот я смотрю сейчас на свою новую карту и понимаю, что это позорное уебищное говно:

Правильнее было бы никому эту карту не показывать и как можно скорее удалить ее с харда вместе со всеми исходниками. Но с другой стороны, что может быть хуже чем отсутствие коллекции хуево сделанных работ? А это прекрасный образец для моей подборки девиантных картографических произведений. Блядь, да это даже хуже, чем стандартный стиль мапника!

карта осм

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

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

Красная Книга Ростовской области

Красная Книга Ростовской области

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

Меня эта ситуация заебала и я оцифровал оба тома Красной Книги Ростовской области, векторизовав положение всех охраняемых видов растений и животных, присвоив им атрибуты таксономии, охранного статуса и ссылки на приложенные в тексте изображения. Все это скомпоновал в две карты на основе leaflet.js, добавил несколько полезных плагинов, подгрузил подложки OpenStreetMap, спутник от Mapbox и залил на свой сервер для общего доступа.
Красная Книга Ростовской области

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

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

Полную версию можно понаблюдать перейдя по ссылке на карту краснокнижных животных или растений. Переключаться между картами можно в нижней строке (там где копирайты) — я не стал лепить лишний интерфейс.

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

Код для вставки карты краснокнижных видов Ростовской области на любой сайт выглядит так,

Животные:

<iframe src="http://городшахты.рф/maps/1704_redbook61/animals/index.html" width="800" height="400" frameborder="0" allowfullscreen="allowfullscreen"></iframe>

Растения:

<iframe src="http://городшахты.рф/maps/1704_redbook61/plants/index.html" width="800" height="400" frameborder="0" allowfullscreen="allowfullscreen"></iframe>

Кроме того, список животных из Красной Книги Ростовской области можно почерпнуть из соответствующей статьи.

У меня все. Пойду чайку сбацаю.

Весенняя трава

Интро затянулось

Если бы я разрабатывал свой фамильный герб, то в качестве животного на нем выбрал бы землеройку. Маленький симпатичный зверек с огромной головой и невероятного размера хуищем, который постоянно жрет все подряд: от семян до ящериц, от мелких лягушек, до говна. Человек с пропрциями землеройки выглядел бы как покрытый короткой шерстью усатый мегацефал с головой весом в восемь килограмм, метровым членом и зубами, говорящими о его подсемействе. В этих зубах все дело: у кроцидур зубы белые и потому мы зовем их белозубки, а у сорексов бурые, их мы зовем бурозубки. Есть еще землеройка-красавка, но какие зубы у нее я не знаю, потому что она встречается редко, только в в пустынных районах Каспия, представлена одним видом (Diplomesodon pulchellum, она же красавка, он же пегий путорак) и легко отличима по черно-белому окрасу. У старых землероек зубы бывают стерты и одонтологическая идентификация их затруднена. Но не отчаивайтесь, если перед вами беззубый самец, вы всегда сможете уточнить его видовую принадлежность по головке члена, которая в момент возбуждения приобретает свеклообразную форму, о чем писал еще Денель в 1952 году. Впрочем, я слабо представляю себе, что нужно сделать, что-бы довести до полового возбуждения землеройку.
письки землероек-бурозубок

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

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

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

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

Но река и впрямь хороша:
Байдарка Тайга на реке Морье

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

Дно у реки песчаное, местами немного заиленное. Вода болотная темная, хоть кипяти и вместо чая наливай.
Под водой реки Морье

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

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

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

Теракт в метро

Событие в питерском метро

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

Что радует, даже копирайт на месте:
Копирайт ОСМ в метро

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

Визуализация рельефа по данным 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 с отмывкой и изолиниями: