Example #1
0
    def path(self, slon, slat, dlon, dlat, time):
        u_obj = []
        #Creates the union of all used objectives
        for p in paths_array:
            for o in p['objectives'] :
                if not o in u_obj:
                    u_obj.append( o )
        u_obj = self.sort_objectives( u_obj )
        p = tuple()
        c = self.analyse_date( time )
        #Call martins with the sorted objectives
        for y in paths_array:
            s = self.g.match( y['starting_layer']['name'], float(slon), float(slat))
            d = self.g.match( y['destination_layer']['name'], float(dlon), float(dlat))
            tmp = y['objectives']
            tmp = self.sort_objectives( tmp )
            t = len( tmp )
            print c['seconds'], c['days']
            if t == 0:
                p = p + self.normalise_paths( mumoro.martins(s, d, self.g.graph,c['seconds'], c['days']),[],u_obj )
            elif t == 1:
                p = p + self.normalise_paths( mumoro.martins(s, d, self.g.graph,c['seconds'], c['days'], tmp[0] ), [ tmp[0] ], u_obj )
            elif t == 2:
                p = p + self.normalise_paths( mumoro.martins(s, d, self.g.graph,c['seconds'], c['days'], tmp[0], tmp[1] ), [ tmp[0], tmp[1] ], u_obj )
            elif t >= 3:
                p = p + self.normalise_paths( mumoro.martins(s, d, self.g.graph,c['seconds'], c['days'], tmp[0], tmp[1], tmp[2] ), [ tmp[0], tmp[1], tmp[2] ], u_obj )
        #Creates the array containing the user-oriented string for each objective
        str_obj = ['Duration']
        for j in u_obj:
            if j == mumoro.dist:
                str_obj.append( 'Distance' )
            elif j == mumoro.cost:
                str_obj.append( 'Cost' )
            elif j == mumoro.elevation:
                str_obj.append( 'Elevation ' )
            elif j == mumoro.co2:
                str_obj.append( 'CO2 Emission' )
            elif j == mumoro.mode_change:
                str_obj.append( 'Mode Change' )
            elif j == mumoro.line_change:
                str_obj.append( 'Line Change' )
        cherrypy.response.headers['Content-Type']= 'application/json'
        if len(p) == 0:
            return json.dumps({'error': 'Impossible de calculer un itinéraire'})
        print "Len of routes " + str( len( p ) )
        print "len of first route " + str (len (p[0].nodes))
