urban-transit-network-analysis 1.0.7
Python module for urban network analysis

# Инструмент для анализа различных городских транспортных сетей

## Возможности:

1. Кластеризация дорожных сетей городов
2. Вычиление метрик центральности(beweenessens, page rank) для сетей
3. Кластеризация остановок общественного транспорта Российских городов
4. Формирование различных графиков: Histogram, Heatmap на основании анализа сетей
5. Формирование интерактивной карты с информацией о анализе

## Необходимо:

1. Установить зависимости `pip install urban-transit-network-analysis`.
2. Установить Neo4j Desktop.
3. Создать БД и вести имя, пароль, порт в файл .env . Параметры можно посмотреть в `neo4j_connection.py`.
4. Установить плагин graph-data-science для работы с neo4j. Плагин можно установить или через интерфейс
   Neo4j Desktop, или вручную, скачав совместимый с версией базы данных
   [плагин](https://github.com/neo4j/graph-data-science/releases) и поместив его в папку с плагинами
   созданного проекта. Также в файле конфигурации `neo4j.conf` проекта необходимо установить параметр со следующими
   значениями `dbms.security.procedures.unrestricted=jwt.security.*, apoc.*, gds.*`
6. Запустить базу данных
7. Создать контекст - AnalisisContext.py в соответствии с вашими требованиями
8. Запустить процесс анализа в AnalisisManager.py

## Создание графов дорог и сети автобусных остановок:

Для создания графов дорог данные берутся из OpenStreetMap с помощью библиотеки osmnx. Для сетей общественного транспорта
берет данные из https://kudikina.ru. С этого сайта есть возможность получать данные о дорожных сетях более чем 200
городов.

Подробнее о данных сети общественного транспорта:

- Вершины - остановки. Включает географическое положение остановки (могут быть не
  точными - если информацию получить не удалось, то в таком случае данные будут приближенными и узел будет
  иметь `isCoordinateApproximate = True`), название остановки, список автобусных маршрутов в которых включена
  остановка;
- Связи - маршруты между соседними остановками внутри одного автобусного маршрута (название маршрута, длительность
  перемещения между соединяемыми остановками).

## Используемые инструменты
1. В качестве языка программирования используется Python
2. Для получения информации о дорожных сетях использовалась библиотека osnmx c базой данных OpenStreetMap, для получения
   Для получения данных о сетях маршрутов общественного транспорта был написан парсер, использующий библиотеку beautifulsoup4
   , который собирает информацию с сайта https://kudikina.ru
3. Для исполнения алгоритмов и хранения информации использовались возможности базы данных neo4j и Python библиотеки neo4j
4. Для визуализации использовались Python библиотеки plotly(для построение гистограмм и тепловых карт), folium(для 
   построение интерактивной карты с информацией анализа)

## Процесс анализа
1. Формирование контекста AnalysContext, который содержит основные параметры анализа(город, тип сети,
   необходимые метрики, неыобходимые алгоритмы, необходимые графики) 
2. Если есть необходимость в соответствии с AnalysContext, формируется граф и записывается в бд:
    - В случае с графом дорожных сетей информация получается с помощью библиотеки osnmx с использованием 
    функций graph_from_place graph_to_gdfs. На основании этих данных формируется сеть и записывается в neo4j
    - В случае с графом дорожных сетей с информацией о зданиях данные получается с помощью библиотеки osnmx с использованием
    функций graph_from_place, graph_to_gdfs, geometries_from_place, и на основании этих данных формируется сеть с 
    использованием библиотеки quad для быстрого формировнии сети и записывается в neo4j
    - В случае с графом маршрутов общественного транспорта данные получается с помощью парсера сайта https://kudikina.ru 
    использованием beautifulsoup4. На основании этих данных формируется сеть и записывается в neo4j
3. Далее для исполнения различных алгоритмов neo4j формируется единый проект с помощью gds.graph.project
4. Далее для вычисления метрик используются различные процедуры neo4j(gds.leiden.stream, gds.louvain.stream,
   gds.leiden.write, gds.louvain.write, gds.betweenessens.write, gds.pagerank.write)
5. Далее вычисленные и записанные данные собираются из базы данные(С использованием различных запросов)
   и приводятся к единому виду в Python для удобства в визуализации
6. Далее начинается процесс визуализации, используются:
    - plotly - используется для построения графиков гистограмм и тепловых карт, используются ранее собранные данные
    , агрегируются и с использованием plotly.express.histogram и plotly.express.heatmap формируются графики
    - folium - используется для построения интерактивных географических карт в формате html, используются ранее собранные данные
    , агрегируются и с использованием plotly.express.histogram и plotly.express.heatmap формируются графики

## Источники информации используемые при разработке:

1. https://neo4j.com/docs/python-manual/current/
2. https://neo4j.com/docs
3. https://neo4j.com/docs/graph-data-science/current/algorithms/louvain/
4. https://neo4j.com/docs/graph-data-science/current/algorithms/leiden/
5. https://en.wikipedia.org/wiki/Louvain_method
6. https://proproprogs.ru/ml/ml-aglomerativnaya-ierarhicheskaya-klasterizaciya-dendogramma