June 8, 2025

Ленивый админский GEOINT 211

С помощью Google Lens можно получить картинку чуть получше качества на Pinterest.

Ещё там выдаются посты про город Камакура, но в регионе Канто таких столбов как справа ВООБЩЕ НЕТ, это больше похоже на Сикоку

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

Основные моменты: две парковки, кривой перекресток, асфальт синего цвета, зеленая полоса на асфальте, три люка (на спутнике с качеством 30см скорее всего будут плохо видны)

Получается примерно такая картина:

Дальше начинается самое интересное. Брутить все перекрестки в японии не вариант, поэтому я попытался найти все парковки AMANO. В OpenStreet Map выборочный поиск дал понять, что парковки AMANO никто не размечал. В мобильном приложении AMANO тоже карты парковок в Японии нету. Но чутка погуглив выходим на такую замечательную карту: https://www.locationsmart.org/?tag=_service_parking_amano&lat=35.35021868957501&lon=139.85197334628057&z=6

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

По итогу в DevTools в Network с включенным Preserve Log обнаруживаем нужный запрос:

Зная парковки можно парсить разными способами, я решил через JS прямо в консоли браузера

Все, что нам нужно изменить в оригинальном запросе, это параметры координат n,s,e,w на максимально возможные. В результате получаем JSON из 318 координат.

Сам код:

fetch("/ttypeg/php/g.php?tag=_service_parking_amano&n=90&s=-90&w=-180&e=180&z=14&epoch=1749148366324") .then(res => res.json()) .then(json => { // json.shops – это массив объектов, каждый из которых примерно имеет вид: // { shop_id: 12345, lat: 35.6895, lon: 139.6917, icon: "...", hide: ..., ... } const allCoords = json.shops.map(item => ({ shop_id: item.shop_id, lat: Number(item.lat), lon: Number(item.lon), // Если в JSON есть другое поле с названием, можно его тоже добавить name: item.n || item.name || "" })); console.table(allCoords); console.log("JSON для копирования:\n", JSON.stringify(allCoords, null, 2)); }) .catch(err => console.error("Ошибка при fetch g.php:", err));

Дальше надо преобразовать JSON в KML чтобы скормить его в проект Google Earth. Для этого я наГПТшил скриптик на питоне:

import json import os

# Скрипт конвертирует JSON-массив точек в KML-файл для Google Earth. # Ожидается, что рядом со скриптом лежит файл points.json со структурой: # [ # { # "shop_id": 759141, # "lat": 24.0612443, # "lon": 123.773374, # "name": "" # }, # ... # ]

def main(): input_json_file = 'path/to/ponts.json' # Имя вашего JSON-файла output_kml_file = 'path/to/points.kml' # Имя результирующего KML-файла

# 1. Читаем JSON if not os.path.exists(input_json_file): print(f"Файл '{input_json_file}' не найден.") print("Создайте файл points.json в той же папке, где лежит скрипт, " "и вставьте туда массив точек в формате JSON.") return

with open(input_json_file, 'r', encoding='utf-8') as f: data = json.load(f)

# 2. Заголовок и хвост KML kml_header = '''<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Document> ''' kml_footer = ''' </Document> </kml> '''

# 3. Формируем Placemark для каждой точки placemarks = [] for item in data: shop_id = item.get("shop_id", "") lat = item.get("lat") lon = item.get("lon") name = item.get("name", "") # Если name пусто, подставим shop_id как имя placemark_name = name if name else str(shop_id)

placemark = f''' <Placemark> <name>{placemark_name}</name> <Point> <coordinates>{lon},{lat},0</coordinates> </Point> </Placemark> ''' placemarks.append(placemark)

# 4. Собираем полный KML-контент kml_content = kml_header + "".join(placemarks) + kml_footer

# 5. Записываем в файл with open(output_kml_file, 'w', encoding='utf-8') as f: f.write(kml_content)

print(f"KML-файл '{output_kml_file}' успешно создан. Всего точек: {len(placemarks)}")

if __name__ == "__main__": main()

Кормим получившийся KML в Землю и видим следующую картину:

Открываем спутник, открываем наш план местности и начинаем брутить 318 точек на карте. Спустя недолгое время находим точку в городе Фукуока на Кюсю:

Очень похоже! Смотрим Google View:

И оригинал:

Итоговый ответ: 33.61901370153112, 130.42091864402323

На весь этот процесс ушло часа ~2.5, что в общем то достаточно быстро