shoorick: (Рыжий)
В прошлых сериях экспериментов с ТайлМиллом доводилось раскрашивать находящиеся в университетском городке здания и добавлять номера домов. Теперь попробуем раскрасить какую-нибудь территорию, да и здания можно перекрасить как-нибудь иначе. Заодно и повод подвернулся: авторы сайта mapstr.ru решили поменять самодельную карту Стерлитамака на OpenStreetMap — там город неплохо отрисован (хотя, конечно, есть ещё, что улучшать), им в целом нравится стиль, которым отрисована карта окрестностей нашего университета, но им хочется, чтоб было как в ДубльГИСе — чтоб стоянки, дворы и частный сектор были залиты разными цветами. Ну и школы с детсадами хочется выделить цветом.

Делаем так... )
Результат — на http://mapstr.ru/map/

Фрагмент карты Стерлитамака

http://shoorick.ru/2016/05/17/school-painging/
shoorick: (Рыжий)
Недавняя запись в ЖЖ-сообществе «Челябинский Челябинск» напомнила, что хотел я как-то собрать рельеф с дорогами на одной карте. Хотел — сделал.

Рельеф и дороги Челябинска

Сделано при помощи Maperitive — он кроссплатформенный (хоть и выглядит по-виндовому), написан на питоне, падает часто. Делаем так )
shoorick: (Рыжий)
Поставил на телефон Maps.me — для сравнения. Теперь у меня на одном телефоне аж пять карт: кроме Мэпс.ми это OsmAnd (как и Мэпс.ми, на OpenStreetMap, хотя им можно и спутниковые снимки смотреть, и всякие веб-карты), 2GIS (потому что в городе он круче, чем OSM), Яндекс.Навигатор (ради просмотра пробок и прокладки маршрута c ними) и Google Maps (потому что он уже есть — телефон-то ведроидный). Сравниваю, в общем-то, с ОсмАндом — у них хотя бы общая картографическая основа.

Первое ощущение: Мэпс.ми проще и шустрее. Но карта у них какая-то неконтрастная и серая да и, похоже, её внешний вид никак не регулируется.

Карты maps.me на смартфоне CAT B15

Кроме того, подробные карты появляются слишком поздно: на масштабах 1:500000 (в 1 см 5 км) и крупнее. Для Европы или Юго-Восточной Азии это, может быть, и хорошо, но для Урала образуется зазор: начиная с масштаба 1:2000000 (в 1 см 20 км) детализация встроенной грубой карты уже мала: в таком масштабе легко можно сдвинуть карту на такое место, где не будет ни одного отображающегося на карте города, и приходится либо карту приближать, в надежде случайно попасть в нужное место, либо отодвигать, чтобы понять, где вообще ты находишься. Получается, авторам приложения надо сдвинуть границу переключения карт: либо для всех регионов разом, либо с учётом плотности имеющихся картографических данных.

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

http://shoorick.ru/2015/12/02/mapsme/
shoorick: (Рыжий)
Недавно появилась задача — перевести карту студенческого городка на английский. Или хотя бы транслитерировать её, избавившись от кириллицы. Карта состоит из двух групп слоёв, в одной из них содержатся слои с маркерами, задаными яваскриптовым кодом — перевести их не составит труда, а вот растровый слой, подложку, поверх которой отображаются маркеры, перевести чуть сложнее — об этом сегодняшняя история.
Тут написано, как именно сделать, а после — результат: )кириллицы там уже не будет.

Карта без кириллицы

http://shoorick.ru/2015/09/08/transliterated-map/
shoorick: (Рыжий)
Функция selectall_arrayref перлового модуля DBI хороша для тех, кому лень писать:
This utility method combines "prepare", "execute" and "fetchall_arrayref" into a single call. It returns a reference to an array containing a reference to an array (or hash, see below) for each row of data fetched.

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

Реальный пример: скрипт, извлекающий тайлы из пакета, созданного Тайлмиллом, пытался читать данные как раз функцией selectall_arrayref. Зная, что применяется запрос
SELECT * FROM tiles

и что представление tiles содержит, помимо прочего, содержимое тайлов, занимающее места больше всего остального, нетрудно догадаться, что попытка выполнения запроса потребует выделения памяти в объёме, сопоставимом с размером файла, в котором сидит база (пакет с тайлами — это база SQLite).

Набор тайлов для территории размером 600×400 км в средних широтах — например, с Челябинском по центру, Ашой на западе, Карталами на юге и Тюменью на северо-востоке — займёт больше гигабайта для набора масштабов не больше шестнадцатого. На практике так и получилось: скрипт отжирал больше гигабайта памяти и всё никак не мог приступить к полезной части, пытаясь отожрать ещё. Если же увеличивать масштаб, затраты вырастут ещё сильнее: добавим семнадцатый зум масштаб — понадобятся ещё три-четыре гигабайта, Добавим восемнадцатый, которого хватит даже для любопытных исследователей карт — ещё на десять-двадцать объём вырастет. Если будем сохранять тайлы с глубиной цвета 24 бита, а не восемь — ещё больше места израсходуем. Получается, что средних размеров российская область может занять своими тайлами десятки гигабайт. И скрипт бы безуспешно пытался эти десятки получить.

Переписал:
-my $tiles = $dbh->selectall_arrayref(
-    'SELECT * FROM tiles',
-    { Slice => {} },
-);
-
-foreach my $tile ( @$tiles ) {

+my $sth = $dbh->prepare('SELECT * FROM tiles');
+   $sth->execute;
+
+while ( my $tile = $sth->fetchrow_hashref ) {

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

Вывод: не всегда надо экономить рабочее время программиста — иногда надо и о машинном времени задумываться.

http://shoorick.ru/2015/08/26/more-code/
shoorick: (Рыжий)
На сайте Ильменского фестиваля теперь используется правильная карта — её можно двигать и масштабировать, включать отображение нужных маркеров и кликать по ним, чтоб получить подсказку.

Карта

Карта — OpenStreetMap, стиль отображения — свой собственный на основе OSM Bright, отрисованный с помощью TileMill, иконки — The Map Icons Collection. Библиотека для отображения — Leaflet c плагинами Leaflet-hash и Leaflet.fullscreen.

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

http://shoorick.ru/2015/07/04/interactive-map/
shoorick: (Рыжий)
Когда я пробовал рисовать позиционную физическую карту, не сильно парился о точности соответствия цветов тем, что используются на остальных картах — тыкать пипеткой в соседние карты не хотелось. Приблизительно попал — и ладно, потом подправлю. Однако товарищи вики-географы не дремлют, шлют ссылки на правильные палитры. Хорошо, попробуем исправить.
Цифры и перловый код )
Эти цвета не такие насыщенные как те, что получились сначала. Южный Урал в этой палитре получается таким:

Рельеф Южного Урала
http://shoorick.ru/2014/10/31/relief-united-colors/
shoorick: (Рыжий)
Пару лет назад я пробовал рисовать карты из данных OpenStreetMap при помощи Maperitive — и даже что-то говорил об этом в докладе на UWDC-2013. Что понравилось ещё тогда — возможность «из коробки» отображать рельеф: Маперитив умеет сам ходить в сеть за открытыми данными о рельефе (SRTM) и потом строить из них контуры горизонтали и рисовать отмывку.

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

У меня не получилось сразу в Маперитиве получить карту такого вида как мне надо: реки текли поверх водохранилищ и водоёмы никак не хотели с административными границами сочетаться. Потратив немного времени на чтение документации и безуспешные эксперименты, пошёл другим путём: сделать пару отдельных карт — с границами и водами — да и собрал их воедино в Inkscape. Маперитив умеет экспортировать карты в SVG. Вот уменьшенный фрагмент того, что вышло:

Север Нязепетровского района

Шаблон с картой лучше делать не по инструкции — там образец неправильный. Лучше взять за образец какой-нибудь существующий шаблон и слегка его поменять: надо изменить координаты границ карты, её названия и имена используемых файлов. Если речь идёт об изготовлении карты актуального состояния существующей местности (то есть, мы рисуем не историческую карту и не карту вымышленного мира), то имеет смысл нарисовать несколько карт одной и той же области, хотя бы две: физическую и политическую/административную — википедия позволяет выбрать нужную карту из шаблона как вручную, так и автоматически: например, в географических статьях (о реках, озёрах, горах) автоматически отображается физическая карта, если она есть.

Пример статьи с этой картой — Шемаха (приток Уфы). В статье Шемаха (Челябинская область) используется тот же самый шаблон, но карта там уже другая — административная.
http://shoorick.ru/2014/10/28/map-with-relief/
shoorick: (Рыжий)
В марте я рисовал для википедии челябинскую трамвайную схему при помощи TileMill, однако как выделить трамвайные пути самим тайлмиллом, я не знал. Пришлось тогда экспортировать схему в SVG и затем редактировать полученный SVG-файл в Inkscape, вручную выделяя нужные рельсы и меняя им внешний вид.

На самом деле в том, чтоб TileMill нарисовал трамвайные пути, нет особо хитрой магии. И сейчас расскажу, как нарисовать их, не беря в руки красный маркер )
Результат:

Схема трамвайных путей

Для того, чтоб убедиться в работоспособности метода, этого вполне достаточно.

Бросается в глаза отсутствие подсветки на мостах — связано это с тем, что слой #bridge находится выше, чем #roads_high. Возможный способ решения — завести свой слой железных дорог (а для этого надо уже́ лезть в imposm-mapping.py, но теперь это не страшно), поместить его выше слоя с мостами и написать для железнодорожного слоя свои стилевые правила.
http://shoorick.ru/2014/10/07/tram-sshema-tilemill/
shoorick: (Рыжий)
Итак, после предыдущих упражнений здания на нашей карте обзавелись номерами и высотой. Что дальше? Дальше можно, например, раскрасить здания в разные цвета. Можно раскрасить дома в зависимости от основного их предназначения (то есть, в зависимости от содержимого тэгов amenity и building). Можно — в зависимости от принадлежности здания.

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

Сделаем то же самое на карте OpenStreetMap )
Результат:
Карта с разноцветными домами
http://shoorick.ru/2014/10/06/building-color/
shoorick: (Рыжий)
Продолжаем эксперименты с обработкой карт напильником. В прошлый раз удалось добавить на карту номера домов — сегодня попытаемся сделать дома чуть выше.

С одной стороны в CartoCSS есть свойство building-height, описывающее «высоту» зданий — это видно на крупных масштабах (от 17). В OSM Bright величина building-height постоянна, что даёт на карте здания одинаковой высоты.

Карта

Но нас это не устраивает — мы сделаем по-другому )

Результат:

Карта OSM со зданиями разной высоты

В следующий раз мы рассмотрим способ раскраски зданий в разные цвета.
http://shoorick.ru/2014/10/04/more-levels/
shoorick: (Рыжий)
На карте, отрисовываемой из OpenStreetMap стилем, основанным на OSM Bright, нет номеров домов. Попытки на скорю руку сочинить какой-нибудь стиль, заглядывая в нагугленное, не увенчались успехом — пришлось разобраться подробнее. Выяснилось следующее: одним редактированием стилевого файла не обойтись, надо ещё и внести данные в базу.

И как же это сделать )
Результат — susu.ac.ru/ru/about/campus

Картографические данные © Участники OpenStreetMap http://osm.org/
http://shoorick.ru/2014/09/05/how-to-add-house-numbers/
shoorick: (Рыжий)
С недавних пор JOSM перестал запускаться под шестой явой — для его работы нужна Java версии не ниже 7. Это не стало сюрпризом — в конце концов, об этом уж несколько месяцев как предупреждают. Сюрпризом стало другое: вместо того, чтобы просто тихо проигнорировать шестую яву, JOSM упорно пытается использовать её, если находит. И падает. С точки зрения обычного пользователя — молча и непонятно. С точки зрения вооружённого терминалом — нормально падает, не молча: вот так )
shoorick: (Рыжий)
«Новый регион» сообщает:
7 мая с 19 до 22 часов будет закрыто движение по проспекту Ленина от Свердловского проспекта до улицы Свободы и по улице Воровского от Свердловского проспекта до проспекта Ленина.

9 мая движение будет закрыто с 10 часов утра и до окончания парада (примерно до 13 часов 30 минут) на участках:
– по проспекту Ленина от Свердловского проспекта до улицы Свободы;
– по улице Тимирязева от Свободы до Свердловского проспекта;
– по улице Воровского от Тимирязева до проспекта Ленина;
– по улице Цвиллинга от улицы Карла Маркса до проспекта Ленина.

На время праздничного фейерверка движение будет закрыто с 20 часов до 23 часов 30 минут на участках:
– по улице Цвиллинга от проспекта Ленина до улицы Труда;
– по улице Кирова от улицы Труда до проспекта Победы;
– по улице Братьев Кашириных от улицы Северо-Крымской до улицы Российской;
– по Свердловскому проспекту от проспекта Победы до проспекта Ленина;
– по улице Труда от улицы Российской до Свердловского проспекта.
Несмотря на заголовок, никакой схемы в новости нет. Придётся сделать самому. Красным отмечены перекрываемые участки.



http://shoorick.ru/2014/05/07/no-traffic/
shoorick: (Рыжий)
Когда-то для статьи «Челябинский трамвай» в википедии я нарисовал поверх какой-то карты схему маршутов, простенькую, куда проще бирмановской. Нарисовал, выложил нарисованное (без карты, только схему) в векторном виде, да и забыл — пить-есть не просит.

Прошло шесть с половиной лет, OpenStreetMap развился до состояния, когда на карты некоторых районов уже можно стало смотреть без слёз. «Почему б не попробовать схему с картой из OSM?» — подумал я. И попробовал.

Сначала был TileMill (я год назад о нём рассказывал на UWDC) — можно, например, сделать свой картостиль, основываясь на OSM Bright. Карта получается достаточно симпатичной и её внешний легко настраивается — в тайлмилле используется CSS-подобный язык разметки. Однако добавить на карту трамвайные маршруты не получилось — в OSM Bright трамвайные пути и железные дороги отображаются совершенно одинаково. Это, наверное, можно изменить, поковырявшись в настройке, но скрипты преобразования геоданных написаны на питоне, в котором я почти ничего не понимаю. Поэтому пришлось добавлять трамвайные линии вручную. Результат —

Трамвайные маршруты Челябинска

Попробовал альтернативный способ — alaCarte. В alaCarte оказалось возможным сразу выделить трамвайные пути, и, кроме того, alaCarte создаёт набор тайлов, без лишней обработки пригодный для использования с библиотеками OpenLayers и Leaflet.
Схема трамвайных маршрутов

в виде интерактивной карты — http://tile.susu.ac.ru/tram.html, используемые стили скоро будут на гитхабе. Stay tuned!
shoorick: (Рыжий)
Для вставки использующих библиотеку Leaflet подвижных карт на сайт, работающий под управлением вордпресса, есть разные пути: можно, например, вставить нужный HTML-код прямо в текст страницы — оно будет работать (вот пример), но ковыряться в коде каждый раз, когда нужна карта — неудобно. Такой метод подойдёт лишь тогда, когда надо вставить одну карту и забыть о ней.

Если же карт много, можно воспользоваться монстрообразным плагином Leaflet Maps Marker — он многое умеет, но страшен. Меня пугает обилие кнопочек, ссылочек и призывов перейти на платную версию.

Нужен способ, позволяющий в удобном виде описывать карту и куда-нибудь эту карту вставлять. Питерский осмер Илья Зверев несколько дней назад написал библиотеку MapBBCode для встраивания карт на форумы. На форумах для форматирования текста часто используют команды разметки вида [tag]text[/tag], действующие аналогично тэгам языка HTML, основное их отличие, бросающееся в глаза — квадратные скобки вместо угловых. Подобный код используется и для описания карты в MapBBCode.

Такие же коды применяются и в вордпрессе — с их помощью можно, например, вставлять на страницы аудиозаписи, видеоролики, фотогалереи — подобная функциональность есть в могучем плагине Jetpack. Можно и карты вставлять — так сделано в уже упоминавшемся Leaflet Maps Marker.

Я попробовал минувшей ночью написать свой плагин — получилось. Теперь для того, чтоб вставить карту, достаточно написать
[map]55.16473,61.32601[/map]

вместо этого кода отобразится карта.

Исходный код — https://github.com/shoorick/mapbb-wordpress, ZIP-архив — https://github.com/shoorick/mapbb-wordpress/archive/master.zip.
shoorick: (Рыжий)
Ездил ночью под дождём в Чурилово. Ну и где эта ваша Дорожная революция™? Лужи, ямы, отсутствие указателей, а местами — непролазная грязь. Доро́г — нет.

P. S. OpenStreetMap оказался точнее ДубльГИСа, хотя, как всегда, неидеален.
shoorick: (Рыжий)
Наконец-то удалось запустить карту велошатаний — http://shoorick.ru/lj/map/bike.html
Масштаб выбирается автоматически, в зависимости от натянутого на карту трека.

Карта

На карту, отображаемую библиотекой Leaflet, можно накладывать разные слои. Среди таких слоёв может быть и слой с треками в формате GPX или KML — его можно наложить с помощью соответствующего плагина, входящего в leaflet-plugins.

В процессе подготовки к UWDC-2012 я подготовил трек, попытался натянуть его на карту — не заработало. Чтение логов и гугление показало, что Google Chrome не даёт яваскрипту читать локальные файлы, если веб-страница получена с локального ресурса (то есть, её URL начинается на file://), а не по HTTP. Выходов несколько: либо заливать карту на сервер и отлаживать там (что, в общем, не представляет сложности, когда есть sshfs), либо поднимать простенький сервер прямо на рабочем месте. Подобных серверов — вагон и маленькая тележка. Думаю, одних только перловых серверов на моём ноутбуке явно больше одного. Увидел на stackoverflow способ запуска простого HTTP-сервера на питоне:
python -m SimpleHTTPServer 8000
Проверил — работает.
shoorick: (Рыжий)
  1. Все побежали — и я побежал.
    Ну что ж, попробуем вспомнить, что было в уходящем году:
  2. Город, семья, место работы, предпочитаемые языки — без изменений. Стабильность™
  3. Исполнилось 10 лет моему ЖЖ. Писать стал гораздо реже: в 2002 году трудно было найти день, когда б ничего не появлялось, сейчас дней без ЖЖ — больше половины. Если сравнить число постов (ну, скажем, за май) — оно сократилось почти в пять раз. С одной стороны, лень писать. С другой — существует твиттер, куда можно мусорить мелочью.
  4. Пробовал водить чужие советские пепелацы — вроде, всё знакомо, но после Тойоты уже некомфортно. В итоге купил свой — подержаный европейский леворульный короткий высокий вместительный белый легковой универсал. За полгода проехал почти десять тысяч километров.
  5. После одиннадцатилетнего перерыва снова оказался на Мастрюковских озёрах в Самарской области — Грушинский фестиваль успел расколоться, мы очутились на «Платформе». Прошёл две тысячи километров по М5, в горах на ней привычнее и спокойнее, чем в степях. Впервые побывал в Тольятти. Покатался и погулял по Самаре (не только в районе вокзала). Посетил самарский метрополитен (восьмой по счёту после московского, петербургского, нижегородского, новосибирского, екатеринбургского, строящегося челябинского и действующего парижского). Увидел дорогу с реверсивным движением.
  6. Продолжаю рисовать карты OpenStreetMap. Стал активнее использовать OSM для навигации, поставив на телефон OsmAnd — в наших краях OSM уже может выступать конкурентом Навителу. Скатился в рейтинге осмеров Челябинской области с первого места на третье, но ничуть не страдаю — пусть молодёжь рисует!
  7. Впервые выступил на UWDC как докладчик — чего только не сделаешь, чтобы не платить за вход. Рассказал про перл и Mojolicious. В 2013 году расскажу про OpenStreetMap. На Перлбурге тоже выступил пару раз.
  8. Почти половину лета прожил на берегу Тургояка. Предпоследний раз искупался 29 сентября (без бани), окончательно закрыл купальный сезон 18 ноября (с баней).
  9. В целом — нормально, но хочется бóльшего. Будем стараться.
shoorick: (Рыжий)
Решил как-то написать робота, чтоб он следил, не появилась ли на OSM очередная порция пригодного к обрисовке спутникового снимка Bing высокого разрешения. Попутно выяснил, что можно легко вычислить номера кусочков снимка (и путь к файлу с картинкой), используемого в OSM — под это, что неудивительно, на CPAN есть модуль Geo::OSM::Tiles. Но на maps.bing.com нумерация другая: адрес тайла фрагмента задаётся не тремя числами, как в OSM (масштаб, смещение по горизонтали и вертикали), а одним длинным числом, где замечательным образом смешано всё. Впрочем, вооружившись отладчиком браузера, вполне можно понять принцип, по которому строится это число. Соответствующего модуля на CPAN я не нашёл — значит, надо реализовать самостоятельно.

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

Цифры )

Profile

shoorick: (Default)
shoorick

December 2016

S M T W T F S
    1 23
45678910
11121314151617
18 19 2021222324
25262728293031

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 14th, 2025 05:22 pm
Powered by Dreamwidth Studios