2D ポイントを rtree (ver. 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 ):
指定された座標内の指定された「id」を持つインデックスから項目を削除します。
パラメーター:
id – long integer このインデックス エントリの識別子である long integer。インデックスに挿入する ID は一意である必要はありません。ID が一意である必要がある場合は、ユーザーが一意であることを確認する必要があります。
座標– シーケンスまたは配列 ディメンション * インデックスから削除する項目の各次元の最小座標と最大座標を表す 2 つの座標ペア。それらの順序は、インデックスのインターリーブ データ メンバーによって異なります。これらは、アイテムを含む空間の座標ではなく、アイテム自体の座標です。id パラメータとともに、削除する項目を決定します。これは、numpy 配列プロトコルを満たすオブジェクトである可能性があります。
id
しかし、ご覧のとおり、指定されたが指定された座標内にないポイントが、出力の 4 行目で削除されています。
id
ドキュメントはまた、挿入または削除のいずれにおいても s が一意である必要がないことを明確に指定しています。(この例で繰り返さ0 == id
れているのは、私のアプリケーションでは重複したid
s が必要なため、意図的なものです。同じ「もの」に対して複数のポイントが必要です。)
xmin == xmax
また、とを使用して点をインデックスできることも確認しましたymin == ymax
。
ライブラリの使い方が間違っているのでしょうか、それとも libspatialindex (Python rtree の背後にあるバイナリ ライブラリ) の動作が rtree ドキュメントの状態と異なるのでしょうか?