Esempio n. 1
0
def _task_runner(task):
    (src, dt, (node_time, routing_source, routing_destination)) = task

    logger.debug(
        f"Received message at {dt} from {src} <node_time={node_time}, "
        f"routing_source={routing_source}, "
        f"routing_destination={routing_destination}>")

    start_timer = time.perf_counter()

    router = Router("car")

    start = router.findNode(routing_source[0], routing_source[1])
    end = router.findNode(routing_destination[0], routing_destination[1])

    status, route = router.doRoute(start, end)
    if status == "success":
        route_coords = [router.nodeLatLon(x) for x in route]
        encoded_route = (0, _format_route(route_coords))
    elif status == "no_route":
        encoded_route = (1, None)
    elif status == "gave_up":
        encoded_route = (2, None)
    else:
        logger.error(f"Unknown result '{status}'")
        encoded_route = (3, None)

    end_timer = time.perf_counter()
    duration = end_timer - start_timer

    encoded_route_len = 0 if encoded_route[1] is None else len(
        encoded_route[1])
    logger.debug(
        f"Job {task} took {duration} seconds with status {status} route length = {encoded_route_len}"
    )

    return (src, encoded_route, duration)
Esempio n. 2
0
class RoutingUsage:
    def __init__(self,Mode):
        self.router = Router(Mode) # Initialise it
    
    def node(self,lat,longit):
        return [lat,longit]
    
    def getRouteMultiple(self,nodesNew):
        queueNodesNewRight = []
        for index in range(0,len(nodesNew)-1):
            nodeStart = nodesNew[index]
            nodeEnd = nodesNew[index+1]
            route = self.getTheRouteBetweenTwoNodes(nodeStart[0],nodeStart[1],nodeEnd[0],nodeEnd[1])
            if len(route[0]) == 0 and route[1] > 0:
                return None
            queueNodesNewRight.append(route)
        return queueNodesNewRight
    
    def arrangeNodesDependsOnLength(self,nodes):
        for nodeStartIndex in range(0,len(nodes)-1): 
            lastDistance = self.router.distance(nodes[nodeStartIndex],nodes[nodeStartIndex+1])
            for nodeNowIndex in range(nodeStartIndex+1,len(nodes)):
                theReturnedNodeWhichisNearst=nodes[nodeStartIndex+1]
                nowLength = self.router.distance(nodes[nodeStartIndex],nodes[nodeNowIndex])
                #print(nowLength)
                theReturnedNodeIndex = nodeStartIndex
                if nowLength < lastDistance :
                    theReturnedNodeWhichisNearst = nodes[nodeNowIndex]
                    theReturnedNodeIndex = nodeNowIndex
                    lastDistance = self.router.distance(nodes[nodeStartIndex],nodes[nodeNowIndex])
            ReserveNode = nodes[nodeStartIndex+1]
            nodes[nodeStartIndex+1] = nodes[theReturnedNodeIndex]
            nodes[theReturnedNodeIndex] = ReserveNode
            #print("length: %f"%lastDistance)
        return nodes

    def getTheRouteBetweenTwoNodes(self,lat1,long1,lat2,long2):
        

        start = self.router.findNode(lat1,long1) # Find start and end nodes
        end = self.router.findNode(lat2,long2)

