在多段线中找到点 - python

问题描述:

我有一个道路名称的形状文件 - 实际上是折线几何。而且我也有地址点,我试图使用多段线形文件找到每个地址点的道路名称。有没有办法解决这个问题?我使用了空间连接,但不幸的是它不起作用,因为折线几何不会有所有的点。有人可以建议如何解决这个问题吗?在多段线中找到点 - python

由于没有人回答这个问题,进一步阐述了这个问题。所以我有多个多线坐标shape文件(每行字符串将有分钟,像下面的一行的最大坐标)

 min  max 
x 168.04510 168.0480 
y -44.39949 -44.3987 

我需要找出如果点(168.04665153,-44.3990252)是由上述坐标构成的线。让我知道是否需要进一步的细节。很高兴解释。

在此先感谢。

我认为问题实际上是找到每个点最近的街道。您可以使用GeoPandas.read_file()导入您的shapefile,然后使用以下函数查找街道名称。出于说明的目的,我只是想创建一个虚拟的GeoDataFrame,但如果您可以提供您的数据样本,那么人们更容易回答您的问题。 该函数的工作原理如下:首先,在Point周围创建一个缓冲区,然后获取该圆圈内的所有行(pt.buffer())。然后计算点与每条线之间的距离并选择最接近的线。

l1 = LineString([(0,0), (2,3)]) 
l2 = LineString([(2,3), (3,0)]) 
pt = Point([1.5,1]) 

df = pd.DataFrame(['street1', 'street2'], columns=['street_name'])  
gdf = gpd.GeoDataFrame(df ,geometry = [l1,l2]) 
gdf 

# street_name geometry 
#0 street1  LINESTRING (0 0, 2 3) 
#1 street2  LINESTRING (2 3, 3 0) 

def get_street_name(gdf, pt):  
    dist = [] 
    for line in gdf.intersection(pt.buffer(3)): 
     ind = gdf[gdf.geometry == line].index[0] 
     dist.append([line.distance(pt), ind]) 
    dist.sort() 
    true_line_index = dist[0][1] 
    street_name = gdf.iloc[true_line_index].loc['street_name'] 

    return street_name 

get_street_name(gdf,pt) 
# out: 'street1' 

这种解决方案并不快,你可​​以把它用更快spatial index(见here)。我已经回答了类似的问题here

+0

感谢您的回答。我今天会尝试这个。然而,我的观点是经纬度,长点。这样做之前我必须投影坐标系吗?如果可能的话,你可以在这个脚本上添加rtree索引吗? –

+0

匀称地假定笛卡尔坐标。我建议投影您的数据以避免错误。 如果您按照教程或其他链接中的步骤操作,那么添加空间索引应该相当容易。如果您在实施过程中遇到特定问题,我会很乐意提供帮助。 –

+0

@ds_user是否有效? –