【发布时间】:2014-12-26 17:57:40
【问题描述】:
我正在尝试将 2D 点存储在 rtree(版本 0.8.2)中,然后使用 Python 删除它们。我知道 rtree 适用于矩形(或 3D 框),但我猜点是矩形的子集。
从 rtree 中删除项目时出现奇怪的行为。下面的脚本显示了这种行为:
from rtree import index as rtindex
def pt2rect(pt):
return pt[0], pt[1], pt[0], pt[1]
pts = [(0.0, 0.0), (1.0, 1.0), (0.0, 1.0)]
rt = rtindex.Index()
# Add the points
[rt.add(0, pt2rect(pt)) for pt in pts]
print [r.bbox for r in list(rt.nearest((0, 0), 10, True))]
# Remove the same points
for pt in pts:
rt.delete(0, pt2rect(pt))
print pt2rect(pt), [r.bbox for r in list(rt.nearest((0, 0), 10, True))]
输出是:
True
[[0.0, 0.0, 0.0, 0.0], [0.0, 1.0, 0.0, 1.0], [1.0, 1.0, 1.0, 1.0]] # Whole index
(0.0, 0.0, 0.0, 0.0) [[0.0, 1.0, 0.0, 1.0], [1.0, 1.0, 1.0, 1.0]] # <-- Ok
(1.0, 1.0, 1.0, 1.0) [[1.0, 1.0, 1.0, 1.0]] # <-- Wrong point deleted!
(0.0, 1.0, 0.0, 1.0) [[1.0, 1.0, 1.0, 1.0]] # <-- Ok, as it's not found.
来自文档 (http://toblerity.org/rtree/class.html):
delete(id, coordinates) 从给定的索引中删除项目 'id' 在指定坐标内。
参数:
id – 长整数 一个长整数,它是该索引的标识符 入口。插入索引的 ID 不必是唯一的,它是 如果这是要求,则由用户确保它们是唯一的。
坐标 – 序列或数组 Dimension * 2 个坐标对, 表示项目每个维度的最小和最大坐标 从索引中删除。他们的顺序将取决于 索引的交错数据成员。这些不是坐标 包含项目的空间,但项目本身的空间。和...一起 id 参数,它们确定将删除哪个项目。这可能 是满足numpy数组协议的对象。
但是可以看出,在输出的第 4 行中删除了具有给定 id 但不在给定坐标内的点。
文档还明确指出ids 在插入或删除中不需要是唯一的。 (示例中重复的0 == id 是故意的,因为我的应用程序需要重复的ids。同一“事物”的多个点。)
还确认可以使用xmin == xmax 和ymin == ymax 对点进行索引。
是我使用了错误的库,还是 libspatialindex(Python rtree 背后的二进制库)的行为与 rtree 文档状态不同?
【问题讨论】: