ShadowBael

ShadowBael

Инди-разработчик
На Пикабу
Дата рождения: 1 января
170 рейтинг 1 подписчик 0 подписок 3 поста 2 в горячем
45

Считал, где летом тень, — а получилась карта, где зимой искать солнце⁠⁠

Зимой тени в Москве больше, чем летом, — а солнца меньше. В январе даже в самый светлый час солнце есть только на 43 % улиц.

Я посчитал, где в Москве тень — по геометрии, а не на глаз. Задача была летняя: в жару идти по теневой стороне. Но тот же расчёт отвечает и на обратный вопрос — где солнце, когда его мало.

15 января, 13:00. Чёрные полосы — посчитанные тени зданий и деревьев, золото — солнце. В самый светлый час зимы солнце есть только на 43 % улиц.

15 января, 13:00. Чёрные полосы — посчитанные тени зданий и деревьев, золото — солнце. В самый светлый час зимы солнце есть только на 43 % улиц.

Коротко, что было в первом посте

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

Взял все дома внутри ТТК — 43 648 штук — и все деревья, 21 476. Высоты взял просто: где в OSM указана этажность, умножил число этажей на три метра; где указана настоящая высота — взял её. Дальше для каждого часа посчитал, где стоит солнце, и сдвинул каждый контур по земле вдоль тени. Потом наложил это на дорожный граф — 331 тысяча рёбер — и у каждого ребра получилась доля тени на этот час.

Летом выходит так: 15 июля в час дня в тени 19 % улиц, к восьми вечера — 77 %. Вечером в тени больше трёх четвертей города, и это ожидаемо.

Дальше — то, чего в первом посте не было

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

15 октября: в восемь утра в тени 75 %, в полдень — 39 % (на солнце 61 %), в пять вечера — 89 %, за полчаса до заката.

15 октября: 9:00, 13:00 и 17:00. К вечеру тень накрывает почти весь район.

15 октября: 9:00, 13:00 и 17:00. К вечеру тень накрывает почти весь район.

15 января: в девять утра в тени 98 %. В полдень — 58 %, в два часа — 62 %, в четыре — 91 %. Самое светлое — 12 и 13 часов, и даже там на солнце только 43 %.

15 января: 9:00, 13:00 и 16:00. Светлое окно — только около полудня.

15 января: 9:00, 13:00 и 16:00. Светлое окно — только около полудня.

Причина в высоте солнца. В январе в полдень оно поднимается на 13 градусов — дом в 20 метров бросает тень длиной 86 метров. В июле солнце на 56 градусов, и тень у того же дома — 14 метров. Разница в шесть раз: вот и весь январь.

И дело не только в процентах. Летом в полдень на солнце 81 % улиц, и так почти весь день. В январе солнце есть на 43 %, и только два часа около полудня — в два уже меньше.

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

Так у карты появился второй режим. Летом по умолчанию «в тень», примерно с 20 сентября по 20 марта — «на солнце». Считается так же, только вес ребра идёт по доле солнца: небольшой крюк — и вместо тёмного проходного двора освещённый бульвар.

Маршрут «на солнце» 15 января в 13:00: 1,82 км, 22 минуты, 86 % пути на солнце.

Маршрут «на солнце» 15 января в 13:00: 1,82 км, 22 минуты, 86 % пути на солнце.

Отсюда и закат в расчёте. В январе солнце живёт с 8:50 до 16:28, но толку от него часа три, примерно с 11 до 14: в девять утра тень у 98 % улиц, в четыре дня — у 91 %. Дальше темнеет, и вопрос «в тень или на солнце» снимается сам.

Что расчёт не учитывает:

  • Рельеф — Москва не плоская.

  • Тень одного дома на другой — считается только на землю.

Это всё геометрия, и её при желании можно досчитать.

А облака к геометрии отношения не имеют. Расчёт отвечает на вопрос «где тень, если небо ясное»; в пасмурный день тени на асфальте нет, и посчитать её нельзя — это погода, а не формула. Так что все проценты в посте — про ясный день.

