python rtree包查找三維空間下的最近設備

rtree模塊有2個經常使用的類:rtree.index.Index和rtree.index.Property。其中rtree.index.Index用於進行數據操做,rtree.index.Property用於對index進行屬性的設定。html

當用rtree包進行三維及以上的維度索引數據到磁盤時會建立倆個索引文件,Rtree默認使用擴展名dat和idx。可使用rtree.index.Property.dat_extension和rtree.index.Property.idx_extension來控制索引文件的擴展名。其中.idx是索引文件,.dat是數據文件函數

下面是簡單的實例:spa

 from rtree import index3d

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,而且生成了索引文件。但若是從新執行一遍會發現輸出結果爲:rest

  天啊!同樣的代碼,爲什麼結果不同?形成這個結果的罪魁禍首是第一次生成的索引文件,默認狀況下,若是文件系統中已存在上述示例中具備給定名稱rtree的索引文件,則它將以追加模式打開而不能從新建立。可使用能夠賦予rtree.index.Index構造函數的index屬性rtree.index.Property.overwrite屬性來控制此行爲 code

  固然也能夠在建立index實例時,第一個參數即字符型索引文件名稱那個不寫,就不會生成索引文件了,天然也就不會形成結果的追加。htm

相關文章
相關標籤/搜索