def randomSearch(self): meta = rTree.getMeta() if meta is None : return None rtree = rTree.RTree(None, None) # just a random example for now e = rTree.Entry(rTree.Rect([-91.09, 45.15],[-90.07, 46.16])) l = rtree.search(e) print "number of search results : ", len(l) , " " if len(l) > 0 : print l[0].I.boundingBoxMin, l[0].I.boundingBoxMax, l[0].nodeId print "Number of entries in tree: ", rTree.countEntries(rtree.root)
def get(self): # Get channel from available pool q = ChannelPool.all().filter('in_use = ', False) ch = q.get() if not ch: client_id = getID(); token = channel.create_channel(client_id, duration_minutes = 1440) expire = datetime.datetime.now() + datetime.timedelta(0, 1440) ch = ChannelPool(key_name = client_id, client_id=client_id, token=token, in_use=True, expire=expire) ch.put() else: now = datetime.datetime.now() for ch in q.run(): if ch.expire - now > 0: reuse = True break if reuse: client_id = ch.client_id token = ch.token ch.in_use = True ch.put() else: client_id = getID(); token = channel.create_channel(client_id, duration_minutes = 1440) expire = datetime.datetime.now() + datetime.timedelta(0, 1440) ch = ChannelPool(key_name = client_id, client_id=client_id, token=token, in_use=True, expire=expire) ch.put() showBulk = "visible" meta = rTree.getMeta() if meta is not None : showBulk = "invisible" template_values = {'token': token, 'id': client_id, 'showBulk': showBulk } template = JINJA_ENVIRONMENT.get_template('index.html') self.response.out.write(template.render(template_values))
def parseTree() : meta = rTree.getMeta() if meta is None : return (None,None, None, None) scalingFactor = 1 tree = rTree.RTree(None, None) entries = [] rTree.entryList = [] rTree.getEntries(tree.root) entries = rTree.entryList minX = 1000 minY = 1000 maxX = -1000 maxY = -1000 for e in entries : minX = min(minX, scalingFactor*e.I.boundingBoxMin[0]) maxX = max(maxX, scalingFactor*e.I.boundingBoxMax[0]) minY = min(minY, scalingFactor*-e.I.boundingBoxMin[1]) maxY = max(maxY, scalingFactor*-e.I.boundingBoxMax[1]) return (minX*(-1.0), minY*(-1.0), maxX, maxY)
def post(self): showBulk = "invisible" msg = "No bulk loading to do" meta = rTree.getMeta() rtData = memcache.get("rtree") where = self.request.get('upTo') if meta is None or memcache.get("complete") is None: fn = "RTree.pickled.top" try : f = open("RTree.pickled") fn = "RTree.pickled" f.close() except : pass #fn = "CaStreet.ascii.10k" #"USclpoint.fnl" if rtData is not None : rtree = cPickle.loads(rtData) else : rtree = bulkRTree.insertFromPickle(fn) print "Now saving to database." i = 0 j = 0 howMany = 20 if where == "" : where = 0 else : where = int(where) upTo = min(len(rtree.root.entries), where+howMany) for current in range(where, upTo): #e in rtree.root.entries : e = rtree.root.entries[current] if (type(e.child) == str) : f = open("RTree.pickled."+str(current)) e.child = cPickle.load(f) f.close() decends = False for en in e.child.entries : if type(en.child) == str : decends = True f = open(en.child) en.child = cPickle.load(f) f.close() en.child = rtree.depthSaveTree(en.child) if decends : rtree.root.entries[current].child = e.child.save() else : rtree.root.entries[current].child = rtree.depthSaveTree(e.child) i+=1 memcache.delete("rtree") memcache.add("rtree", cPickle.dumps(rtree)) if (upTo == len(rtree.root.entries)): rtree.rootKey = rtree.root.save() rtree.save() msg = "RTree bulk loading completed." memcache.add("complete", "true") ec = rTree.countEntries(rtree.root) print ec else : perc = int(100.0/len(rtree.root.entries) * upTo) msg = "RTree bulk loading: "+str(perc)+" % completed... " js = {"upTo":str(upTo), "msg":msg} self.response.out.write(simplejson.dumps(js)) return else : print msg template_values = {'id': self.request.get('client_id'), 'token': self.request.get('server_token'), 'showBulk': showBulk,'message':msg} template = JINJA_ENVIRONMENT.get_template('index.html') self.response.out.write(template.render(template_values))
def getRectangles(self, sPoint, ePoint): # Hook into R-tree code here message_template = { 'type': 'error', 'message': 'ok', 'rect': '[]' # will be a list of rectangles } meta = rTree.getMeta() if meta is None : message_template['message'] = "No RTree in database." return simplejson.dumps(message_template) try: sParts = map(float, sPoint.split(',')) eParts = map(float, ePoint.split(',')) except: message_template['message'] = "Invalid input format" return simplejson.dumps(message_template) if len(sParts) != 2 or len(eParts) != 2 : message_template['message'] = "Invalid input format" return simplejson.dumps(message_template) queryData = [sParts[0],sParts[1], eParts[0], eParts[1]] message_template['type'] = 'results' if memcache.get(str(queryData)+"-1") is None : tree = rTree.RTree(None, None) minX = min(sParts[0], eParts[0]) minY = min(sParts[1], eParts[1]) maxX = max(sParts[0], eParts[0]) maxY = max(sParts[1], eParts[1]) sEntry = make_leaf(rTree.Rect([sParts[0],sParts[1]],[sParts[0], sParts[1]]), tree) eEntry = make_leaf(rTree.Rect([eParts[0],eParts[1]],[eParts[0], eParts[1]]), tree) allRect = rTree.Entry(rTree.Rect([minX,minY],[maxX, maxY])) results = tree.search(allRect) print "RTree search completed. Number of results: ", len(results) else : d = memcache.get(str(queryData)+"-1") results = cPickle.loads(d) if len(results) > 10000 : message_template['message'] = "Selected area too large for route computation. (Exceeding 10,000 rectangles)." lst,mx,my = normalizeList(results) message_template['grect'] = self.formatResultList(lst) message_template['rect'] = self.formatResultList(["0"]) message_template['minVals'] = {'mx':mx, 'my':my} message_template['sp'] = {'x':sEntry.I.boundingBoxMin[0], 'y':sEntry.I.boundingBoxMin[1]} message_template['ep'] = {'x':eEntry.I.boundingBoxMin[0], 'y':eEntry.I.boundingBoxMin[1]} else : if memcache.get(str(queryData)+"-2") is not None : res = memcache.get(str(queryData)+"-2") gRect,mxx,myy = normalizeList(res) mx = min(mxx, mx) my = min(myy, my) else : gRect, path, mx, my = self.computePath(sEntry, eEntry, tree, results) message_template['rect'] = path message_template['grect'] = gRect message_template['minVals'] = {'mx':mx, 'my':my} message_template['sp'] = {'x':sEntry.I.boundingBoxMin[0], 'y':sEntry.I.boundingBoxMin[1]} message_template['ep'] = {'x':eEntry.I.boundingBoxMin[0], 'y':eEntry.I.boundingBoxMin[1]} return simplejson.dumps(message_template)