python rtree包查找三維空間下的最近設備
阿新 • • 發佈:2018-09-28
prop 2個 inter 必須 字符 創建 attr 情況下 mage
rtree模塊有2個常用的類:rtree.index.Index和rtree.index.Property。其中rtree.index.Index用於進行數據操作,rtree.index.Property用於對index進行屬性的設定。
當用rtree包進行三維及以上的維度索引數據到磁盤時會創建倆個索引文件,Rtree默認使用擴展名dat和idx。可以使用rtree.index.Property.dat_extension和rtree.index.Property.idx_extension來控制索引文件的擴展名。其中.idx是索引文件,.dat是數據文件
下面是簡單的實例:
from rtree import index
class RtreeCase():
def __init__(self):
self.p = index.Property()
self.p.dimension = 3
self.p.dat_extension = ‘data‘
self.p.idx_extension = ‘index‘
self.idx3d = index.Index(‘case’,properties=self.p)
self.idx3d.insert(1, (0, 60, 23))
self.idx3d.insert(2, (0, 60, 24))
self.idx3d.insert(3, (0, 60, 25))
self.idx3d.insert(4, (0, 60, 26))
self.idx3d.insert(5, (0, 60, 27))
def handle(self,width,num):
res=list(self.idx3d.nearest(width,num))
return res
def main():
ass=RtreeCase()
print(ass.handle((0,60,25),3))
print(ass.handle((0,60,1),2))
if __name__ == ‘__main__‘:
main()
在上面實例中,通過rtree.index.Property.dimension = 3確定index的屬性為三維數據,通過rtree.index.Index.insert()來插入數據,insert方法中需要傳遞倆個參數,第一個為一個長整數,表示這條數據的id,
但這裏的id可以重復。第二個參數是一個元祖表示數據的位置。所有函數的坐標排序對索引的交錯數據成員都很敏感 。如果 interleaved為False,則坐標必須采用[xmin,xmax,ymin,ymax,...,...,kmin,kmax]的形式。
如果 interleaved為True,則坐標必須采用[xmin,ymin,...,kmin,xmax,ymax,...,kmax]的形式。
插入一個點,即left == right && top == bottom,將基本上將單個點條目插入到索引中,而不是復制額外的坐標並插入它們。但是,沒有明確插入單個點的快捷方式。
rtree.index.Index()是創建一個rtree實例,可以傳倆個參數,第一個參數是字符型表示生成的索引文件的名稱,第二個參數為properties=P,表示將rtree.index.Property定義的屬性
傳遞給index對象。
rtree.index.nearest()可以獲取離目標點位距離最近的幾條數據,該方法有倆個參數,第一個參數是輸入一個元祖即目標的坐標。第二個參數是一個整型,表示要返回幾個坐標。例如如果第二個參數為1時
只會返回離他最近的一條數據的id,沒錯返回的是插入時輸入的第一個參數。但當離他最近的數據有多條時,這些數據都會被返回,哪怕你設置的第二個參數為1。
第一次運行的結果為:
找出了對應的數據id,並且生成了索引文件。但如果重新執行一遍會發現輸出結果為:
天啊!一樣的代碼,為何結果不一樣?造成這個結果的罪魁禍首是第一次生成的索引文件,默認情況下,如果文件系統中已存在上述示例中具有給定名稱rtree的索引文件,則它將以追加模式打開而不能重新創建。可以使用可以賦予rtree.index.Index構造函數的index屬性的rtree.index.Property.overwrite屬性來控制此行為 。
當然也可以在創建index實例時,第一個參數即字符型索引文件名稱那個不寫,就不會生成索引文件了,自然也就不會造成結果的追加。
python rtree包查找三維空間下的最近設備