##        print("start : %s,   Lat: %s,  Lon: %s "% (start,lat1,long1))
##        print("end : %s,   Lat: %s,  Lon: %s "% (end,lat2,long2))
        

        status, route = self.router.doRoute(start, end) # Find the route - a list of OSM nodes

        if status == 'success':
            routeLatLons = list(map(self.router.nodeLatLon, route)) # Get actual route coordinates
            
            # list the lat/long
            queueNodes = []
            sumPath = 0
            l = len(route)
            for index, obj in enumerate(route):
                thisElement = route[index]
                newDistance = 0
                if index < l-1 :
                  nextElement = route[index+1]
                  thisElementD = [self.router.nodeLatLon(thisElement)[0],self.router.nodeLatLon(thisElement)[1]]
                  nextElementD = [self.router.nodeLatLon(nextElement)[0],self.router.nodeLatLon(nextElement)[1]]
                  newDistance = self.router.distance(nextElementD,thisElementD)
                  sumPath = sumPath + newDistance
                elif index == l -1:
                  nextElement = route[index-1]

                  
                typeData = self.router.getNodeWay(thisElement,nextElement)
                #get width Depends on the Category
                width = self.router.getRouteWidth(typeData["tag"]["highway"])

                #get width Depends on the way lanes numbers
                NumberOfLanes = typeData["tag"].get("lanes")

                #Const Lanes Width it will be 3 meter
                laneWidth = 3/12742/6*1.1 #Meter
                if NumberOfLanes != None:
                    width = int(NumberOfLanes)*laneWidth

                
                #get width Depends on the way width
                widthUnCalibrated = typeData["tag"].get("width")
                if widthUnCalibrated != None:
                    width = float(widthUnCalibrated)/12742/6*1.1

                nodeNow=self.router.nodeLatLon(thisElement)
                nodeNext=self.router.nodeLatLon(nextElement)
                queueNodes.append([route[index], nodeNow[0],nodeNow[1],width])
                if newDistance > 0.009:
                  newNodesBetween = self.router.getNumberOfNodesBetweenThose(7, nodeNow,nodeNext) 
                  for nodeBet in newNodesBetween:
                    queueNodes.append([str(index)+str(nodeBet[0])+"975", nodeBet[1],nodeBet[2],width])

            #/////////////////////////////////////////////////Shift the Nodes
            
            queueNodesNewRight = []
           
                
            for index, obj in enumerate(queueNodes):
               
                lV = len(queueNodes)
                if index < lV-1 :
                    nextElement = [queueNodes[index+1][1],queueNodes[index+1][2]]
                    nextElementId = queueNodes[index+1][0]
                    thisElement = [queueNodes[index][1],queueNodes[index][2]]
                    thisElementId = queueNodes[index][0]
                    newDistance = self.router.distance(thisElement,nextElement)
                elif index == lV -1:
                    nextElement = [queueNodes[index][1],queueNodes[index][2]]
                    thisElement = [queueNodes[index][1],queueNodes[index][2]]
                
                
                newNode = self.router.getLatLongWithNewWidth(queueNodes[index][3],newDistance, thisElement,nextElement)
                queueNodesNewRight.append([queueNodes[index][0], newNode[0],newNode[1],queueNodes[index][3]])
            return [queueNodesNewRight,sumPath]
        else:
            node1=self.node(lat1,long1)
            node2=self.node(lat2,long2)
            return [[],self.router.distance(node1,node2)]
print("Voici les nodes à suivre: ")
print()
print()
print(listeNodes)
# Pourquoi je vois des nombres ? Réponse ici: https://wiki.openstreetmap.org/wiki/Node
# Pour openstreetmap un node est un point dans l'espace et possède un id unique permettant de le reconnaitre.
# Dans le répertoires d'exécution du programme on remarque l'apparition d'un dossier tilescache. Que contient t'il ? Pourquoi en a t'on besoin ?
print()
print()
print(
    "Conversion de la liste de nodes en liste de couples (Latitude,Longitude)")
print()
print()
listeLatLon = []
for node in listeNodes:
    listeLatLon.append(router.nodeLatLon(node))
print(listeLatLon)
print()
print()

# Nous avons maintenant une liste de couple latitude longitude mais pour un humain ce n'est pas très parlant.
# On peut utiliser un service de géocodage inverse ( lat long -> adresse ) afin de connaître l'adresse de nos points.
# Un service mis à dispo par l'état: https://adresse.data.gouv.fr/api -> /reverse/
# Exemple pour le point de départ: https://api-adresse.data.gouv.fr/reverse/?lat=50.198153&lon=3.220213

print("Affichage des URLs à consulter")

urlReverseGeocoding = "https://api-adresse.data.gouv.fr/reverse/"

# Nous pouvons également utiliser google afin d'afficher les coordonnées sur une map
# https://developers.google.com/maps/documentation/urls/guide "Map Actions -> Search"