Визначення координат по фото, розв’язання геоінформаційних головоломок

21 листопада 2024 3 хвилин Автор: Cyber Witcher

Геоінформаційна розвідка (GEOINT) є важливим інструментом для аналізу місцевості, використовуючи супутникові зображення, фотографії та карти. У цій статті ми покажемо, як визначити координати місця зйомки, спираючись на аналіз фотографії.

Розпочинаемо

Визначаємо координати місця за цією фотографією:

На передньому плані розташований багатоквартирний триповерховий будинок, облицьований досить незвичайною плиткою. Перехрестя, імовірно, має Т-подібну форму. Помітні численні дроти, натягнуті в повітрі. За будинком видно невідомий білий об’єкт.

Знак є аналогом загальноприйнятого шестикутного знака STOP, що вказує на другорядну дорогу та необхідність зупинитися, щоб поступитися дорогою транспортним засобам на головній дорозі. Знак “Заборонена стоянка” повторює правило заборони стоянки на відстані 5 метрів від перехрестя. У Японії дія такого знака поширюється в усі напрямки, а не лише за знаком.

Знак пішохідного переходу має особливе призначення — його встановлюють поблизу дитячих навчальних закладів у радіусі приблизно 300 метрів. Існує ймовірність, що кольори на знімку спотворені. Для відновлення початкових кольорів було використано функцію Auto Color у Photoshop.

Так набагато краще

На цьому етапі, навіть якщо раніше QR-код у верхньому лівому куті залишався непомітним, тепер його просто неможливо ігнорувати. Однак розпізнати його напряму не виходить, тому необхідно відновлювати вручну. Уважний учасник @Soulxwner виявив у завданні приховане посилання, за яким можна завантажити оригінал у форматі PNG: https://ibb.co/y47zRmT. Метадані, на жаль, відсутні, але саме зображення ідентичне, за винятком менш пошкодженого QR-коду, що полегшить процес відновлення. Для кращої видимості було додано трохи контрастності.

Для відновлення QR-кодів використовується інструмент Qrazybox.

Завдяки надлишковому кодуванню Ріда-Соломона, яке забезпечує захист від помилок, відновлення не вимагає ідеальної точності — допустимі певні похибки. Розмір QR-коду задається як 29×29. Тип маски та рівень корекції помилок визначаються за маркерами, розташованими навколо верхнього лівого орієнтира.

Малюємо за зразком максимально точно.

І отримуємо QR-код, який декодується на посилання https://postiimag.com/8Fygy3c9

Заради інтересу було перевірено кількість допущених помилок — їх виявилося 10, що є досить непоганим результатом.

Пошук не завершується, адже посилання не відкривається через неіснуючий домен. Звернення до пошукових систем, таких як Google, може допомогти знайти можливі альтернативні домени чи виправлення, що дозволять отримати доступ до необхідної інформації.

Пошукова система запропонувала кілька можливих варіантів. Після перевірки різних доменів замість postiimag.com було виявлено, що підходить postimg.cc. Таким чином, посилання набуло вигляду: https://postimg.cc/8Fygy3c9. На вказаному посиланні була знайдена ще одна картинка, яка викликає справжнє здивування.

Обробляемо картинки, щоб було простіше шукати.

За номером телефону 025-276-3395 зареєстровано сервіс, що займається модифікацією автомобілів. Його вебсайт: https://www.42tism.com/. Адреса сервісу: 新潟県新潟市東区大形本町193 (193 Ogatahonmachi, Higashi-ku, Niigata City, Niigata Prefecture).

Компанія Yumehouse спеціалізується на будівництві дерев’яних будинків. Її сайт: https://www.yume-h.com/. На офіційному ресурсі зазначається:
“Натуральні матеріали, масивні дерев’яні будинки по всій країні! Понад 400 магазинів-учасників!”

Синя реклама містить посилання на вихідний документ: https://www.jcp.or.jp/web_download/2202_kurashi.pdf.

Цей плакат є передвиборчою агітацією 2022 року від Комуністичної партії Японії, у якій обіцяють забезпечити сильну, але водночас стабільну економіку.

На іншому плакаті зображений Кадзуо Сії — голова цієї ж партії, який брав участь у виборах 2021 року. Деталі можна знайти за посиланням: https://www.jcp.or.jp/akahata/aik21/2021-08-31/2021083101_04_0.html.

Можна припустити, що ці плакати зібрані в одному місці невипадково. Імовірно, вони розміщені близько один до одного, можливо, навіть неподалік шуканого об’єкта. Цю гіпотезу пізніше підтвердив @blacktiesz, зазначивши, що всі елементи QR-коду знаходяться в одному місті.

З усіх плакатів точна географічна прив’язка є лише в автосервісу, розташованого в місті Ніїгата. Проте його реклама може бути присутня також у сусідніх містах префектури Ніїгата. Реклама Yumehouse більше нагадує вивіску окремого відділу продажів. Її аналіз допоможе звузити зону пошуків, якщо нанести на карту.

Отже, наявні численні орієнтири на місцевості. Наступним кроком буде використання Overpass для аналізу. Перш за все потрібно перевірити триповерхові будинки в місті Ніїгата. Для цього складається відповідний запит.

