我有一个数据帧(称为A),带有一组GPS纬度/经度坐标
Lat | Long
28.6752213, 77.09311140000001
基本上是一个网格,具有四个角的经/纬度坐标。
问题
我需要为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
答案 0 :(得分:1)
您的8个坐标每个仅包含4个唯一值:2个纬度(形成每个框的顶部和底部边界,或者北和南边界)和两个经度(左边界和右边界,西风和东风)。在4个角的4个(纬度,经度)组合之间,您会看到重复的值。您只需将位置与4个边界进行比较,纬度应介于两个纬度边界之间(或在两个纬度边界上),而经度应介于两个经度边界之间。
因此,您可以简单地根据纬度的top_*_lat
和bottom_*_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只是进行了简单的几何点约束测试,并假设您的边界框没有越过反子午线(国际日期变更线),也没有与任一极点重叠。
您必须对输入数据框中的每个位置执行此操作;熊猫无法基于任意表达式合并数据框(尚未)。您可以按两个坐标之一对输入进行分组,以生成与该坐标相匹配的行的子集,然后在每个组的第二个坐标处进一步过滤它们。
如果您的输入数据帧也很大,那么使用数据库进行这种联接可能会更好。