Ejemplo n.º 1
0
 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)	
Ejemplo n.º 2
0
    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))
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
	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))		
Ejemplo n.º 5
0
    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)