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


Вот и известному блоггеру Илье Варламову тоже так показалось, поэтому он запустил крутейший проект c вызывающим названием БДСМ, а имеенно "Большая Дорога С Мэром" (ссылка на анонс):


Хватит гулять по российским городам в одиночестве – пора приглашать мэров, губернаторов, сити-менеджеров.

Правила просты.

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

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


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


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


О том, как я эту задачу решал и какие открытия преподнесли мне такие города как Иваново или Киров — под катом.


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


Идея


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


Изначально требования к точкам были такие:


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

Потом в ходе разработки добавилось еще одно требование: сервис должен уметь взаимодействовать с хардверной Большой Красной Кнопкой, вот такой:



Кнопка просто посылает сигнал клика мышкой на подключенный компьютер


Вся сложность была в том, как составить этот маршрут так, чтобы с одной стороны избежать совсем уж дебрей, а с другой — все-таки охватить возможными точками все районы города, а не только несколько "приличных" кварталов в центре. При этом изначально у меня был некий сформированный набор стереотипов в голове, являющихся следствием того, что я сам живу в Санкт-Петербурге, кроме того из более-менее крупных российских городов был только в нескольких миллионниках типа Москвы и Казани. Вот только проект в основном концентрировался на городах с населением 200-500к человек (видимо мэры более крупных городов слишком заняты, чтобы ходить по улицам). В общем я в очередной раз получил подтверждение тезиса что "Москва — не Россия". Все соображения ниже — неверны:


1) Многоэтажные дома в центре, а промзоны и частные дома на окраине.
2) Хотя бы есть разделение по кварталам — в одном квартале только многоэтажки, в другом — только частные дома. Ну кто будет строить хрущевку среди деревянных изб?
3) Территория города представляет собой один простой полигон на карте, внутри которого находятся все здания
4) Ладно, в полигоне могут быть дырки, но он хотя бы один
5) Ну ладно, не один но хотя бы не более двух несвязанных кусков
6) Города в OSM данных размечены соответствующими тегами landuse и выбрать жилые районы будет просто


В общем, пришлось походить по граблям.


Алгоритм выбора точек


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


Поскольку для прогулки нужна не произвольная точка, а та, до которой можно дойти пешком, я решил брать точки только вдоль дорог. В итоге мой алгоритм берет все OSM-ные дороги (Way с тегом highway и значениями, соответствующими пешеходным дорогам и тротуарам), разбивает слишком длинные ребра добавляя промежуточные точки (так чтобы соседние точки на одном ребре были друг от друга не более чем в ста метрах), затем удаляет точки которые оказались слишком близко друг от друга (ближе 50 метров), например на нескольких параллельных дорогах.



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


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


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


Для этого я решил пойти простым путем, и просто размечать центр города вручную. Добавил загрузку полигонов в GeoJSON, которые я редактировал с помощью очень удобного сайта geojson.io (серьезно, если вам надо в вашем проекте работать с простой 2д геометрией, то geojson.io позволяет очень быстро все сделать и не париться с созданием своих редакторов или с использованием всяких тяжеловесных ГИС-приложений).



Размеченный Киров, с отмеченным центром (желтый), удаленными вручную областями (красный) и добавленным кусочком (зеленый)


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


Частный сектор


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


Борьба с этими кварталами заняла бОльшую часть времени. Сперва я попробовал обойтись чисто OSMными данными. Есть специальное значение тега residental=rural для обозначения сельской местности и landuse=allotments для всяких садоводств.



Да, даже в Санкт-Петербурге есть встроенные садоводства в городской черте


Однако быстро выяснилось, что эти теги ставят довольно редко, и обычно удовлетворяются только самым общим landuse=residental (жилая территория).


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



Частные и многоквартирные дома густо перемешаны друг с другом всего в паре кварталов от центра


Пришлось придумывать эмпирический алгоритм. Я брал квартал (область landuse=residental, хотя прямого требования к ее использованию нет, обычно ей отмечают не весь город или район, а отдельные кварталы), брал все здания в его границах (полигоны с тегом building) и считал среднюю площадь такого полигона. Если выходила меньше 400м2 (цифра взята с потолка, с условием грубости разметки и подсчетов и встречающихся в таких кварталах отдельных длинных домов) то квартал считался частным сектором и из подсчетов выкидывался.


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


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



Типичный пейзаж Евпатории в паре сотен метров от берега моря


Специально для таких случаев пришлось добавить в GeoJSON не только удаленные вручную сектора города, но и добавленные вручную. Т.е. даже если квартал не попадал под другие условия, он все равно включался в список доступных для поиска точек.


Промзоны и коммерческие площадки


С промзонами все гораздо проще чем с частным сектором. Как правило они уже размечены тегом landuse=industrial и с ними проблем нет. Разве что есть некоторые исключения, когда размечены не кварталы целиком, а отдельные здания. Но поскольку я в проекте использовал уже готовый код работы с картами из Sight Safari, там уже это учитывалось.


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


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


Картографические внезапности


Хоть у меня уже и был определенный опыт работы с OSM, все равно постоянно всплывало что-то новое.


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


Много наркомании нашлось в границах городов. Я-то по своей наивности думал, что граница города — это всегда простая замкнутая ломаная линия. Ан нет.


Есть города с дырками. Например Обнинск. То есть вот реально кусок внутри города административно ему не принадлежит.



Обнинск с дыркой


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



Киров состоит из трех несвязанных областей


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


Проблемы с разметкой карт


Пара слов про разметку OSM.


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


Однако на мой взгляд сила OSM — именно в возможности машинной обработки больших объемов данных, типа того что делал я тут или в Sight Safari. Просто карт в интернете много, а вот карт с возможностью выкачать всю геометрию и теги и свободно использовать в своих алгоритмах я больше не знаю. И вот как раз для таких целей эти теги начинают играть важное значение. Так как почти всегда задачи выглядят как "найдите что-то там в районах определенного типа", а тег landuse — первый и самый простой способ определить и найти нужные районы.


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


В общем ставьте теги, господа! Ну пожалуйста!


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


Так куда же я все-таки отправил мэра?


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


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


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

image


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

Ну и наконец вышла первая серия на канале, можно смотреть.



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


Заключение


Работа над этим проектом оказалась интересной. Не выходя из дома я отправился в небольшое путешествие по городам своей страны, излазил их с лупой во всех возможных картах и познакомился с местным картографическим колоритом. Попутно еще доработал код Sight Safari.


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


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


В ходе подготовки проекта активно использовался код и опыт проекта Sight Safari — навигатора для поиска туристических маршрутов.


Ну и напоследок: как вы думаете, полезная ли это инициатива — такие прогулки с мэрами? Изменят ли они что-нибудь? Какие вопросы вы бы задали мэру своего города?