#        print "route " + p[0].nodes[0]
        ret = {
                'objectives': str_obj,
                'paths': []
                }
        for path in p:
            p_str = {
                    'cost': [],
                    'type': 'FeatureCollection',
                    'crs': {
                        'type': 'EPSG',
                        'properties': {
                            'code': 4326,
                            'coordinate_order': [1,0]
                            }
                        }
                    }
            for c in path.cost:
                p_str['cost'].append(c)

            features = []
            markers = []
            last_marker = None
            feature = {'type': 'feature'}
            geometry = {'type': 'Linestring'}
            coordinates = []
            last_node_id = path.nodes[0]
            last_coord = self.g.coordinates(last_node_id)
            last_layer = self.g.layer_object(last_node_id)
            last_node = last_layer.node(last_node_id)
            last_layer_name = last_coord[3]
            for node_id in path.nodes:
                coord = self.g.coordinates(node_id)
                layer_name = coord[3]
                layer = self.g.layer_object(node_id)
                node = layer.node(node_id)
                if(last_layer_name != layer_name):
                    geometry['coordinates'] = coordinates
                    feature['geometry'] = geometry
                    feature['properties'] = {'layer': last_layer.layer_name()}
                    # print "moo", last_node.route
                    feature['properties']['icon'] = last_layer.icon(last_node)
                    feature['properties']['color'] = last_layer.color(last_node)

                    features.append(feature)

                    feature = {'type': 'feature'}
                    geometry = {'type': 'Linestring'}
                    coordinates = []

                    connection = {
                            'type': 'feature',
                            'geometry': {
                                'type': 'Linestring',
                                'coordinates': [[last_coord[0], last_coord[1]], [coord[0], coord[1]]]
                                },
                            'properties': {'layer': 'connection'}
                            }
                    features.append(connection)
                    if last_layer.mode == mumoro.PublicTransport and last_layer != None:
                        # complete last marker
                        last_marker["properties"]["dest_stop_area"] = last_layer.stop_area(last_node.original_id).name
                    elif last_layer.mode == mumoro.Bike and last_layer != None:
                        bike_station = last_layer.bike_station(last_node)
                        if bike_station:
                            last_marker["properties"]["dest_station_name"] = bike_station.name
                    if layer.mode == mumoro.PublicTransport:
                        last_marker = {"type":"Feature",
                                       "geometry":{"type":"Point",
                                                   "coordinates": [coord[0],
                                                                   coord[1]]},
                                       "properties": { "line": node.route,
                                                       "layer": "marker",
                                                       "headsign": node.headsign,
                                                       "marker_icon": 
                                                       layer.marker_icon(node),
                                                       "line_icon": 
                                                       layer.icon(node),
                                                       "line_name":
                                                           layer.line(node).long_name,
                                                       "stop_area": 
                                                       layer.
                                                       stop_area(node.
                                                                 original_id).
                                                       name,
                                                       "type": "bus_departure"}}
                        markers.append(last_marker)
                    elif layer.mode == mumoro.Bike:
                        bike_station = layer.bike_station(node)
                        if bike_station:
                            last_marker = {"type":"Feature",
                                           "geometry":{"type":"Point",
                                                       "coordinates": [coord[0],
                                                                       coord[1]]},
                                           "properties": { "layer": "marker",
                                                           "marker_icon": 
                                                           layer.marker_icon(node),
                                                           "bikes_av": bike_station.av_bikes,
                                                           "slots_av": bike_station.av_slots,
                                                           "station_name": bike_station.name,
                                                           "type": "bike_departure"}}
                            markers.append(last_marker)
                        
                    last_layer_name = layer_name
                    last_layer = layer
                last_node = node
                last_node_id = node_id
                last_coord = coord
                coordinates.append([coord[0], coord[1]])
            geometry['coordinates'] = coordinates
            feature['geometry'] = geometry
            feature['properties'] = {'layer': last_layer.layer_name()}
            feature['properties']['icon'] = last_layer.icon(last_node)
            feature['properties']['color'] = last_layer.color(last_node)
            features.append(feature)
            features.extend(markers)
            p_str['features'] = features
            ret['paths'].append(p_str)
        return json.dumps(ret)
