Я пытался создать профили поперечного сечения реки на основе точечных измерений. При попытке создать Shapely LineString
из серии точек с общим идентификатором я понял, что порядок заданных точек действительно имеет значение, так как LineString
просто соединяет заданные точки «indexwise» (точек подключения в указанном списке) , Ниже код иллюстрирует поведение по умолчанию:Самый короткий путь между многими двумерными точками (коммивояжер в Shapely LineString?)
from shapely.geometry import Point, LineString
import geopandas as gpd
import numpy as np
import matplotlib.pyplot as plt
# Generate random points
x=np.random.randint(0,100,10)
y=np.random.randint(0,50,10)
data = zip(x,y)
# Create Point and default LineString GeoSeries
gdf_point = gpd.GeoSeries([Point(j,k) for j,k in data])
gdf_line = gpd.GeoSeries(LineString(zip(x,y)))
# plot the points and "default" LineString
ax = gdf_line.plot(color='red')
gdf_point.plot(marker='*', color='green', markersize=5,ax=ax)
Это будет производить изображение:
Вопрос: Есть ли встроенный метод в стройную, который автоматически создает наиболее логический (ака: кратчайший, наименее сложный, наименьший крест-крест, ...) через данный список случайных двумерных точек?
Ниже вы можете найти нужную строку (зеленый) по сравнению с по умолчанию (красный).
Предполагая, что вы не знаете порядок или соседей раньше времени, вы могли бы попробовать строить граф, который соединяет каждый узел с любым другим узлом, а затем искать «простых путей» и выбрать путь с таким же номером шагов как количество узлов, затем выберите самый короткий из них? Это потребует нечто вроде ['all_simple_paths'] (https://networkx.readthedocs.io/en/stable/reference/generated/networkx.algorithms.simple_paths.all_simple_paths.html#networkx.algorithms.simple_paths.all_simple_paths) в networkX , – shongololo
Ничего себе, выглядит многообещающе! Посмотрите на это. –
небольшая коррекция: длина пути будет узлом - 1 – shongololo