Комментарии (29)


  1. cgnrat
    01.11.2018 13:52

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


    1. JediPhilosopher Автор
      01.11.2018 14:02

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

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


      1. cgnrat
        01.11.2018 14:14

        Я что-то даже и не сообразил, что дело может происходить на десктопе. :) Сразу начал фантазировать ble и прикручивание этого дела к платформе.

        Тогда понятно, спасибо!

        Там нотбук видно да. Затмение какое-то )


      1. staticlab
        01.11.2018 14:51

        я это пофикшу как-нибудь и сделаю реакцию именно на нажатие, а не на клик.

        onmousedown?


        1. JediPhilosopher Автор
          01.11.2018 14:56

          Ну видимо да.


      1. Sabubu
        01.11.2018 18:14
        +2

        Лучше бы слать не клик, а нажатие клавиши? А то можно кликнуть например на крестик в окне браузера так.


        1. JediPhilosopher Автор
          01.11.2018 18:27
          +2

          Браузер открывается на полный экран. Интерфейс весь прячется. Ну и курсор устанавливают на какое-то подходящее место.


  1. Vsevo10d
    01.11.2018 15:48
    +2

    Есть города, состоящие из нескольких несвязанных областей, такие как Киров


    Ну так-то и у Москвы есть подобная дичь, например Конезавод ВТБ


    1. JediPhilosopher Автор
      01.11.2018 15:52

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


  1. 1delovoj1
    01.11.2018 16:30

    Видимо Филонов подольше подержал для фиксации процесса камерами.


  1. fotofan
    01.11.2018 18:14
    +2

    А можно московского мэра никуда не посылать? А то полгорода встанет. Шоу то шоу, но ожидаемо «незаметно» перекроют все соседние улицы


    1. JediPhilosopher Автор
      01.11.2018 18:46
      +1

      Надо просто маршрут в секрете держать, чтобы не знали что перекрывать. Да и зачем их перекрывать, если маршрут пешком, а не на машине?


      1. fotofan
        02.11.2018 14:35

        Да и зачем их перекрывать, если маршрут пешком, а не на машине?

        затем что тов Собянин оставил при себе привычную ему ФСО со всеми вытекающими (для окружающих) последствиями


  1. sshikov
    01.11.2018 20:27
    +3

    >серьезно, если вам надо в вашем проекте работать с простой 2д геометрией, то geojson.io позволяет

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


  1. stasiche
    01.11.2018 21:11

    Статья очень хороша с точки научной точки зрения. Но с чисто прикладной стороны. не легче ли было сделать инструмент, где бы было удобно накликать пару-тройку (-четверку-пятерку) десятков точек вручную, сохранить и рандомить уже по ним? вроде натыкать точек — это дело ну максимум 20-30 минут. просто как-то многова-то эмперики, хотелось бы понять во имя чего.


    1. JediPhilosopher Автор
      01.11.2018 21:13
      +2

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

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


  1. pau
    01.11.2018 21:53
    +1

    Спасибо, классная работа!

    Хочу только заметить, что «разорванность» жилой застройки — дело обычное. Может, местные жители к ней привыкают до полного ее выпадения из поля внимания.

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

    image

    (Карта отсюда, лучше качества нет)


    1. JediPhilosopher Автор
      01.11.2018 21:58

      Ну когда «сразу за пределами исторического центра» — я еще готов понять. Но когда буквально в одном квартале от главной площади уже идут реально сельские кварталы и пейзажи в городе с населением в 200к — к такому я был не готов.


      1. PastorGL
        01.11.2018 22:52

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


        1. Javian
          02.11.2018 06:22

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


          1. JediPhilosopher Автор
            02.11.2018 12:18

            Если речь идет о городе, а не о деревне, то у настолько низкой плотности застройки (частные дома на одну-две семьи) есть свои минусы. Город очень растягивается вширь, расстояния становятся очень большими. Пешеходная доступность страдает. Мелкий бизнес страдает (т.к. опять же в радиусе пешей доступности оказывается слишком мало пользователей для его поддержания). Общественный транспорт страдает, ездит пустым и становится убыточным (большие расстояния и мало народу). Частные дома просто провоцируют использовать автомобили, так как пешком хрен куда дойдешь, а ОТ ходит редко, в итоге растут пробки. Коммуникации (воду, свет) опять же очень далеко тянуть.
            Это все можно увидеть например в этих бесконечных американских субурбиях. Там уже вроде поняли, что такая застройка для города — это была плохая идея с точки зрения оптимальности использования инфраструктуры.

            Все-таки в городе люди должны жить более компактно. 4-5 этажные дома наверное оптимальны в этом плане.


            1. Javian
              02.11.2018 14:40

              «одноэтажная Америка» — это просто образ жизни, к которому можно быстро привыкнуть. Есть недостатки и достоинства. Пока востребована мобильность трудовых ресурсов — коттеджи лучше.
              Для больших стран лучше строить дороги и осваивать не с/х земли.


        1. nfw
          02.11.2018 08:02
          +1

          Причем частные дома стояли и стоят практически прямо напротив городской администрации, но сейчас в том районе они потихоньку уже "сгорают".


      1. staticlab
        01.11.2018 23:19

        А в городе с населением 1М+? https://yandex.ru/maps/39/rostov-na-donu/?ll=39.745905%2C47.225831&mode=whatshere&panorama%5Bdirection%5D=195.345282%2C0.104410&panorama%5Bpoint%5D=39.744872%2C47.225431&panorama%5Bspan%5D=62.486288%2C34.739837&whatshere%5Bpoint%5D=39.744118%2C47.225535&whatshere%5Bzoom%5D=18&z=18


        Позади Театральная площадь — практически главная площадь РнД, на 9 мая именно там проходит военный парад.


        1. JediPhilosopher Автор
          01.11.2018 23:22
          +1

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


  1. Javian
    01.11.2018 22:01
    +1

    офф. Бродил там этим летом. Проект у Варламова хороший. Но видео показывает, что не верьте всему, что говорят мэры :)

    5:07 — Трамвай чешский, 1937 года.

    transphoto.ru/vehicle/4383 Gotha T57. Изготовлен в ГДР, 1958 год


  1. vlivyur
    02.11.2018 11:55

    Делайте валидатор и приходите с ним на форум OSM — там за пару дней накликают уточнения к landuse. Подложки на выбор — bing, mapbox, digitalglobe. У bing'а можно и дату снимков узнать. И сверху полигоны landuse из OSM. Сложнее будет, если никакие landuse не указаны
    Пример тутперенести адреса с открытой системы в OSM.


  1. yefrem
    02.11.2018 13:14
    +1

    Всё бы ничего, но в 14 часов на Сортировке трезвых нет.

    Отлично


  1. philfreeeu
    03.11.2018 20:58

    Может быть можно определять этажность по данным, упомянутым тут: habr.com/post/279833 и из этого определять районы частной застройки (и промзоны по меньшей концентрации жилых домов)