Example #2
0
    def path(self, slon, slat, dlon, dlat, time):
        u_obj = []
        #Creates the union of all used objectives
        for p in paths_array:
            for o in p['objectives'] :
                if not o in u_obj:
                    u_obj.append( o )
        u_obj = self.sort_objectives( u_obj )
        p = tuple()
        c = self.analyse_date( time )
        #Call martins with the sorted objectives
        for y in paths_array:
            s = self.g.match( y['starting_layer']['name'], float(slon), float(slat))
            d = self.g.match( y['destination_layer']['name'], float(dlon), float(dlat))
            obj = y['objectives']
            eps = y['epsilon']
            nb_obj = len( obj )
            print c['seconds'], c['days']
            if eps == None:
                if nb_obj == 0:
                    p = p + self.normalise_paths( mumoro.martins(s, d, self.g.graph,c['seconds'], c['days']),[],u_obj )
                elif nb_obj == 1:
                    p = p + self.normalise_paths( mumoro.martins(s, d, self.g.graph,c['seconds'], c['days'], obj[0] ), [ obj[0] ], u_obj )
                elif nb_obj == 2:
                    p = p + self.normalise_paths( mumoro.martins(s, d, self.g.graph,c['seconds'], c['days'], obj[0], obj[1] ), [ obj[0], obj[1] ], u_obj )
                elif nb_obj >= 3:
                    p = p + self.normalise_paths( mumoro.martins(s, d, self.g.graph,c['seconds'], c['days'], obj[0], obj[1], obj[2] ), [ obj[0], obj[1], obj[2] ], u_obj )
            else:
                if nb_obj == 0:
                    p = p + mumoro.martins(s, d, self.g.graph,c['seconds'], c['days'])
                elif nb_obj == 1:
                    p = p + self.normalise_paths(mumoro.relaxed_martins(s, d, self.g.graph,c['seconds'], c['days'], obj[0], eps[0]) , [ obj[0] ], u_obj )
                elif nb_obj == 2:
                    p = p + self.normalise_paths(mumoro.relaxed_martins(s, d, self.g.graph,c['seconds'], c['days'], obj[0], eps[0], obj[1], eps[1] ), [ obj[0], obj[1] ], u_obj ) 
                elif nb_obj >= 3:
                    p = p + self.normalise_paths(mumoro.relaxed_martins(s, d, self.g.graph,c['seconds'], c['days'], obj[0], eps[0], obj[1], eps[1], obj[2], eps[2] ), [ obj[0], obj[1], obj[2] ], u_obj )
            print "Longueur de p : ", len(p)
        #Creates the array containing the user-oriented string for each objective
        str_obj = ['Duration']
        for j in u_obj:
            if j == mumoro.dist:
                str_obj.append( 'Distance' )
            elif j == mumoro.cost:
                str_obj.append( 'Cost' )
            elif j == mumoro.elevation:
                str_obj.append( 'Elevation ' )
            elif j == mumoro.co2:
                str_obj.append( 'CO2 Emission' )
            elif j == mumoro.mode_change:
                str_obj.append( 'Mode Change' )
            elif j == mumoro.line_change:
                str_obj.append( 'Line Change' )
            elif j == mumoro.penibility:
                str_obj.append( 'Penibility' )
        cherrypy.response.headers['Content-Type']= 'application/json'
        if len(p) == 0:
            return json.dumps({'error': 'Impossible de calculer un itinéraire'})

        ret = {'objectives': str_obj,
               'paths': []}

        def layer_split(l,x):
            if(len(l[-1]) == 0):
                l[-1].append(x)
            elif(l[-1][-1][1] == x[1]):
                if (l[-1][-1][1].mode == mumoro.PublicTransport and
                    l[-1][-1][0].route != x[0].route):
                    l.append([x])
                else:
                    l[-1].append(x)
            else:
                l.append([x])
            return l
                        
        for path in p:
            p_str = {
                    'cost': [],
                    'type': 'FeatureCollection',
                    'crs': {
                        'type': 'EPSG',
                        'properties': {
                            'code': 4326,
                            'coordinate_order': [1,0]
                            }
                        }
                    }
            for cost in path.cost:
                p_str['cost'].append(cost)

            it = reduce(layer_split, 
                        [[self.g.layer_object(node_id).node(node_id), 
                          self.g.layer_object(node_id), 
                          node_id] for node_id in path.nodes],
                        [[]])
            features = [{'type': 'feature',
                         'geometry':  {'type': 'Linestring',
                                       'coordinates': [[node[0].lon, node[0].lat] for node in seq]},
                         'properties': {'layer': seq[0][1].layer_name(),
                                        'icon': seq[0][1].icon(seq[0][0]),
                                        'color': seq[0][1].color(seq[0][0])}}
                        for seq in it]
            # Si l'itinéraire inclus un trajet en bus, on va calculer les
            # horaires
            if (reduce(lambda v,seq: v or seq[0][1].mode == mumoro.PublicTransport,
                       it, False)):
                it_times = reduce(lambda v,seq: 
                                  v + [self.g.get_duration(v[-1][-1], 
                                                          [n[2] for n in seq], 
                                                          c['days'])],
                                  it,
                                  [[c['seconds']]])
                it_times.pop(0)

                features.extend([ {"type":"Feature",
                                   "geometry":{"type":"Point",
                                               "coordinates": [seq[0][0].lon,
                                                               seq[0][0].lat]},
                                   "properties": { "line": seq[0][0].route,
                                                   "layer": "marker",
                                                   "headsign": seq[0][0].headsign,
                                                   "marker_icon": 
                                                   seq[0][1].marker_icon(seq[0][0]),
                                                   "line_icon": 
                                                   seq[0][1].icon(seq[0][0]),
                                                   "start_time": it_time[0],
                                                   "arrival_time": it_time[1],
                                                   "line_name":
                                                       seq[0][1].line(seq[0][0]).long_name,
                                                   "stop_area": 
                                                   seq[0][1].
                                                   stop_area(seq[0][0].original_id).name,
                                                   "dest_stop_area": seq[-1][1].stop_area(seq[-1][0].original_id).name,
                                                   "type": "bus_departure"}} for seq,it_time in zip(it,it_times) if seq[0][1].mode == mumoro.PublicTransport])

            features.extend([{"type":"Feature",
                              "geometry":{"type":"Point",
                                          "coordinates": [seq[0][0].lon,
                                                          seq[0][0].lat]},
                              "properties": { "layer": "marker",
                                              "marker_icon": seq[0][1].marker_icon(seq[0][0]),
                                              "bikes_av": seq[0][1].bike_station(seq[0][0]).av_bikes,
                                              "slots_av": seq[0][1].bike_station(seq[0][0]).av_slots,
                                              "station_name": seq[0][1].bike_station(seq[0][0]).name,
                                              "dest_station_name": seq[-1][1].bike_station(seq[-1][0]).name,
                                              "type": "bike_departure"}} for seq in it if seq[0][1].mode == mumoro.Bike])
            p_str['features'] = features
            ret['paths'].append(p_str)
        return json.dumps(ret)
