Что делает представленный код и зачем он нужен?
В блоке мы готовим набор точек интереса (POI), считаем их локальную плотность, измеряем расстояние до ближайшей улицы и строим несколько типов пространственных графов. Всё это – типичный набор шагов для анализа пространственной плотности, построения сети соседства и визуализации топологии. Если вы когда‑нибудь задавались вопросом, «как быстро превратить набор координат в граф, пригодный для дальнейшего машинного обучения», то эта статья для вас.
Подготовка данных
Первый блок кода «вытаскивает» X и Y из геометрии и переводит их в массив NumPy. Это упрощает дальнейшие расчёты и делает возможным использование sklearn.neighbors.NearestNeighbors без лишних преобразований.
- cx / cy – координаты точек.
- coords – двумерный массив
[[x1, y1], [x2, y2], …].
Оценка локальной плотности
Мы считаем, сколько соседей попадает в радиус 150 м. Чем больше соседей, тем выше локальная плотность. Для этого удобно использовать метод radius_neighbors:
- результат – список индексов соседей для каждой точки;
- из него вычитаем единицу, чтобы не учитывать точку саму.
Расчёт расстояния до улицы
Если у вас есть слой дорожной сети (segments_gdf), то geopandas.sjoin_nearest быстро найдёт ближайший отрезок к каждой точке. Мы сохраняем минимальное расстояние в колонку dist_street. В случае отсутствия дорожного слоя – заполняем нулями, чтобы последующий код не ломался.
Категориальные метки
Тип данных category в pandas экономит память и ускоряет операции над столбцом category. Мы также создаём числовой столбец label – это удобно для обучения классификаторов.
Построение различных пространственных графов
Далее мы сравниваем несколько популярных топологий. Все они реализованы в библиотеке geo2graph (условное название, замените реальной ссылкой).
- KNN (k=8) – каждый узел соединён с восемью ближайшими.
- Delaunay – триангуляция Делоне, естественно образует «плоскую» сеть.
- Gabriel – ребро сохраняется, если круг с диаметром ребра пуст.
- RNG – более строгий вариант Габриэля.
- EMST – Евклидовое минимальное остовное дерево.
- Waxman – вероятностный граф, где вероятность соединения падает с расстоянием.
Для каждой топологии мы считаем:
- число ребр;
- среднюю степень вершины (avg_degree).
Это позволяет быстро понять, какая модель лучше подходит под конкретную задачу (кластеризация, поиск аномалий, построение маршрутов).
Визуализация результатов
Для наглядности мы выводим три графа (KNN, Delaunay, EMST) на одной фигуре. На графиках показываются и ребра, и сами POI – так сразу видно, насколько «расплывчато» или «сжато» выглядит сеть.
- Цвет ребер – нежно‑синий, точки – ярко‑красный.
- Ширина линий 0.4 pt делает граф лёгким для восприятия.
Практические рекомендации
- Выбор радиуса для плотности: 150 м – хорошее стартовое значение в городском контексте, но подстраивайте под масштаб вашего исследования.
- Число соседей в KNN: k=8 работает для умеренных наборов (до 10 k точек). При больших данных увеличьте k, иначе граф будет слишком разреженным.
- Память: храните только нужные столбцы (
geometry,label,dist_street), а остальные удаляйте после расчётов. - Отладка: оборачивайте каждый построитель в
try/except(как в примере). Это спасёт от краха при несовместимых типах геометрий. - Экспорт графа: полученные ребра легко сохранить в
CSVилиGraphMLдля дальнейшего анализа в NetworkX или Gephi.
Краткий чек‑лист
- Подготовить
GeoDataFrameс колонкойgeometry. - Вычислить координаты
cx, cy и собрать массивcoords. - Посчитать локальную плотность через
NearestNeighbors(radius=…). - Если есть слой улиц – добавить
dist_streetчерезsjoin_nearest. - Преобразовать категориальный столбец в коды.
- Выбрать набор графовых построителей, запустить и собрать статистику.
- Визуализировать интересующие топологии.
Следуя этим шагам, вы сможете быстро превратить любой набор POI в информативную пространственную сеть, готовую к машинному обучению, визуальному анализу или построению маршрутов.






















