Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在多段线中查找点-python_Python_Python 2.7_Polyline_Shapely_Point In Polygon - Fatal编程技术网

在多段线中查找点-python

在多段线中查找点-python,python,python-2.7,polyline,shapely,point-in-polygon,Python,Python 2.7,Polyline,Shapely,Point In Polygon,我有一个道路名称的形状文件,实际上是多段线几何图形。我也有地址点,我试图用多段线形状文件找到每个地址点的道路名称。有办法解决这个问题吗?我使用了空间连接,不幸的是,它不起作用,因为多段线几何图形将不具有所有的点。有人能建议如何解决这个问题吗 因为没有人回答这个问题,所以进一步阐述这个问题。所以我有一个具有多个多边形线坐标的shapefile(每个线串都有一条线的最小和最大坐标,如下所示) 我需要找出点(168.04665153,-44.3990252)是否在由上述坐标构成的线上。如果需要进一步的

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

因为没有人回答这个问题,所以进一步阐述这个问题。所以我有一个具有多个多边形线坐标的shapefile(每个线串都有一条线的最小和最大坐标,如下所示)

我需要找出点(168.04665153,-44.3990252)是否在由上述坐标构成的线上。如果需要进一步的细节,请告诉我。很乐意解释


提前谢谢。

我认为问题在于找到离每个点最近的街道。您可以使用
GeoPandas.read_file()
导入形状文件,然后使用以下函数查找街道名称。为了便于说明,我将创建一个虚拟地理数据框架,但如果您能提供数据样本,人们回答您的问题会更容易。 该函数的工作原理如下:首先,在
点周围创建一个缓冲区,然后获取该圆内的每一行(
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'

此解决方案速度不快,您可以使用
空间索引
(请参阅)使其更快。我已经回答了一个类似的问题。

谢谢你的回答。我今天要试试这个。然而我的观点是狭义的,狭义的。在进行此操作之前,是否必须投影坐标系?如果可能的话,你能在这个脚本上添加rtree索引吗?shapely假设笛卡尔坐标。我建议您投影数据以避免错误。如果您按照教程或其他链接中的步骤操作,那么添加空间索引应该非常容易。如果您在实施过程中遇到具体问题,我很乐意为您提供帮助。
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'