在Python中,如何将最近的线与每个给定点关联起来?

在Python中,如何将最近的线与每个给定点关联起来?,python,pandas,gis,geopandas,shapely,Python,Pandas,Gis,Geopandas,Shapely,我有两个数据帧,第一个是命名点,列为“经度”和“纬度”,即地理坐标;第二个数据帧命名为Links,其中第一个点的列为“lon1”和“lat1”,第二个点的列为“lon2”和“lat2”,然后每行中给出的每对点创建一条链接/线。此外,对于Links数据帧,它有一个名为“link_id”的列 比如说,大约有10个点和4000个链接。如何通过返回“link\u id”并将其作为名为“closest\u link”的附加列附加到Points DataFrame,将每个给定点与最近的链接/线关联起来?以下

我有两个数据帧,第一个是命名点,列为“经度”和“纬度”,即地理坐标;第二个数据帧命名为Links,其中第一个点的列为“lon1”和“lat1”,第二个点的列为“lon2”和“lat2”,然后每行中给出的每对点创建一条链接/线。此外,对于Links数据帧,它有一个名为“link_id”的列


比如说,大约有10个点和4000个链接。如何通过返回“link\u id”并将其作为名为“closest\u link”的附加列附加到Points DataFrame,将每个给定点与最近的链接/线关联起来?

以下是一种可行的方法。考虑:

在两个数据帧点和链接之间生成叉积, 然后对新数据帧中的每一行应用一个函数。 查找函数为每个组报告的最小距离。 让我们调用新的df,PointsLinks

下面是一些采用这种方法的代码:

import pandas as pd
import random        

Points = pd.DataFrame( [ [ 1,2 ], [ 3,4 ], [ 5,6 ] ], columns = [ 'longitude', 'latitude' ] )
Links = pd.DataFrame( [ [ 'Link1', ( 4,3 ) , ( -1, -2 ) ], [ 'Link2', (10,10) , ( -5, -5 ) ] ], columns = [ 'linkid', 'lon1&lat1', 'lon2&lat2' ] )

   
print(Points) 
print(Links)         

#Step 1:  https://stackoverflow.com/questions/53699012/performant-cartesian-product-cross-join-with-pandas
def cartesian_product_basic(left, right):
    return (         
       left.assign(key=1).merge(right.assign(key=1), on='key').drop('key', 1))
   
def DistanceToLink( pointlink ): 
  return random.randrange(10)  

PointsLinks = cartesian_product_basic(Points,Links)       
print( PointsLinks ) 

#Step 2: https://stackoverflow.com/questions/26886653/pandas-create-new-column-based-on-values-from-other-columns-apply-a-function-o
PointsLinks['distance'] = PointsLinks.apply( lambda row : DistanceToLink(row), axis = 'columns' )


print( PointsLinks )

#Step 3:  Find the smallest distance per group https://stackoverflow.com/questions/27842613/pandas-groupby-sort-within-groups
closest = PointsLinks.sort_values( [ 'latitude', 'longitude', 'distance' ] , ascending = True ).groupby(  [ 'latitude', 'longitude'] ).head(1)

# Drop the unnecessary columns
closest.drop( columns = ['lon1&lat1','lon2&lat2','distance'] , inplace=True) 
print(closest)
以下是代码创建的数据帧:

要点:

   longitude  latitude
0          1         2
1          3         4
2          5         6 
链接:

  linkid lon1&lat1 lon2&lat2
0  Link1    (4, 3)  (-1, -2)
1  Link2  (10, 10)  (-5, -5)
然后在使用“应用”添加“距离”列后点链接:

   longitude  latitude linkid lon1&lat1 lon2&lat2  distance
0          1         2  Link1    (4, 3)  (-1, -2)         1
1          1         2  Link2  (10, 10)  (-5, -5)         6
2          3         4  Link1    (4, 3)  (-1, -2)         0
3          3         4  Link2  (10, 10)  (-5, -5)         9
4          5         6  Link1    (4, 3)  (-1, -2)         5
5          5         6  Link2  (10, 10)  (-5, -5)         1
我没有实现远程链接。我在那里放了一个随机数发生器。以下是第一个pointlink对象的外观,它是一个表示行的系列:

longitude           1
latitude            2
linkid          Link1
lon1&lat1      (4, 3)
lon2&lat2    (-1, -2)
现在您已经有了每个组合的距离,可以使用以下方法查找并选择距离最短的点链接对:

结果如下:

   longitude  latitude linkid
0          1         2  Link1
2          3         4  Link1
5          5         6  Link2

堆栈溢出的本质是针对编程的特定问题。这更像是一个空间分析问题,不清楚您是否已经做过任何编程,人们会从中提出修改和改进建议。如果您需要有人帮助您从头开始构建解决方案,我收取75美元/小时
   longitude  latitude linkid
0          1         2  Link1
2          3         4  Link1
5          5         6  Link2