GEOINT #98. Однажды в Мексике
На этот раз Баадер порадовал нас скрином из стритвью какой-то улицы, на первый взгляд ничем не примечательной, кроме разве что какого-то бело-розового объекта. Но опытный геоинтер легко может узнать здесь Мексику, а опытный геогессер даже укажет на примерный регион. Её сразу выдаёт водонапорный бак, там они практически в каждом доме, и столб.
Знак одностороннего движения не типичный мексиканский, а скорее колумбийский, но это явно не крупный город, так что простительно, что нашлось, то и повесили. Также можно заметить другие детали:
- спутниковая тарелка
- отсутствие переднего номера у машины
- велосипед, оставленный без присмотра
- таблички с названием улиц
- дорожное покрытие из бетона
- уклон дороги
- бело-розовый объект оказался стиральной машиной
- кирпичный недострой
- плесень на фасаде здания
- мачта вдалеке за деревьями
- ватермарка гугла 2019 Google в левом верхней углу
- нелинейность снимка
- резкие тени
Остановимся на каждом пункте подробнее.
Ключевые особенности
Стрелка
Вообще мексиканские стрелки выглядят так
Но наша стрелка особенная. Кажется будто наконечник не совсем треугольный, основание треугольника чуть утоплено к вершине, как у колумбийских.
Может это просто особенности восприятия, с такими шакалами не разобрать. В Мексике встречаются разные варианты, хоть и реже.
Редкость таких стрелок может помочь с опознанием города.
Таблички с названием улиц
Взглянем на таблички повнимательнее
Невозможно что-то разобрать, но кажется будто на левой написано длинное слово, а на правой два слова и второе очень короткое - 2-3 буквы. Возможно, второе слово это римское число, такие улицы обычно названы в честь римских пап.
Эту теорию мы проверили через поиск в оверпассе, нашлось достаточно мало перекрестков с такими названиями улиц, но ни один не подошёл.
Внешний вид табличек в разных городах совершенно разный, что также поможет опознать город.
Спутниковая тарелка
Провайдеров спутникового ТВ в Мексике не очень много. Подходящими оказались два варианта.
Тарелка должна быть направлена на спутник Sky-Mexico 1, его проекция на поверхность земли имеет координаты 0.0, -78.8. Можем прикинуть направление тарелки.
Получается, что тарелка направлена на юго-восток. Дорога немного повернута против часовой стрелки относительно направления тарелки и уходит влево. Угол между дорогами не прямой. То есть теперь мы знаем примерные стороны света на снимке - направление съемки обозначено красной стрелкой.
Отсутствие номера
На машине не видно номерного знака, причины могут быть разные. Но была теория, что подержанную машину ввезли контрабандой из США. Это подтверждается ответом на Quora. В связи с этим было высказано предположение, что это какой-то северный штат. Впрочем, оно не нашло дальнейшего подтверждения.
Велосипед
Велосипед на улице не закреплён, возможно это небольшой городок, где все друг друга знают, и владелец не боится, что его украдут.
Дорожное покрытие и уклон
Бетонная дорога хоть и довольно часто встречается, но есть не везде. Это дополнительный фильтр для опознания города. А наличие уклона говорит о гористой местности, плоские города можно пропускать.
Стиральная машина
Стиралка была опознана, как Acros ALF2053ER или ALF1551ER. Выглядят они одинаково, отличаются только размером.
Нашли инструкцию по эксплуатации, в которой была временная метка 08.02.2018. Таким образом делаем вывод, что снимок сделан не раньше этой даты. Можно легко прибавить месяц, вряд ли она так быстро попала на рынок.
Кирпичный недострой
Мы нашли описание особенностей Мексики от геогессера @addlama. Приведём цитату из раздела по архитектуре зданий.
Red brick architecture is highly concentrated west of Mexico City, in the central valley. That is where towns like the image shown are common, alley by alley awash in red brick walls.
Делаем вывод, что наиболее вероятные штаты: Jalisco, Michoacán, Guanajuato, Aguascalientes. И чуть менее вероятные: Durango, Zacatecas, San Luis Potosí, Querétaro, Guerrero, Morelos, Colima.
Плесень на фасаде здания
Плесень говорит о том, что там бывают условия для её роста: высокая влажность, пасмурная погода и дневная температура около 20°C достаточно длительное время. В Мексике таких мест очень много, так что это мало чего даёт. Но при осмотре городов можно обращать внимание, насколько следят за внешним видом зданий.
Мачта
Была теория, что вдалеке мы видим мачту сотовой связи, телевидения или чего-то подобного.
Для проверки решили сделать запрос в оверпассе.
area['name'~'^(Jalisco|Michoacán|Guanajuato|Aguascalientes|Durango|Zacatecas|San Luis Potosí|Querétaro|Guerrero|Morelos|Colima)#39;][admin_level=4]->.a; ( nwr[man_made=mast](area.a); nwr['tower:type'=communication](area.a); ); out center;
Со всех штатов набралось 287 точек, которые нужно было осмотреть вручную.
Плодов эта теория не принесла и отняла достаточно много времени.
2019 Google
От гугла осталось два артефакта, копирайт 2019 Google и маркер плоскости.
После изучения различных стритвью стало понятно, что год в ватермарке может не совпадать с годом съемки, но он точно не меньше. То есть получаем, что дата съемки не позже 2019 года. Вместе со стиральной машиной получаем, что съемка была сделана в период с февраля 2018 по декабрь 2019 года.
Нелинейность снимка
В правой части снимка наблюдается искажение, снимок становится более растянутым по горизонтали. В этом можно убедиться, если сравнить пропорции стиральной машины с её реальными габаритами.
Размеры стиральной машины с сайта производителя 100.4x69 см для ALF2053ER и 91.3x58.5 см для ALF1551ER. Получаем пропорции 69 / 100.4 = 0.69, 58.5 / 91.3 = 0.64. Пропорция на снимке 39.03 / 47.52 = 0.82.
В обоих случаях горизонтальный размер больше, чем в реальности, на 19-28%. То есть стрелка и табличка с адресом не настолько вытянуты.
Тени
Тени на снимке такие чёткие, что грех было не попробовать определить даты по ним. Для этого нужно было узнать азимут солнца хотя бы примерно. Не будем приводить всех расчётов, которые всё равно оказались не верными. Скажем лишь, что азимут был определён по направлению спутниковой тарелки как 104°-111°. А отношение объекта к тени 0.696.
С этими данными в suncalc можно вычислить диапазон подходящих дат, так чтобы тень была примерно длиной 696м для объекта 1000м, а азимут был в пределах 104°-111°.
Получились следующие диапазоны дат и времени съемки.
20 марта - 5 апреля 9:00-10:00
6 сентября - 22 сентября 10:00-11:00
Но так как для этих вычислений было сделано слишком много допущений, мы не стали сильно на них закладываться при поиске.
Обход городов
Мы сформировали основные критерии, чтобы можно было достаточно быстро осмотреть город и решить, подходит он или нет.
На первом этапе мы выгрузили в оверпассе список городов для наиболее вероятных штатов Jalisco, Michoacán, Guanajuato, Aguascalientes с населением от 10 до 50 тысяч человек, так как предположили, что город вряд ли большой (велосипед на улице), а города и деревни поменьше встречались обычно с грунтовками.
[out:csv(name, population, ::id, ::lat, ::lon)]; area[name~'^(Jalisco|Michoacán|Guanajuato)#39;][admin_level=4]->.a; node[place~'^(city|town|village|hamlet)#39;](area.a)(if:t['population']>=10000 && t['population']<50000); out;
Сделали таблицу с общим доступом, чтобы все одновременно могли её заполнять. Для таких целей подошёл сервис ethercalc.net, там есть примитивный, но достаточный функционал электронных таблиц с совместным доступом по ссылке и без какой-либо регистрации. Также на всякий случай добавили туда еще несколько полей, которые могли пригодиться впоследствии:
Идея была в том, чтобы найти похожие города и затем уже тщательно их проверить. Так мы заполнили таблицу для штатов, в которых чаще всего встречаются дома из красного кирпича. К этому моменту самые активные участники могли решить подходит город или нет после просмотра пары перекрёстков, появилось внутренее чутьё. Алгоритм поиска был следующий. Смотрим рельеф на карте и, если он есть, ищем рядом перекресток с односторонней дорогой. Осматриваем стритвью в поисках табличек и стрелок на перекрёстке. В зависимости от увиденного повторяем процесс или переходим к следующему городу.
В общей сложности нами было осмотрено более 200 городов, нашли несколько похожих, но искомого среди них не оказалось.
Анализ неба
Во время обхода городов обратили внимание, что небо бывает разного цвета, и это не зависит от погоды, а зависит от даты съемки. Ниже приведём несколько примеров.
Можно заметить, что в мае 2019 г. цвет неба становится более естественным и голубым. Предположили, что у гугла сменилось оборудование на более качественное. И действительно, оборудование у них менялось, правда в 2017 году, но до Мексики оно могло добраться не сразу.
On September 7, 2017, Google announces the arrival of a new generation of more efficient and precise cameras on the occasion of the 10th anniversary of Street View. This is the 4th generation of cameras, sporting a more refined profile and a blue color.
https://en.wikipedia.org/wiki/Google_Street_View_coverage#Key_additions
На искомом снимке цвет неба более темный, значит он был снят старым оборудованием. Это давало еще одно ограничение по дате: снимок сделан не позднее мая 2019.
Еще обратили внимание, что небо на снимке безоблачное, а значит если на панорамах города есть облака, его можно смело пропускать.
Автоматизация поиска
После исчерпания всех зацепок стало ясно, что дальнейший ручной обход не имеет смысла. Ведь даже если и найдётся случайно ответ, то это произойдёт именно случайно без какой-либо методики. А геоинт без методики поиска уже не геоинт. Поэтому было решено направить усилия на автоматизацию поиска, а ручной поиск свернуть.
Мы решили разработать утилиту, которая принимает на входе OverpassQL скрипт, выполняет его и для найденных точек скачивает панорамы Google StreetView. Пришлось повозиться с реверсингом api гугла, и в итоге утилита была сделана.
В процессе исследования протокола была выявлена закономерность, которая позволяла установить, что снимок снят на старом оборудовании: эти снимки были меньшего формата.
Чтобы не скачивать лишнее, добавили возможность фильтрации по диапазону дат снимков и по формату. Эту информацию можно получить из метаданных без скачивания самого снимка.
Первые попытки
Тестирование утилиты начали со скачивания панорам перекрестков по следующим критериям.
- февраль 2018 - май 2019
- односторонняя дорога с бетонным покрытием
- отсутствие рядом светофора
- штаты Jalisco, Michoacán, Guanajuato, Aguascalientes
- города от 10к до 100к жителей
- старое оборудование
[timeout:10000]; area[name~'^(Jalisco|Michoacán|Guanajuato|Aguascalientes)#39;][admin_level=4]->.a; node[place~'^(city|town|village|hamlet)#39;](area.a)(if:t['population']>=10000 && t['population']<100000)->.cities; way[highway~'^(tertiary|residential|unclassified)#39;][surface=concrete][oneway=yes](around.cities:20000)->.ways; foreach.ways->.this_way{ rel(bw.this_way)->.this_rel; node(w.this_way)->.this_way_nodes; way[highway~'^(primary|secondary|tertiary|residential|unclassified)#39;](bn.this_way_nodes)->.linked_ways; ( way.linked_ways; - ( way(r.this_rel); way.this_way; ); )->.linked_ways_only; node(w.linked_ways_only)->.linked_ways_only_nodes; ( node.linked_ways_only_nodes.this_way_nodes; node.all; )->.all; } node[highway=traffic_signals](around.all:20)->.sig; ( node.all; -node.all(around.sig:20); ); out;
Даже по таким достаточно строгим критериям скачалось более 2500 панорам. Хорошо, что снимков без облаков было на порядок меньше, так что изучить их было реально. И хотя искомый снимок не нашёлся, надежду мы не теряли.
Ради интереса решили узнать, где был гугломобиль в эти даты, и отобразили координаты скачанных снимков на карте.
Получилось всего несколько кластеров и тогда возникла другая идея.
По следам гугломобиля
Решили проверить предположение о том, что в эти даты гугломобиль ездил по каким-то определённым городам. Для этого в утилите сделали скачивание панорам для набора случайных точек в окружности с заданным центром и радиусом. И скачали панорамы городов по следующим критериям.
- февраль 2018 - май 2019
- штаты Jalisco, Michoacán, Guanajuato, Aguascalientes, Durango, Zacatecas, San Luis Potosí, Querétaro, Guerrero, Morelos, Colima
- города от 10к жителей
- старое оборудование
- только панорамы по умолчанию*
*С этого момента мы не скачивали исторические снимки, так как предположили, что нам нужна панорама, которую гугл показывает по умолчанию.
В итоге получилась такая карта, где бывал гугломобиль в эти даты, но больше не приезжал.
Оказалось, что бывал он много где, и эта идея не получила продолжение.
Леон и поиск похожих изображений
Больше всех из осмотренных панорам зацепил пригород на юго-западе Леона, там ощущался довольно похожий вайб.
Поэтому мы скачали все перекрестки Леона с пригородами по таким критериям.
- февраль 2018 - май 2019
- в радиусе 10км от центра Леона
- отсутствие рядом светофора
- старое оборудование
- только панорамы по умолчанию
Скачалось более 3000 панорам, и стало понятно, что проверять каждый раз вручную не очень весело.
Поэтому изучив различные методы поиска похожих изображений, решили воспользоваться методом на основе сравнения гистограмм в цветовом пространстве HSV. Базовый код сравнения можно посмотреть тут
https://docs.opencv.org/4.x/d8/dc8/tutorial_histogram_comparison.html
По сути этому методу всё равно, что изображено на снимке, он не сравнивает образы и не определяет объекты. Он лишь вычисляет корреляцию распределений цветов, при этом работает быстро и толерантен к различным искажениям как масштабирование, перспектива или поворот. Минусы тоже есть, он выдаёт много ложноположительных результатов, но мы постарались минимизировать их количество.
В итоге нужные панорамы не нашлись, но наиболее похожие панорамы по мнению скрипта поиска были такие.
Финал
К этому моменту у нас были все козыри на руках, чтобы запустить полномасштабный поиск по всем перекрёсткам в 11 штатах с домами из красного кирпича. Утилиту дополнительно доработали, чтобы она могла параллельно выполнять несколько запросов в overpass. Так как точек было реально много, запросы по каждому штату выполнялись отдельно. Установили такие критерии для перекрёстков.
- февраль 2018 - май 2019
- штаты Jalisco, Michoacán, Guanajuato, Aguascalientes, Durango, Zacatecas, San Luis Potosí, Querétaro, Guerrero, Morelos, Colima
- старое оборудование
- только панорамы по умолчанию
Пример запроса для штата Jalisco.
[timeout:10000]; area[name='Jalisco'][admin_level=4]->.a; way[highway~'^(tertiary|residential|unclassified)#39;](area.a)->.ways; foreach.ways->.this_way{ rel(bw.this_way)->.this_rel; node(w.this_way)->.this_way_nodes; way[highway~'^(primary|secondary|tertiary|residential|unclassified)#39;](bn.this_way_nodes)->.linked_ways; ( way.linked_ways; - ( way(r.this_rel); way.this_way; ); )->.linked_ways_only; node(w.linked_ways_only)->.linked_ways_only_nodes; node.linked_ways_only_nodes.this_way_nodes; out; }
В результате утилита проверила более 1.5 млн перекрёстков и скачала более 20000 панорам. Вручную такое количество проверить было бы нереально, но скрипт для поиска похожих изображений справился на отлично, в топ 20 результатов попали две панорамы.
Ответ на задачу: 22.626705, -103.895337.
Еще в топе оказалась такая крипота из того же города, стало немного страшно за тетю.
Telegram @bolivia_team