Example #3
0
    def path(self, slon, slat, dlon, dlat, time):
        u_obj = []
        #Creates the union of all used objectives
        for p in paths_array:
            for o in p['objectives']:
                if not o in u_obj:
                    u_obj.append(o)
        u_obj = self.sort_objectives(u_obj)
        p = tuple()
        c = self.analyse_date(time)
        #Call martins with the sorted objectives
        for y in paths_array:
            s = self.g.match(y['starting_layer']['name'], float(slon),
                             float(slat))
            d = self.g.match(y['destination_layer']['name'], float(dlon),
                             float(dlat))
            tmp = y['objectives']
            tmp = self.sort_objectives(tmp)
            t = len(tmp)
            print c['seconds'], c['days']
            if t == 0:
                p = p + self.normalise_paths(
                    mumoro.martins(s, d, self.g.graph, c['seconds'],
                                   c['days']), [], u_obj)
            elif t == 1:
                p = p + self.normalise_paths(
                    mumoro.martins(s, d, self.g.graph, c['seconds'], c['days'],
                                   tmp[0]), [tmp[0]], u_obj)
            elif t == 2:
                p = p + self.normalise_paths(
                    mumoro.martins(s, d, self.g.graph, c['seconds'], c['days'],
                                   tmp[0], tmp[1]), [tmp[0], tmp[1]], u_obj)
            elif t >= 3:
                p = p + self.normalise_paths(
                    mumoro.martins(s, d, self.g.graph, c['seconds'], c['days'],
                                   tmp[0], tmp[1], tmp[2]),
                    [tmp[0], tmp[1], tmp[2]], u_obj)
        #Creates the array containing the user-oriented string for each objective
        str_obj = ['Duration']
        for j in u_obj:
            if j == mumoro.dist:
                str_obj.append('Distance')
            elif j == mumoro.cost:
                str_obj.append('Cost')
            elif j == mumoro.elevation:
                str_obj.append('Elevation ')
            elif j == mumoro.co2:
                str_obj.append('CO2 Emission')
            elif j == mumoro.mode_change:
                str_obj.append('Mode Change')
            elif j == mumoro.line_change:
                str_obj.append('Line Change')
        cherrypy.response.headers['Content-Type'] = 'application/json'
        if len(p) == 0:
            return json.dumps({'error': 'No route found'})
        print "Len of routes " + str(len(p))
        ret = {'objectives': str_obj, 'paths': []}
        for path in p:
            p_str = {
                'cost': [],
                'type': 'FeatureCollection',
                'crs': {
                    'type': 'EPSG',
                    'properties': {
                        'code': 4326,
                        'coordinate_order': [1, 0]
                    }
                }
            }
            for c in path.cost:
                p_str['cost'].append(c)

            features = []
            feature = {'type': 'feature'}
            geometry = {'type': 'Linestring'}
            coordinates = []
            last_node = path.nodes[0]
            last_coord = self.g.coordinates(last_node)
            for node in path.nodes:
                coord = self.g.coordinates(node)
                if (last_coord[3] != coord[3]):
                    geometry['coordinates'] = coordinates
                    feature['geometry'] = geometry
                    feature['properties'] = {'layer': last_coord[3]}
                    features.append(feature)

                    feature = {'type': 'feature'}
                    geometry = {'type': 'Linestring'}
                    coordinates = []

                    connection = {
                        'type': 'feature',
                        'geometry': {
                            'type':
                            'Linestring',
                            'coordinates': [[last_coord[0], last_coord[1]],
                                            [coord[0], coord[1]]]
                        },
                        'properties': {
                            'layer': 'connection'
                        }
                    }
                    features.append(connection)
                last_node = node
                last_coord = coord
                coordinates.append([coord[0], coord[1]])
            geometry['coordinates'] = coordinates
            feature['geometry'] = geometry
            feature['properties'] = {'layer': last_coord[3]}
            features.append(feature)
            p_str['features'] = features
            ret['paths'].append(p_str)
        return json.dumps(ret)
