mirror of
https://github.com/DerTyp7/osm-routing-backend-python.git
synced 2025-10-29 12:32:10 +01:00
moved from GitLab to GitHub manually
This commit is contained in:
151
routing/route.py
Normal file
151
routing/route.py
Normal file
@@ -0,0 +1,151 @@
|
||||
from sql.handle_sql import SqlHandler
|
||||
from server import osmPath, dbPath
|
||||
|
||||
# Global variables
|
||||
sql = None
|
||||
visitedWays = [] # [VisitedWay[wayId, parentWayId], [],...]
|
||||
endFound = False
|
||||
|
||||
# VisitedWays
|
||||
def pushIntoVisitedWays(way, parentWay = ""): # Appends a new VisitedWay to the visitedWay Array
|
||||
global visitedWays
|
||||
|
||||
# "new" visited way should not already exists in array (no duplicates)
|
||||
if not any(way in visitedWay for visitedWay in visitedWays):
|
||||
if parentWay != "": # check if parent is given
|
||||
visitedWays.append([way, parentWay])
|
||||
else:
|
||||
visitedWays.append([way, ""])
|
||||
|
||||
|
||||
def getOpenVisitedWays(): # Get all visited ways which have unchecked sideways.
|
||||
result = []
|
||||
openSideWays = 0 # counts how many sideways are found per vistedWay
|
||||
|
||||
for vWay in visitedWays:
|
||||
openSideWays = 0
|
||||
currentSideWays = sql.getSideWaysOfWay(vWay[0]) #
|
||||
for sideWay in currentSideWays:
|
||||
if not any(sideWay in visitedWay for visitedWay in visitedWays): # if sideway is not in visitedWays: Array
|
||||
openSideWays += 1
|
||||
|
||||
if openSideWays > 0: # if visited way has unvistited sideways
|
||||
result.append(vWay[0])
|
||||
|
||||
return result
|
||||
|
||||
def getVisitedWaybyWay(way): # Find a VisitedWay by it's way (visitedWay[0])
|
||||
result = ""
|
||||
|
||||
for visitedWay in visitedWays:
|
||||
if visitedWay[0] == way:
|
||||
result = visitedWay
|
||||
return result
|
||||
|
||||
# Reverse and build route
|
||||
def reverseRoute(endWay):
|
||||
route = []
|
||||
reversed = False
|
||||
|
||||
currentVisitedWay = getVisitedWaybyWay(int(endWay)) # Get the visitedWay object of "endway: int" from the visitedWay-array
|
||||
while reversed == False:
|
||||
if currentVisitedWay[1] != "": # if visited sideway has a parent way (visitedWays: Array[[way,parentway], ...])
|
||||
route.append(currentVisitedWay)
|
||||
currentVisitedWay = getVisitedWaybyWay(currentVisitedWay[1]) # set currentVisitedWay to parentWay
|
||||
else:
|
||||
reversed = True
|
||||
return route
|
||||
|
||||
def getRouteWayOfRoute(route):
|
||||
routeWays = []
|
||||
routeCrossingNodes = []
|
||||
counter = 0
|
||||
|
||||
for vWay in route: # Get all crossingpoints
|
||||
crossingPoint = sql.getCrossingPointOfWays(vWay[0], vWay[1])
|
||||
prevCrossingPoint = ""
|
||||
if counter > 0:
|
||||
prevCrossingPoint = routeCrossingNodes[counter-1][0]
|
||||
else:
|
||||
prevCrossingPoint = sql.getNodesOfWay(vWay[0])[0]
|
||||
|
||||
|
||||
routeWays.append({'way': vWay[0], 'startNode': prevCrossingPoint, 'endNode': crossingPoint[0]})
|
||||
routeCrossingNodes.append(crossingPoint)
|
||||
counter += 1
|
||||
return routeWays
|
||||
|
||||
def buildRoute(endWay):
|
||||
routeNodes = []
|
||||
coordinates = []
|
||||
|
||||
reversedRoute = reverseRoute(endWay)
|
||||
routeWays = getRouteWayOfRoute(reversedRoute)
|
||||
|
||||
for routeWay in routeWays:
|
||||
nodesBetweenNodes = sql.getNodesBetweenNodes(routeWay)
|
||||
for node in nodesBetweenNodes:
|
||||
routeNodes.append(node)
|
||||
|
||||
for node in routeNodes: # get all coordinates of the crossinpoints
|
||||
coordinates.append({'lon':sql.getLocOfNode(node)[0], 'lat': sql.getLocOfNode(node)[1] })
|
||||
|
||||
return coordinates
|
||||
|
||||
# Search for destination
|
||||
def checkSideWaysOfWay(way, endWay):
|
||||
global endFound
|
||||
global visitedWays
|
||||
|
||||
sideWays = sql.getSideWaysOfWay(way)
|
||||
|
||||
for sideWay in sideWays:
|
||||
|
||||
if str(sideWay) == str(endWay):
|
||||
pushIntoVisitedWays(sideWay, way)
|
||||
endFound = True
|
||||
return
|
||||
else:
|
||||
pushIntoVisitedWays(sideWay, way)
|
||||
|
||||
def searchRoute(startWay, endWay): # Main
|
||||
global sql
|
||||
global visitedWays
|
||||
global endFound
|
||||
|
||||
sql = SqlHandler(dbPath, osmPath)
|
||||
visitedWays = []
|
||||
endFound = False
|
||||
counter = 0
|
||||
|
||||
sideWays = sql.getSideWaysOfWay(startWay)
|
||||
|
||||
pushIntoVisitedWays(startWay)
|
||||
checkSideWaysOfWay(startWay, endWay)
|
||||
|
||||
for sideWay in sideWays:
|
||||
checkSideWaysOfWay(sideWay, endWay)
|
||||
|
||||
while endFound == False:
|
||||
if len(sideWays) and counter >= len(sideWays):
|
||||
counter = 0
|
||||
sideWays = getOpenVisitedWays()
|
||||
else:
|
||||
checkSideWaysOfWay(sideWays[counter], endWay)
|
||||
counter += 1
|
||||
|
||||
result = buildRoute(endWay)
|
||||
sql.conn.close()
|
||||
del sql
|
||||
return result
|
||||
|
||||
def searchRouteByCoordinates(fromWayLat, fromWayLon, toWayLat, toWayLon): # Main
|
||||
global sql
|
||||
sql = SqlHandler(dbPath, osmPath)
|
||||
fromNode = sql.getNodeByCoordinates(fromWayLat, fromWayLon)
|
||||
toNode = sql.getNodeByCoordinates(toWayLat, toWayLon)
|
||||
|
||||
fromWay = sql.getWaysOfNode(fromNode)[0]
|
||||
toWay = sql.getWaysOfNode(toNode)[0]
|
||||
del sql
|
||||
return searchRoute(fromWay, toWay)
|
||||
Reference in New Issue
Block a user