И «на солнце» не значит «тепло»: в январе это про свет, а не про градусы.


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

И вопрос напоследок, раз уж про ветер. Стоит ли делать карту ветров? Зимой промозглый ветер мешает, кажется, не меньше, чем нехватка солнца — но насколько сильнее, без вас не пойму. Напишите, в каком районе живёте и насколько для вас это важно: если тема живая — посчитаю.

Ссылку на карту с тенями и маршрутами кому интересно скину.

Показать полностью 4
41

Вчерашний пост обрезался на середине. Вот он целиком: тени в Москве по часам — от 20 % до 80 %⁠⁠

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

Началось с ерунды. Каждое лето одно и то же: выходишь из метро в три часа, солнце в лицо, и весь ход стараешься идти по теневой стороне. В тени не протолкнуться. И я подумал: а если посчитать сколько всей улицы реально в тени?

Взял все дома внутри ТТК — 43 648 штук — с высотами, все деревья (21 476), и посчитал, где солнце в каждый час. Тень от дома — это его контур, растянутый по земле в сторону от солнца. Солнце ниже — тень длиннее. Потом сложил все улицы в одну линию и посмотрел, сколько её в тени.

15 июля вышло так: в восемь утра — 40 %, в полдень — 20 %, в четыре дня — 31 %, в шесть вечера — 49 %, в восемь — 80 %.

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

А самое неочевидное — ширина улицы. На проспектах в полдень в тени всего 1,7 % длины: тень от домов не дотягивается до середины. В дворовых проездах — 25 %, на пешеходных дорожках — 19 %. Разница в 14 раз: стоишь на широкой улице под солнцем, а во дворе рядом — тень.

Зимой всё переворачивается. 15 января в полдень в тени 58 % улиц, а в девять утра — 98 %. За весь световой день 19 % улиц не видят солнца ни разу. И наоборот: целиком на солнце остаётся 1,1 % — каждый сотый метр. Так что зимой правильный вопрос не «где тень», а «где солнце».

Дальше было просто: дал каждому переулку вес по доле тени и пустил по нему поиск пути. Маршрут от Красной площади до Покровки в шесть вечера — полтора километра, и почти весь он в тени. В прошлый раз я написал, что это на 22 метра длиннее прямого: 22 метра — это один такой маршрут, а не правило. По городу в среднем крюк выходит около 10 %, а тени на пути становится 77 % вместо 51 %.

Из этого и собрался Shadow Moscow. Смысл простой: карта, на которой видно, где тень, и маршрут, который её обходит. Летом — в тень, зимой — на солнце, где теплее. Любая дата вперёд, любой час, дома в 3D, кафе по дороге, GPX и ссылка на маршрут. Бесплатно и без регистрации.

Гонял его по своим обычным дорогам: крюк небольшой, а солнца на голову меньше.

А у вас во дворе есть место, где летом вообще нет солнца? Скиньте адрес — посчитаю.

Следующий пост будет уже про зиму. Уже сейчас чувствуется нехватка солнца.

Показать полностью 3

Тень можно посчитать точно. Рассказываю, как это работает и на какие грабли я наступил⁠⁠

Разбирался с простым вопросом: можно ли пройти по городу так, чтобы всё время быть в тени. Оказалось, задача решается — но не «на глазок», и по дороге я собрал коллекцию грабель, о которых в туториалах не пишут. Ниже — механика, цифры и честный список того, где расчёт врёт.

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

Что на входе. OpenStreetMap внутри ТТК: 43 648 зданий и 21 476 деревьев, у каждого — высота (где её нет, берётся этажность × 3 м, у деревьев — 10 м и диаметр кроны). Плюс дорожный граф: 331 тысяча рёбер, каждое — участок улицы с длиной и классом.

