Cinnamy / Urban-Topology-Analysis-Service

0 stars 4 forks source link

Написать фронтенд для задачи по маршрутам #8

Closed Cinnamy closed 1 year ago

Cinnamy commented 1 year ago

Изучить документ. Разобраться, как это реализовать на практике.

sevryukov commented 1 year ago

@Cinnamy ознакомился с текстом по ссылке.

  1. Приведённые там формулировки слишком общие. Делалась попытка декомпозировать задачу?
  2. Направьте, пожалуйста, где можно посмотреть, как сейчас представлен и хранится граф (как структура данных)?
  3. Если говорить о сложности задачи, то где можно ознакомиться с проведённым анализом, по результатам которого получена оценка сложности?
Cinnamy commented 1 year ago

@sevryukov, направила ваши вопросы @eiririna, которая занималась этой частью проекта.

По поводу того, что формулировки слишком общие -- что именно там нужно декомпозировать? По ссылке "Графы" есть более подробное описание возможных графов, а в разделе "Информация на карте" всё написано достаточно конкретно.

По поводу графа аналитик делал дополнительный внутренний документ: https://colab.research.google.com/drive/181lvHURJL2bVzPgHtdzqYUZ90YwvqGuN?usp=sharing#scrollTo=wAIlrhQk8zKT. Бэкендер сказал, что это достаточно подробное описание.

sevryukov commented 1 year ago
  1. Приведу примеры декомпозиции в меру своего понимания и погружения:

Вот что я понимаю под декомпозицией слишком общей задаче "Визуализировать граф".

  1. Кажется, что вопрос остаётся открытым. По приведённой ссылке не смог найти и разобраться.
  2. В приведённом документе есть комментарий (не могу понять кто автор): ":Абсолютно хз, как fastAPI и Angular работает, но предполагаю, что то, что ниже написано, должно сработать". Кажется, что это самооценка квалификации, но не оценка сложности задачи.

@Cinnamy @eiririna

Cinnamy commented 1 year ago

@sevryukov Пока @eiririna отошла, постараюсь ответить.

Ту декомпозицию, которую вы привели в пример, мы частично обсуждали на очной встрече, частично она уже была предопределена выбором предыдущей команды, которая для отрисовки графов взяла библиотеку Graphology. Отдельного документа на эту тему мы не создавали, может быть только у Ирины есть какие-то личные заметки.

По поводу замечания к "самооценке квалификации": хоть исходный комментарий и не относится к работе фронтендера, хочу отметить, что в ситуации, когда нас не обучали перед началом работ, а сказали разбираться со всем самостоятельно, непонимание технологии -- это вполне себе блокирующий фактор. Перед распределением по проектам в феврале мы заполняли опросник с имеющимися у нас навыками, и вряд ли кто-то из нашей команды написал про навыки работы с Angular. На просьбу перераспределить на более подходящий проект Иван Станиславович отреагировал отрицательно.

eiririna commented 1 year ago

@sevryukov В ходе работы над проектом удалось лишь поправить предыдущие части фронтенда, в написании нового интерфейса у нас не хватило экспертности. После просьбы оценить стороннего специалиста в позиции сеньора по Angular текущее состояние фронтенда, выяснили, что код написан сложно для понимания, нет типизации объектов, из-за чего сложно отследить связь с бэком, и для работы над этим проектом в будущем желательно иметь человека с опытом в фреймворке Angular в виде консультанта. При логировании компонентов возникали ошибки с бэка. Так же возникла сложность из-за необходимости перезапускать контейнеры каждый раз при внесении изменений в фронт часть. Визуализация предполагалась такой, как на прикреплённом изображении. Впоследствии пришли к выводу, что лучше использовать встроенную визуализацию в библиотеках Sigmajs, Graphology, которые использует текущий граф. IMG_20230603_144033_957

CbI3PAHb commented 1 year ago

Я старался сделать всё максимально похоже на то, как было и у предыдущей команды, для передачи данных они использовали csv-строки с необходимой информацией :

edges_str - строка состоящая из компонент: ['id', 'id_way', 'source', 'target', 'name'] points_str - строка состоящая из компонент: ['id', 'longitude', 'latitude'] pprop_str - строка состоящая из компонент: ['id', 'property', 'value'] wprop_str - строка состоящая из компонент: ['id', 'property', 'value']

на их основе формировался объект, который и передавался в качестве ответа

Здесь тоже самое, есть такие же обработчики, которые принимают id города, список регоинов или мультиполигон. По этим данным отправляется запрос в БД, который формирует три строки:

stops_csv_str - строка состоящая из компонент: ['id', 'longitude', 'latitude'] stops_prop_csv_str - строка состоящая из компонент: ['id', 'property', 'value'] stops_edges_csv_str - строка состоящая из компонент: ['id', 'id_route', 'id_src', 'id_dest']

формируется объект класса StopsBase, полями которого являются эти строки, после чего этот объект передаётся в качестве ответа. image_2023-06-03_01-11-45 @sevryukov

OafishSpark commented 1 year ago

@sevryukov Касательно работы с графами. Если Вам станет более понятно, то могу предоставить ещё один документ, где я коротко описывал для команды концепции наших графов. https://docs.google.com/document/d/1HSCBiQT7xjXZTGo4UxxBNcAv-7u3hcXNmn9Fp6gCO7g/edit Все варианты были согласованы с Крылатовым А. Ю. . Мы с командой подробно обсуждали то, как это всё должно работать и пришли к выводу, что успеваем реализовать только 2 варианта, а именно 1б и 2 из документа выше

sevryukov commented 1 year ago

Коллеги, спасибо за комментарии.

Из них я понял следующее:

  1. Нынешней команде пришлось работать с legacy, т.е. с проектом, который имел в себе технический долг от предыдущей команды, ограничения на используемый стек технологий, write-only код.
  2. Система получилась многослойной и для решения задач недостаточно выполнить действия на одном слое, приходится решать задачи на всех слоях.
  3. Реверс-инжиниринг как задача не ставилась, но частично была выполнена. Это отняло неизвестное мне время, но скорее всего заметное. Результатом стал свод документации.
  4. Команда инвестировала время в обсуждения в формате брейншторм, однако связь между выносимыми вопросами на обсуждение, трудозатраты и, главное, результатами для стороннего наблюдателя неочевидна.
  5. Предыдущей и нынешней команде нужно было обратить внимание на специализированные инструменты для работы с пространственными данными и даже готовые ГИС (движки для построения ГИС).

Всё что я написал - личная субъективная оценка, построенная в результате поверхностного ознакомления с доступными ресурсами и с учётом личного понимания содержания комментариев. Это не рекомендация к действию.

Если и решать поставленную задачу, то её надо декомпозировать с выделением даже таких, как совместное код-ревью с участниками из предыдущей команды. Все возникающие сложности решения этих более атомарных задач надо фиксировать, что в совокупности и могло бы использоваться для оценки сложности поставленной задачи.

Спасибо за ваши комментарии, @Cinnamy @eiririna @CbI3PAHb @OafishSpark

sevryukov commented 1 year ago

В виде отдельного комментария и, рассматривая поставленную задачу как отдельную (без необходимости привязываться к наработкам предыдущей команды), предложил бы как минимум взглянуть на такую библиотеку как NetworkX. Вот ссылка на некоторые релевантные примеры: https://networkx.org/documentation/stable/auto_examples/index.html#geospatial Если я правильно понял, то граф строится для заданной области, а потом его необходимо анализировать и визуализировать. Предлагаю рассмотреть связку двух инструментов: OSMnx и упомянутый NetworkX: https://geoffboeing.com/2016/11/osmnx-python-street-networks/ (см. пункты 4 и 5 про сохранение полученных данных и дальнейшую работу с ними). Я обратил внимание, что предыдущая команда использовала библиотеку OSMnx для получения данных, но не более. Однако если требуется интерактив и отрисовка на карте, то лучше использовать специализированные для этого библиотеки. Вот пример визуализации с использованием folium: https://stackoverflow.com/questions/56234047/osmnx-plot-a-network-on-an-interactive-web-map-with-different-colours-per-infra/67115678#67115678

@Cinnamy @eiririna @CbI3PAHb @OafishSpark

sevryukov commented 1 year ago

Ещё один комментарий дам про СУБД для данных. На Demo как предыдущей команды, так и нынешней я задавал вопрос про использование специализированных СУБД для работы с граф-ориентированными данными. Вот хороший пример использования одной из популярных граф-ориентированных СУБД Neo4j: https://neo4j.com/developer-blog/routing-web-app-neo4j-openstreetmap-leafletjs/

Применительно к этой задаче я отношу упоминание Neo4j потому, что она поставляется с мощным UI для визуализации и интерактивного взаимодействия с графами (а не только как средство хранения и обработки данных).

@Cinnamy @eiririna @CbI3PAHb @OafishSpark

Cinnamy commented 1 year ago

@eiririna добавила нужный код в коммите.