Example #4
0
    def path(self, slon, slat, dlon, dlat, time):
        u_obj = []
        #Creates the union of all used objectives
        for p in paths_array:
            for o in p['objectives'] :
                if not o in u_obj:
                    u_obj.append( o )
        u_obj = self.sort_objectives( u_obj )
        p = tuple()
        c = self.analyse_date( time )
        #Call martins with the sorted objectives
        for y in paths_array:
            s = self.g.match( y['starting_layer']['name'], float(slon), float(slat))
            d = self.g.match( y['destination_layer']['name'], float(dlon), float(dlat))
            tmp = y['objectives']
            tmp = self.sort_objectives( tmp )
            t = len( tmp )
            print c['seconds'], c['days']
            if t == 0:
                p = p + self.normalise_paths( mumoro.martins(s, d, self.g.graph,c['seconds'], c['days']),[],u_obj )
            elif t == 1:
                p = p + self.normalise_paths( mumoro.martins(s, d, self.g.graph,c['seconds'], c['days'], tmp[0] ), [ tmp[0] ], u_obj )
            elif t == 2:
                p = p + self.normalise_paths( mumoro.martins(s, d, self.g.graph,c['seconds'], c['days'], tmp[0], tmp[1] ), [ tmp[0], tmp[1] ], u_obj )
            elif t >= 3:
                p = p + self.normalise_paths( mumoro.martins(s, d, self.g.graph,c['seconds'], c['days'], tmp[0], tmp[1], tmp[2] ), [ tmp[0], tmp[1], tmp[2] ], u_obj )
        #Creates the array containing the user-oriented string for each objective
        str_obj = ['Duration']
        for j in u_obj:
            if j == mumoro.dist:
                str_obj.append( 'Distance' )
            elif j == mumoro.cost:
                str_obj.append( 'Cost' )
            elif j == mumoro.elevation:
                str_obj.append( 'Elevation ' )
            elif j == mumoro.co2:
                str_obj.append( 'CO2 Emission' )
            elif j == mumoro.mode_change:
                str_obj.append( 'Mode Change' )
            elif j == mumoro.line_change:
                str_obj.append( 'Line Change' )
        cherrypy.response.headers['Content-Type']= 'application/json'
        if len(p) == 0:
            return json.dumps({'error': 'No route found'})
        print "Len of routes " + str( len( p ) )
        ret = {
                'objectives': str_obj,
                'paths': []
                }
        for path in p:
            p_str = {
                    'cost': [],
                    'type': 'FeatureCollection',
                    'crs': {
                        'type': 'EPSG',
                        'properties': {
                            'code': 4326,
                            'coordinate_order': [1,0]
                            }
                        }
                    }
            for c in path.cost:
                p_str['cost'].append(c)

            features = []
            feature = {'type': 'feature'}
            geometry = {'type': 'Linestring'}
            coordinates = []
            last_node = path.nodes[0]
            last_coord = self.g.coordinates(last_node)
            for node in path.nodes:
                coord = self.g.coordinates(node)
                if(last_coord[3] != coord[3]):
                    geometry['coordinates'] = coordinates
                    feature['geometry'] = geometry
                    feature['properties'] = {'layer': last_coord[3]}
                    features.append(feature)

                    feature = {'type': 'feature'}
                    geometry = {'type': 'Linestring'}
                    coordinates = []

                    connection = {
                            'type': 'feature',
                            'geometry': {
                                'type': 'Linestring',
                                'coordinates': [[last_coord[0], last_coord[1]], [coord[0], coord[1]]]
                                },
                            'properties': {'layer': 'connection'}
                            }
                    features.append(connection);
                last_node = node
                last_coord = coord
                coordinates.append([coord[0], coord[1]])
            geometry['coordinates'] = coordinates
            feature['geometry'] = geometry
            feature['properties'] = {'layer': last_coord[3]}
            features.append(feature)
            p_str['features'] = features
            ret['paths'].append(p_str)
        return json.dumps(ret)