我有
形式的列表[[x1,.....,x8],[x1,.......,x8],...............,[x1,。 .... x [8]]]。该列表中的列表数量可达一百万。每个列表都有4个gps坐标,显示矩形的四个点(假设每个段都是矩形)。
问题:给定一个新点,我需要确定该点落在哪个段上并创建一个新点,如果它不属于任何一个段。我现在没有将数据上传到MySQL,它是一个简单的文本文件。我找到了任何给定汽车的文本文件中的坐标。
我尝试过:我正在考虑使用R树来查找接近给定点的所有点。 (最近= = 200米)。但即使在R树中,似乎也有太多的选择。 R,R *,希尔伯特。
Q1。哪一个应该选择?
Q2。有没有比R-tree更好的选择?可以通过在列表中更快地搜索来完成某些事情吗?
非常感谢。
[{a1:[........]},{a2:[.......]},{a3:[.........]} ,. ......,{a20:[.....]}]。
答案 0 :(得分:1)
问题是否“找到某个点是否属于2D空间中的某个矩形”?
那可以在尺寸上分开,不是吗?给每个矩形一个ID,然后分成一维范围列表((id, x0, x1)
,(id, y0, y1)
)并找到该点落入的两个维度中的所有范围。(我很确定有非常有效的算法。哎呀,你甚至可以利用sqlite。)然后只要你得到的ID集相交,你应该找到点落入的所有矩形,如果有的话。 (当然,如果任何一个单维查询都没有返回任何结果,您可以提前退出。)
不确定这是否比R树或other spatial indexes更快或更聪明。希望这无论如何都有帮助。
答案 1 :(得分:0)
import random as ra
# my _data will hold tuples of gps readings
# under the key of (row,col), knowing that the size of
# the row and col is 10, it will give an overall grid coverage.
# Another dict could translate row/col coordinates into some
# more usefull region names
my_data = {}
def get_region(x,y,region_size=10):
"""Build a tuple of row/col based on
the values provided and region square dimension.
It's for demonstration only and it uses rather naive calculation as
coordinate / grid cell size"""
row = int(x / region_size)
col = int(y / region_size)
return (row,col)
#make some examples and build my_data
for loop in range(10000):
#simule some readings
x = ra.choice(range(100))
y = ra.choice(range(100))
my_coord = get_region(x,y)
if my_data.get(my_coord):
my_data[my_coord].append((x,y))
else:
my_data[my_coord]= [(x,y),]
print my_data