Files
rtree/src/rangequeries.py
2022-04-14 17:58:28 +03:00

60 lines
1.9 KiB
Python

import sys
import ast
from mbr import MBR, Node
# Read R-Tree from data
def parse_tree(filename):
with open(filename, 'r') as f:
nodes = []
for line in f:
node = ast.literal_eval(line)
mbrs = []
for mbr in node[2]:
mbrs.append(MBR(int(mbr[0]), float(mbr[1][0]), float(mbr[1][1]),
float(mbr[1][2]), float(mbr[1][3])))
nodes.append(Node(node[0], node[1], mbrs))
return nodes
# Read and execute all the range queries
def parse_query(rtree, filename):
with open(filename, 'r') as f:
i = 0
for line in f:
[xlow, ylow, xhigh, yhigh] = line.split()
results = []
range_query(rtree, MBR(int(i), float(xlow), float(xhigh),
float(ylow), float(yhigh)), results)
print("{} ({}):".format(i, len(results)), end=' ')
for r in range(len(results) - 1):
print("{},".format(results[r].id), end='')
if len(results) != 0:
print(results[-1].id)
else:
print(' ')
i += 1
# Find the intersecting rectangles
def range_query(rtree, window, results, node=None):
# At the root node
if node == None:
node = rtree[-1]
for n in node.list_of_mbrs:
if window.intersects(n) or n.intersects(window):
range_query(rtree, window, results, rtree[n.id])
# At an intermediate node
elif node.leaf == 1:
for n in node.list_of_mbrs:
if window.intersects(n) or n.intersects(window):
range_query(rtree, window, results, rtree[n.id])
# At a leaf node
else:
for mbr in node.list_of_mbrs:
if window.intersects(mbr) or mbr.intersects(window):
results.append(mbr)
if __name__ == '__main__':
rtree = parse_tree(sys.argv[1])
parse_query(rtree, sys.argv[2])