【发布时间】:2017-05-21 01:35:09
【问题描述】:
我试图根据点地面测量创建河流横截面剖面。当尝试从具有公共 ID 的一系列点创建 Shapely LineString 时,我意识到给定点的顺序确实很重要,因为 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)
这将产生图像:
问题: Shapely 中是否有任何内置方法可以自动创建最合乎逻辑的(又名:最短、最不复杂、最不交叉,...) 穿过给定的随机二维点列表?
您可以在下面找到与默认行(红色)相比所需的行(绿色)。
【问题讨论】:
-
假设您事先不知道顺序或邻居,您可以尝试构建一个将每个节点连接到每个其他节点的图,然后搜索“简单路径”并选择带有与节点数相同的步数,然后选择其中最短的?这将需要 networkX 中的
all_simple_paths之类的东西。 -
哇,看起来很有希望!将对此进行调查。
-
小修正:路径长度为节点 - 1
标签: python shapely geopandas multilinestring