area["name:en"="Niigata"][admin_level=7]->.a;
nwr[building]["building:levels"=3](area.a);
out geom;

Розуміємо, що будинків дуже мало такого міста.

Ці об’єкти позначені вкрай рідко, тому їх подальше використання для аналізу не має сенсу. Наступним кроком буде пошук навчальних закладів, адже пішохідний перехід знаходиться в безпосередній близькості до одного з них.

area["name:en"="Niigata"][admin_level=7]->.a;
nwr[amenity~"(school|kindergarten|college|university)$"](area.a);
out geom;

Так краще, школи розмічені добре.

Залишилось перевірити пішохідні переходи.

area["name:en"="Niigata"][admin_level=7]->.a;
nwr[highway=crossing](area.a);
out geom;

Їх, безумовно, небагато, але іншого способу для подальшого аналізу наразі немає. Далі представлений метод пошуку Т-подібних перехресть.

// шукаємо тільки дороги для машин
way[highway~"(motorway|trunk|primary|secondary|tertiary|unclassified|residential|living_street|service)$
"]->.ways;

// перебираємо по одній
foreach.ways->.this_way {
 // цей оператор дозволяє витягти тільки кінцеві вузли колії
 (
   node(w.this_way:1,1);
   node(w.this_way:1,-1);
 )->.this_ways_ends;

 // Знаходимо всі дороги для машин, які містять ці точки
 way(bn.this_ways_ends)[highway~"(motorway|trunk|primary|secondary|tertiary|unclassified|residential|living_street|service)$
"]->.linked_ways;

 // Віднімаємо поточний шлях із циклу
 (
   way.linked_ways;
   -
   way.this_way;
 )->.linked_ways_only;

 // Отримуємо вузли цих шляхів
 node(w.linked_ways_only)->.linked_ways_only_nodes;

 // Знаходимо перетин кінцевих вузлів поточного шляху та вузлів інших шляхів
 node.linked_ways_only_nodes.this_ways_ends;
 out;
}

Якщо коротко, метод дозволяє знаходити точки перетину доріг, де одна дорога закінчується, впираючись у іншу, утворюючи Т-подібне перехрестя.

Варто врахувати, що дорога може складатися з декількох сегментів (ways), через що можливі хибні спрацювання. До коду додаються умови: перехрестя повинні знаходитися поблизу шкіл, мати нерегульовані пішохідні переходи. Також виключаються теги motorway, trunk, primary, secondary, tertiary для прилеглої дороги, оскільки вона навряд чи належить до цих категорій.

area["name:en"="Niigata"][admin_level=7]->.a;
nwr[amenity~"(school|kindergarten|college|university)$"](area.a)->.schools;
way[highway~"(unclassified|residential|living_street|service)$"](around.schools:300)->.ways;
nwr[highway=crossing][crossing!=traffic_signals](around.schools:300)->.crossings;

foreach.ways->.this_way{
 (
   node(w.this_way:1,1);
   node(w.this_way:1,-1);
 )->.this_ways_ends;
 way(bn.this_ways_ends)[highway~"(motorway|trunk|primary|secondary|tertiary|unclassified|residential|living_street|service)$
"]->.linked_ways;
 (
   way.linked_ways;
   -
   way.this_way;
 )->.linked_ways_only;

 node(w.linked_ways_only)->.linked_ways_only_nodes;

 node.linked_ways_only_nodes.this_ways_ends(around.crossings:20);
 out;
}

У результаті виходить ось так: обійти всі точки цілком реально. Переглядаючи їх, можна виявити будинки зі схожою плиткою та подібною конструкцією.

Заносимо їх на карту, може, вони в одному районі.

У підсумку потрібний будинок знайти не вдалося, а схожі будівлі виявилися розкиданими по всьому місту Ніїгата. Можливо, їх зводив один і той самий забудовник, але інформації про це знайти не вдалося.

Продовжуємо

Було встановлено, що будинок знаходиться в місті Ніїгата або в прилеглих містах префектури. Аналогічних будинків у місті досить багато, і вони розкидані по різних районах. При цьому в OpenStreetMap інформація про поверховість будівель не вказана. Здебільшого малоповерхові будинки в Ніїгаті складаються з двох поверхів і належать до приватного сектору, а триповерхові багатоквартирні будинки трапляються рідко.

Майже кожен такий будинок має не лише адресу, але й назву. Шукаючи за цією назвою, можна знайти сайти-агрегатори нерухомості для оренди та продажу. Проте пошук на таких ресурсах менш універсальний, ніж, наприклад, на ЦІАН. Нерухомість, тому відфільтрувати будинки за кількістю поверхів не вийде. Для цього необхідно завантажити дані з цих сайтів і опрацювати їх самостійно.

Серед таких ресурсів можна виділити:

  • mansion-review.jp

  • suumo.jp

  • homes.co.jp

  • athome.co.jp

  • lifullhomes-index.jp

Ймовірно, вони мають спільну базу, але дані не завжди збігаються. У ході аналізу було виконано завантаження даних із сайтів mansion-review.jp, homes.co.jp та lifullhomes-index.jp. Однак потрібний будинок не вдалося знайти на перших двох, тому було зосереджено увагу на останньому.

Для зручності було вирішено завантажити інформацію по всій префектурі Ніїгата. На сторінці https://lifullhomes-index.jp/building-list/niigata-pref/ зазначено, що на сайті є дані про 32 794 будинки. Є можливість обмежити вибірку лише будинками з квартирами для оренди, але цей фільтр не використовувався, оскільки потрібна повна база даних.

По сторінці будинку доступна така інформація:

Але якщо заглянути в код, можна знайти геопозицію:

{
   "@context": "https://schema.org",
   "@type": [
       "Residence",
       "apartment"
   ],
   "image": "https://archive-image.lifullhomes-index.jp/v2/original/139342/24fa15dff6dc1ff208d8e42621b63189.jpg",
   "url": "https://lifullhomes-index.jp/buildings/b-7500240/",
   "name": "ライオンズマンション長岡",
   "description": [
       "長岡市の標準的な物件の価格は直近の3年間で3.10%程度上昇しています。",
       "これは長岡市のある新潟県の変動の1.01%に比べてやや高めの水準です。",
       "この3年間の価格上昇率を内訳でみると、初年度が-0.87%、2年目が1.88%、3年目が2.09%となっています。",
       "長岡市の標準的な物件の賃料は直近の3年間で4.19%程度上昇しています。",
       "これは長岡市のある新潟県の変動の3.82%に比べて同程度の水準です。",
       "この3年間の価格上昇率を内訳でみると、初年度が4.50%、2年目が0.59%、3年目が-0.90%となっています。"
   ],
   "address": {
       "@type": "PostalAddress",
       "name": "新潟県長岡市南町1丁目5-17",
       "streetAddress": "1丁目5-17",
       "addressLocality": "長岡市",
       "addressRegion": "新潟県",
       "postalCode": "940-0081",
       "addressCountry": "JP"
   },
   "geo": {
       "@type": "GeoCoordinates",
       "latitude": 37.4413033,
       "longitude": 138.8509603
   }
}

Та іншу інформацію у зручному json-форматі:

{
   "login_status": "guest",
   "tealium_event": "web_buildings_view",
   "page_type": "building_public",
   "service_type": "sumaiindex",
   "prefecture_id": [
       "15"
   ],
   "city_id": [
       "15202"
   ],
   "house_age": [
       33
   ],
   "station_id": [
       "00060",
       "00060"
   ],
   "house_area": [
       73.71,
       73.71
   ],
   "item_id": [
       "7500240"
   ],
   "item_type": [
       "building"
   ],
   "item_name": [
       "ライオンズマンション長岡"
   ],
   "realestate_type_id": [
       "Condominium"
   ],
   "town_id": [
       "14CED04F12"
   ],
   "house_walk_minute": [
       10,
       10
   ],
   "floor_count": 14,
   "unit_count": 42,
   "contractor": "小柳建設株式会社",
   "year_built": 199107,
   "land_youto": 6
}

Отже, створюється простий код, який формує зручну таблицю для аналізу. Він представлений у початковому вигляді (as-is) для тих, кого це може зацікавити. Для доступу до матеріалів використовується пароль — MD5-хеш вступу до цього розділу.

Файли:

У результаті виходить структурована таблиця з усією необхідною інформацією.

Перевіряючи дані, завантажені з інших сайтів, було помічено, що схожі будинки почали зводити приблизно з 2002 року, і вони виконані з залізобетону. Тому доцільно встановити фільтр лише на залізобетонні будівлі в межах міста Ніїгата, починаючи з 1999 року, для більшої точності.

Отримуємо невелику таблицю з 259 будинків:

Більшість будинків мають посилання на зображення. Щоб уникнути перегляду точок вручну, завантажуються всі фотографії. У випадках, де зображень немає, доведеться переглядати локації самостійно. Для цього створюється простий скрипт паралельного завантаження. Хоча існує багато готових рішень, було вирішено створити власний варіант.

Файл скрипта: dl_parallel.py, доступний на тих самих умовах. Після цього можна розпочати пошук потрібного будинку.

Зображення будинку зроблене не з найкращого ракурсу. Однак, після перегляду сотень подібних будівель, білий об’єкт відразу привертає увагу (згадуючи той самий невідомий білий елемент). Два ряди балконів також є помітною ознакою, яку неможливо проігнорувати.

Залишається лише перейти до Street View, щоб уточнити точні координати місця зйомки.
  • 37.913431, 139.095253

Тепер варто задуматися, чому Overpass не зміг знайти потрібний об’єкт. При перевірці в OpenStreetMap з’ясувалося, що на заданому перехресті не позначено пішохідний перехід, а лише дві дороги.

Якщо прибрати з запиту обмеження на наявність пішохідного переходу, стає зрозуміло, що до потрібного перехрестя трохи більше 300 метрів, і кількість відповідних точок значно зростає.

Отже, всупереч поширеній думці, Overpass не творить дива. Це лише корисний інструмент, можливості якого обмежені, і він не завжди дає бажаний результат.

Інші статті по темі
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.