查找一对GPS坐标所属的行的有效方法

时间:2019-07-08 17:39:28

标签: python pandas geo

我有一个数据帧(称为A),带有一组GPS纬度/经度坐标

Lat | Long
28.6752213, 77.09311140000001

我还有另一种格式的CSV(行多,超过一百万,称为B) enter image description here

基本上是一个网格,具有四个角的经/纬度坐标。

问题

我需要为A中的每一行找到它在B中所包围的那行(非唯一)。像在B中,gps坐标位于框中,如B中的行所描述。我有一个函数当得到A的坐标和B中的行的坐标时,返回True/False

现在,我正在执行蛮力方法,遍历整个B数据框,并检查每一行是否属于该框。但是,这效率极低而且非常慢。

我确信必须有更好的方法,因为这是一个普遍的问题。谁能指出我的意思?

谢谢! :)

编辑:

函数im用于查找特定gps_coord是否在行定义的框中的代码

import matplotlib.path as path
def find_if_point_in_bounding_box(row,gps_coords):
    top_left_lat = row['top_left_lat']
    top_left_long = row['top_left_long']
    top_right_lat = row['top_right_lat']
    top_right_long = row['top_right_long']
    bottom_left_lat = row['bottom_left_lat']
    bottom_left_long = row['bottom_left_long']
    bottom_right_lat = row['bottom_right_lat']
    bottom_right_long = row['bottom_right_long']

    lat,long = gps_coords
     # create box
    p = path.Path([(top_left_lat, top_left_long),(top_right_lat,top_right_long),(bottom_left_lat,bottom_left_long),(bottom_right_lat,bottom_right_long)])
    res = p.contains_points([(lat,long)])[0]
    return res

1 个答案:

答案 0 :(得分:1)

您的8个坐标每个仅包含4个唯一值:2个纬度(形成每个框的顶部和底部边界,或者北和南边界)和两个经度(左边界和右边界,西风和东风)。在4个角的4个(纬度,经度)组合之间,您会看到重复的值。您只需将位置与4个边界进行比较,纬度应介于两个纬度边界之间(或在两个纬度边界上),而经度应介于两个经度边界之间。

因此,您可以简单地根据纬度的top_*_latbottom_*_lat中的每一个,以及*_left_long*_right_long中的每一个,询问具有匹配边界框的行经度:

lat, long = <latitude>, <longitude>
matching_rows = df.query(
    # top and bottom latitudes, top lat > bottom lat, north to south
    "top_left_lat >= @lat >= bottom_right_lat and "
    # left and right longitudes, left long < right long, west to east
    "top_left_long <= @long <= bottom_right_long"
)

上面的pandas.DataFrame.query() expression只是进行了简单的几何点约束测试,并假设您的边界框没有越过反子午线(国际日期变更线),也没有与任一极点重叠。

您必须对输入数据框中的每个位置执行此操作;熊猫无法基于任意表达式合并数据框(尚未)。您可以按两个坐标之一对输入进行分组,以生成与该坐标相匹配的行的子集,然后在每个组的第二个坐标处进一步过滤它们。

如果您的输入数据帧也很大,那么使用数据库进行这种联接可能会更好。