stepan-anokhin / spb-histmap Goto Github PK
View Code? Open in Web Editor NEWИнтерактивная карта артиллерийских и авиа-ударов Ленинграда в период ВОВ
Home Page: https://stepan-anokhin.github.io/spb-histmap/
License: MIT License
Интерактивная карта артиллерийских и авиа-ударов Ленинграда в период ВОВ
Home Page: https://stepan-anokhin.github.io/spb-histmap/
License: MIT License
Как пользователь, я хочу фильтровать данные, отображаемые на карте. Как минимум я хочу искать события по адресу, и отсеивать их по времени (от и до). Фильтры данных должны отображаться на сайдбаре. Сайдбар должен быть закрываемым, чтобы позволять работать только с картой, когда он не нужен.
Реализовать отображение событий в соответствии с фильтрами на сайдбаре:
Связано с #11
Как пользователь я хочу определять тип событий по внешнему виду маркера.
Как пользователь я хочу иметь возможность фильтровать события по типу.
Поскольку реальные данные временно недоступны (предположительно до, февраля 2022) весь функционал придется отрабатывать на фейковых данных.
Поскольку формат данных может меняться по мере разработки, потребуется менять их многократно. Чтобы избежать ручного труда, необходимо автоматизировать генерацию.
Автоматизировать генерацию фейковых данных:
npm run
и не требовать дополнительных действий после запуска.Зависит от #10
Как пользователь, я хочу легко определять тип события по его внешнему виду.
Интегрировать кастомные иконки в приложение.
leaflet.js
Если не срастётся с привлечением художников, можно использовать вот эти бесплатные иконки:
Как разработчик я хочу всегда видеть актуальную версию приложения, задеплоиную на https://stepan-anokhin.github.io/spb-histmap/
Как разработчик я также хочу избежать рутинных операция по деплою.
Вливание изменение в ветку master
должно автоматчески деплоить обновленную версию на https://stepan-anokhin.github.io/spb-histmap/.
https://github.community/t/triggering-by-other-repository/16163
Дополнительную информацию (расположение войск, линии разграничения) хочется отображать в виде полигонов и ломаных линий на карте.
Исходные полигоны и линии, скорее всего, будут рисоваться руками в этом редакторе: http://share.mapbbcode.org. Нарисованные элементы затем можно экспортировать в разные форматы. На вскидку, самым удобным для парсинга кажется GeoJSON
Для рисования полигонов и линий на карте у react-leaflet
есть вот такое API: https://react-leaflet.js.org/docs/example-vector-layers/
Надо отработать процесс отображения того, что экспортнула рисовалка (1) (например, файла в формате GeoJSON), с помощью react-leaflet-овского API (2). Все промежуточные манипуляции должны быть по максимуму автоматизированы, чтобы имея на руках файл, экспортнутый рисовалкой, можно было тривиально добавить его в приложение.
Другими словами, хочется следующее:
В общем эти операции надо отработать и по максимуму автоматизировать.
В идеале это может выглядеть так:
Чтобы добавить элемент, кидаешь исходные geo-json файлы с осмысленными именами в какую-нибудь папку проекта, потом запускаешь скрипт (скажем, npm run generate-elements
), который что-то делает (например генерирует typescript-файлы). Всё, после билда соответствующие элементы появляются на карте.
Чтобы удалить элемент, удаляешь соответствующий geo-json файл, затем снова запускаешь npm-run generate-elements
, всё элемент пропал из приложения.
Чтобы редактировать: берёшь geo-json файл из проекта, импортишь его в рисовалку, редактируешь, как тебе надо, затем экспортишь обратно, пихаешь обновленный файл в исходное место в проекте, запускаешь скрипт, вуа-ля элемент обновился.
Возможно удастся обойтись вообще без дополнительного скрипта, если какой-нибудь модуль просто будет выгребать данные прямо из json-файлов. Тогда чтобы добавить элемент, скажем надо его кинуть в папку и импортнуть в нужном месте.
Пример экспорта геодаты:
test-line.zip
Как пользователь я хочу иметь возможность быстро просматривать детали событий, отображаемых на карте. Для этого при нажатии на отдельный марке должен отображаться popup, содержащий основную информацию по событию.
Реализовать отображение основных деталей события в popup-е при нажатии на маркер:
Как пользователь, я хочу видеть в приложении свое местоположение.
Как пользователь, который впервые открыл приложение, я хочу быстро разобраться в контексте: что это и почему может быть мне интересно.
Реализовать Landing-page со следующим содержимым:
В рамках текущего подхода мы поступаем следующим образом:
TypeScript
-модуль, содержащий массив событий. Каждое событие представлено литералом объекта.WebPack
чтобы скомпоновать весь имеющийся код в один js-файл main.bundle.js
. Этот бандл грузится браузером, когда пользователь открывает страницу с приложением.Мотивацией такого подхода является отсутствие необходимости иметь бэкенд. Любого http-сервера, способного отдвать статические файлы (index.html
, main.bundle.js
и иконки) будет достаточно. Поэтому мы например можем разместить пилотную версию приложения на github-pages и не платить не копейки.
Текущий подход имеет ряд серьёзных проблем:
Надо также понять, как отображать неполные исходные данные. Часть исходных данных изначально представлена в виде групп событий (например, количество прилётов в такой-то район на такую-то неделю). Часть - в виде индивидуальных событий (по большому счёту - отедельных рапортов). Надо решить как отображать группы событий, если мы используем одновременно и алгоритм динамической клстеризации.
Еще одной проблемой является то, что конвертацию исходных данных в ts-модуль мы также реализуем на typescript. При всей прелести системы типов, этот язык не совсем подходит для парсинга файлов и преобразования данных. На практике асинхронный стиль удорожает реализацию без какой-либо надобности: разработчики по сути тратят дополнительные усилия на описание алгоритма в рамках вычслительной модели, которая вообще говоря создана для ускорения IO-intensive кода, но скорость препроцессинга совершенно не влияет на скорость самого приложения. Было бы неплохо реализовать препроцессинг, например, на python, особенно учитывая огромное количество библиотек для работы с данными.
Этот раздел не дописан
В общих чертах: мы стремимся к content-oriented архитектуре. Есть движок (пока что это только фронт, выполняющийся на клиенте) для отображения, и есть content. Клиент динамически подгружает детали того, что надо отображать. Клиент должен иметь возможность грузить данные кусками (надо понять как это делать: есть несколько вариантов, но для каждого я вижу некоторые сложности в реализации, которые пока не придумал как решить). Для препроцессинга данных надо создать полноценный пайплайн на питоне. Предлагаю использовать luigi для организации графа задач и инкрементного ленивого выполнения (аналог Make
, по сути, но даже сложно преувеличить насколько лучше). Пайплайн должен брать исходные данные и генерировать набор статических файлов, которые будет динамически подгружать клиент (пока что мы не отказываемся от API-less подхода). Пайплайн будет выполнять статические преобразования, типа поиска координат по адресу дома и т.п. и возможно более умной обработки (ститическая кластеризация? Раскладывание событий по тайлам?). Изменения на фронте: нужно написать интерфейс клиента, который будет грузить нужные данные динамически. Текущая реализация этого интерфейса будет грузить статические файлы по URL, а в будущем он может обращаться по rest api к серверу, если мы всё-таки добавим умный бэк, причем это не должно потребовать изменений в остальном коде. Частичная загрузка данных усложняет фильтрацию. Надо понять, как это преодолеть.
Надо теперь превратить этот поток сознания в нормальное описание и добавить сюда набор подзадач
CSV-файл. Разделитель - запятая (,
). Если событие описано для улицы, номер дома и тип дома просто оставляем пустым.
Дата
- в формате ГГГГ-ДД-ММУлица
- историческое название улицыДом
- исторический номер домаТипДома
- тип учреждения, тип дом (больница, жилой дом, и т.п.)Количество
- количество снарядовТип
- тип снаряда. Возможные значения:
З
- зажигательные бомбыФ
- фугасный снарядА
- артиллерийскийОписание
- словесное описаниеCSV-файл. Разделитель - запятая (,
).
Исторический
- историческое название улицыТип
- улица, переулок, проспект, площадь, набережная, мостСовременный
- современное название улицыТип
- улица, переулок, проспект, площадь, набережная, мост, адрес (если улица ликвидирована)Дата
- в формате ГГГГ-ДД-ММРайон
- историческое название районовКоличество
- количество снарядовКоличествоДомов
- количество поврежденных/разрушенных домовТип
- З
,Ф
или А
Описание
- словесное описаниеКак пользователь, я хочу видеть, как события происходили в динамике. Для этого необходимо реализовать возможность интерактивно менять временное окно и смотреть, как данные динамически меняются на карте.
Добавить слайдер, позволяющий двигать временное окно, по которому фильтруются события:
Как пользователь, я хочу легко определять тип события по его внешнему виду.
Нарисовать маркеры для каждого типа события. Иконки должны быть интуитивно понятными и достаточно различным, чтобы отличать их с первого взгляда.
Как пользователь, я хочу иметь возможность установить приложение из google play и appstore, а также запускать приложение под windows и linux не устанавливаю никаких доплнительных компонентов. Для этого нужны сборки под соответствующую ОС.
eslint
выдает следующие ворнинги:
> [email protected] lint
> eslint src
/home/stepan/WebstormProjects/spb-gpw2-histmap/src/components/HistMap/HistMap.tsx
22:39 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any
36:37 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any
/home/stepan/WebstormProjects/spb-gpw2-histmap/src/processing/script-utils.ts
168:44 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any
✖ 3 problems (0 errors, 3 warnings)
eslint
, чтобы билд падал при любом количестве ворнингов > 0TypeScript
, чтобы проверки были более строгими (например, запретить implicit/explicit any
)prettier
на *.geojson
-файлыКроме артиллерийских ударов - точечных событий - мы также отображаем дополнительные данные (линии фронта, коммуникации и т.п.), которые существовали протяженное время.
Как пользователь я хочу иметь возможность выбирать, какие дополнительные данные отображаются на карте: линии фронта, направления ударов, коммуникации.
Как программист я хочу иметь возможность подстраивать поведение программы (например текст описания) в зависимости от типа данных.
Проект не будет очень большим, но достаточно большим, чтобы изменения или рефакторинг могли сломать уже существующий функционал. Проверка, что основные сценарии использования не сломаны, должна быть автоматизированной, чтобы удешевить цикл внесения изменений-тестирования.
Реализовать e2e тесты (желательно с помощью Cypress), проверяющие основные сценарии использования:
На сайте http://retromap.ru в свободном доступе находятся тайлы исторических карт РККА на 1941 год.
Как пользователь я хочу видеть исторические карты Ленинграда, относящиеся к периоду блокады.
Как пользователь, я хочу иметь возможность видеть в приложении попадания авиабомб и арт-снарядов в радиусе 200 метров от моего местоположения.
Кроме артиллерийских и авиа-ударов мы отображаем также и дополнительные элементы - позиции войск, линии фронта и прочее (содержимое папки frontlines)
Как пользователь я хочу по цвету обозначений видеть с какой воюющей стороной ассоциированы те или иные данные (позиции войск, направления атак и т.п.)
Как пользователь я хочу иметь возможность фильтровать элементы карты по тому, с какой воюющей стороной они ассоциированы.
Как пользователь, я хочу фильтровать данные, отображаемые на карте. Как минимум я хочу искать события по адресу, и отсеивать их по времени (от и до). Фильтры данных должны отображаться на сайдбаре. Сайдбар должен быть закрываемым, чтобы позволять работать только с картой, когда он не нужен.
Необходимо реализовать внешний вид сайдбара:
Собственно фильтрация в эту задачку не входит.
Контекст
Как пользователь я хочу видеть только корректные данные на всплывающей подсказке к полигонам на карте.
Задача
На всплывающей подсказке должно отображаться:
Используя
http://share.mapbbcode.org/ipnxg?editid=ucmpm
нарисовать и сэкспортировать линии размещения войск на период зимы 1941-1942 годов согласно карте:
https://xn--80ahclcogc6ci4h.xn--90anlfbebar6i.xn--p1ai/multimedia/photo/gallery.htm?id=1130@cmsPhotoGallery
Для отображения альтернативных (исторических/современных) адресов во время фильтрации по улице/дому (#12) и при подготовке реальных данных (#13) а также при генерации реалистичных фейковых данных (#6) сильно пригодится возможность быстро отображать исторические адреса в современные и обратно.
Реализовать возможность конвертации исторического адреса (улица, номер дома) в современный и обратно.
Реальные данные будут доступны ориентировочно после Февраля 2022, не раньше, чем выйдет книга Баира. Данные будут получены в формате, отличном от того, что используется в приложении.
Конвертировать реальные данные в формат, используемый приложением. По возможности автоматизировать этот процесс или отдельные его этапы.
Зависит от #16
Как пользователь я хочу видеть альтернативный адрес, когда я осуществляю фильтрацию по улице номеру дома:
Отображать историческое название улицы и номер дома (если есть) на сайдбаре под группой фильтров по адресу:
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.