在折线中找到点 - 蟒蛇

时间:2017-08-13 04:35:35

标签: python python-2.7 polyline shapely point-in-polygon

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

由于没有人回答这个问题,所以进一步阐述了这个问题。所以我的shapefile有多个多义线坐标(每个行字符串都有一行的最小和最大坐标,如下所示)

        min      max
x 168.04510 168.0480
y -44.39949 -44.3987

我需要找出点(168.04665153,-44.3990252)是否在上面坐标的线上。如果需要进一步的细节,请告诉我。很高兴解释。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我认为问题实际上是找到每个点最近的街道。您可以使用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