Как считается тень. SunCalc даёт высоту и азимут солнца на любую дату и час. Тень дома — это его контур, сдвинутый по азимуту на h / tan(α) и протянутый вдоль смещения: сумма многоугольника основания и отрезка, то есть операция Минковского. Никакой трассировки лучей — для плоского основания это точное построение и оно в тысячи раз быстрее.

Дальше начинается боль. Объединять 65 тысяч полигонов в один слот надо через JTS: turf давал самопересечения и дыры. JTS с PrecisionModel(1e6) и snap-rounding справляется, но иногда отдаёт артефактные дырки — их приходится вырезать.

Грабли № 1: 11 слотов из 247 вышли файлами по 42 байта. На самопересекающихся полигонах GEOS падает с TopologyException, а ogr2ogr при этом возвращает код 0 — то есть «успех» с пустым результатом. Заметил только когда стал проверять размер файла. Лечение — три ступени: обычный union, потом union с MakeValid, и в крайнем случае копия исходных полигонов; плюс правило «меньше 1 КБ — битый, пересобрать».

Грабли № 2: тени накладываются. Полигоны лежат по отдельности, и там, где их пять, получается не «тень», а почти чёрное пятно. Замерил растеризацией: в утренние слоты 87 % площади накрыты два и более раза, максимум 37 слоёв, в среднем 4,3; в полдень — 9 %. Утро и вечер выглядели темнее, чем есть. Лечение — dissolve: объединение всех теней слота в одну геометрию. Площадь тени не изменилась ни на 0,1 процентного пункта, данные 6,2 ГБ стали 1,9 ГБ, тайлы 2,73 ГБ — 0,70 ГБ.

Как из тени получается маршрут. Каждому ребру графа — доля тени на каждый час и дату, между часами интерполяция. Стоимость ребра = длина × (1 − 0,7 × «сколько тени»), дальше обычный A*. На 150 тестовых маршрутах доля теневых метров выросла с 51 % до 77 % при удлинении пути на 9,5 %. То есть примерно 4 % лишней длины за каждые 10 процентных пунктов тени.

Грабли № 3: производительность и версии данных. Одна дата — 43 МБ JSON, полсекунды парсинга на первый запрос. Перепаковал в бинарный формат (Float32Array): 16,4 МБ и 8 мс. Но бинарник привязан к числу рёбер графа: локально 331 851 ребро, на сервере 331 009 — файл молча игнорируется, и маршруты считаются вообще без теней. Карта тени показывает, а маршрут их не учитывает. Такую ошибку не видно по «упало / не упало», только по цифрам в ответе.

Где врёт: 1) высоты в OSM местами выдуманы; 2) рельеф не учитывается, а Москва не плоская; 3) тень одного дома на другой дом не падает, только на землю — плотные дворы выглядят светлее, чем есть; 4) стена считается нулевой толщины; 5) облака не учитываются вовсе: в пасмурный день все эти красивые полигоны — про геометрию, а не про реальность. Это про порядок величин, а не про ваш двор до сантиметра.

Что вышло по Москве (считал по длине улиц, а не по площади). Полдень 15 июля — 17 % в тени, 18:00 — 49 %, 20:00 — 80 %. Полдень 15 января — 58 % в тени, 9 утра — 98 %. За весь световой день 19 % улиц не видят солнца ни разу, целиком на солнце — 1,1 % пути, каждый сотый метр. И разброс важнее средних: в январский полдень магистрали в тени на 32 %, а пешеходные зоны — на 63 %.

Главный вывод: вопрос не «где тень», а «где тень в тот момент, когда я там окажусь». Поэтому считаю не «сейчас», а на конкретную минуту: сдвигаешь время — и тень под ногами уже другая.

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

UPD. Пост вышел сырым: при публикации движок отдал только первый абзац, картинки не прикрепились, да и залил я его не с того аккаунта. Кто минусовал за пустоту — вы были правы, извините за мусор в ленте. Полный текст теперь на месте, кадры карты добавил.

Показать полностью 2
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества