Статус
В работе
Технологии
Svelte 5 · TypeScript · Vite · D3 · TopoJSON · Web Workers · Node.js · GitHub Actions

Где в Японии ставить склад, решают данные, которые все публичны и все опубликованы отдельно друг от друга: площадь складов по префектурам, грузопотоки между ними, наличие водителей, предельная дневная дистанция грузовика по закону, цена промышленной земли и паводки. 総合物流マップ сводит их на одну карту, чтобы первичный отбор можно было вести сразу по всем.

Это личный проект на открытых данных, и он некоммерческий: часть источников лицензирована только для некоммерческого использования.

00 / Инструмент решения, а не дашборд

Дашборд показывает цифры. Здесь нужно дойти от 1 898 муниципалитетов до нескольких, куда стоит съездить, поэтому отбор устроен как воронка: жёсткие условия по муниципальным метрикам применяются по очереди, и после каждого видно, сколько осталось — 1 898 → 1 230 → … → 190. Не прошедшие муниципалитеты гаснут на карте, прошедшие становятся набором кандидатов для всего остального, а сами условия лежат в URL. Отбор — это ссылка, которую можно отправить коллеге.

01 / Статика по построению

Бэкенда нет. Данные собираются заранее ETL-скриптами из официальных публикаций в версионируемый JSON, а GitHub Actions обновляют их по расписанию каждого источника: новости — каждое утро, обзор цен на дизель — по четвергам, потому что публикуют его в среду. Манифест хранит для каждого исходного файла размер, SHA-256, страницу-источник и скрипт, который его читает, — поэтому сборка воспроизводима, а файл, сменивший форму, виден до разбора.

Карта рисуется, а не делегируется: проекция Ламберта с врезками Окинавы и Огасавары, фоновые тайлы укладываются в неё кусочно-аффинно, детальные границы грузятся по префектурам и только для того, что на экране. Тяжёлые расчёты — километровая сетка населения, проверка устойчивости оценки, симуляция размещения — идут в Web Workers. Всё, что уезжает на хостинг, — статические файлы.

02 / Лицензия, ставшая архитектурой

Часть слоёв — автодороги экстренных перевозок, ключевые логистические дороги, порты, грузовые железнодорожные станции — это данные 国土数値情報 с лицензией только для некоммерческого использования. Решающим оказался не вопрос, можно ли их показывать, а вопрос, можно ли их забрать: в октябре 2026 года офис-оператор подтвердил с министерством, что отображение таких данных слоем на карте распространением не является, а состояние, в котором посетитель может получить сами данные — векторные тайлы, API, — являться может.

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

Ограничение, которое обычно заканчивается словами «показать нельзя», стало моделью публикации.

03 / Что цифрам позволено означать

Время в пути считается по дорожной сети со скоростями дорожной переписи, отдельным режимом для часа пик и паромами. Достижимость затем пересчитывается по правилам режима труда водителей 2024 года — 13 часов смены, 9 часов за рулём, 30 минут отдыха каждые 4 часа, — поэтому точка назначения описывается как однодневный рейс, рейс на день или два дня с перецепкой, а не как «4 ч 20 мин».

Стоимость доставки считается по стандартным тарифам MLIT: регион, класс машины, диапазон расстояния, округление как в министерском Q&A, по реальной дорожной дистанции быстрейшего пути. CO₂ — по уточнённому тонно-километровому методу. Платные дороги, ожидание, погрузка и надбавки не входят, и страница говорит об этом там же, где показывает цифру.

Оценка площадки переводит 11 критериев в процентильные ранги 0–100 и усредняет их с весами, которые вы задаёте. Взвешенная оценка — это мнение в костюме числа, поэтому расчёт прогоняется 200 раз со случайным отклонением каждого веса до ±50%: у каждого места появляется диапазон ранга и доля попаданий в первую десятку, и отмечаются только те, кто это переживает. Остальные — те места, которые другой эксперт расставил бы иначе.

Размещение решается двумя жадными постановками, обе показываются по шагам: максимальное покрытие — N площадок, достающих до наибольшего числа людей в пределах лимита времени поверх уже существующих, — и p-медиана, минимум суммы рейсов по стандартным тарифам плюс фиксированная годовая стоимость площадки. Количество площадок с наименьшей суммой отмечается, а не принимается на веру.

04 / Чем он не является

Это первичный отбор по открытым данным: оценки, а не коммерческие предложения, юридические границы или разрешения на маршрут. Задержка публикации — часть предмета: складская статистика за апрель–июнь 2025 года вышла в сентябре 2026-го, поэтому у каждой метрики стоит дата актуальности, а в подвале перечислены периодичность и ближайший ожидаемый выпуск по каждому источнику.

CI гоняет проверку типов, юнит-тесты, сборку, сквозной прогон с axe и задание на визуальные эталоны — карта ломается тихо.