def _expand_address(self, addr, roadnet, length='length' ) : # only ever done at the beginning!! options = [] # find the interval containing addr roadtree = self.get_roadtree( addr.road ) _, floor_addr = roadtree.floor_item( addr.coord ) _, ceil_addr = roadtree.ceiling_item( addr.coord ) # obtain relevant road data for addr.road u, v, roadlen = roadinfo( addr.road, roadnet ) # look left if floor_addr is None : left_boundary = ROAD.RoadAddress( addr.road, 0. ) options.append( ( u, left_boundary ) ) elif my_isaddress( floor_addr ) : options.append( ( floor_addr, floor_addr ) ) else : raise 'invalid node type' # look right if ceil_addr is None : right_boundary = ROAD.RoadAddress( addr.road, roadlen ) options.append( ( v, right_boundary ) ) elif my_isaddress( ceil_addr ) : options.append( ( ceil_addr, ceil_addr ) ) else : raise 'invalid node type' res = [] for ( targ, targ_addr ) in options : traveltime = ROAD.distance( roadnet, addr, targ_addr, length ) res.append( ( targ, traveltime ) ) return res
def find_nearest( addr ) : dist_to = lambda q : ROAD.distance( roadnet, addr, q, 'length' ) trips = [ ( dist_to(q), q ) for q in points ] return min( trips )[1]
points = [ roadprob.sampleaddress( roadnet ) for i in range(n) ] pset = PointSet() for p in points : pset.insert( p ) def find_nearest( addr ) : dist_to = lambda q : ROAD.distance( roadnet, addr, q, 'length' ) trips = [ ( dist_to(q), q ) for q in points ] return min( trips )[1] def sidebyside( addr ) : by_pset = pset.find_nearest( addr, roadnet ) by_naive = find_nearest( addr ) return by_pset, by_naive samples = 100 testpoints = [ roadprob.sampleaddress( roadnet ) for i in range(samples) ] answers = [ sidebyside( q ) for q in testpoints ] error = [ ROAD.distance( roadnet, p, q, 'length' ) for p, q in answers ]