def pathMatch(dbServer, networkName, userName, password, shapePath, limitMap = None): # Default parameters, with explanations and cross-references to Perrine et al., 2015: pointSearchRadius = 1000 # "k": Radius (ft) to search from GTFS point to perpendicular VISTA links pointSearchPrimary = 350 # "k_p": Radius (ft) to search from GTFS point to new VISTA links pointSearchSecondary = 200 # "k_s": Radius (ft) to search from VISTA perpendicular point to previous point limitLinearDist = 3800 # Path distance (ft) to allow new proposed paths from one point to another limitDirectDist = 3500 # Radius (ft) to allow new proposed paths from one point to another limitDirectDistRev = 500 # Radius (ft) to allow backtracking on an existing link (e.g. parking lot) distanceFactor = 1.0 # "f_d": Cost multiplier for Linear path distance driftFactor = 1.5 # "f_r": Cost multiplier for distance from GTFS point to its VISTA link nonPerpPenalty = 1.5 # "f_p": Penalty multiplier for GTFS points that aren't perpendicular to VISTA links limitClosestPoints = 12 # "q_p": Number of close-proximity points that are considered for each GTFS point limitSimultaneousPaths = 8 # "q_e": Number of proposed paths to maintain during pathfinding stage maxHops = 12 # Maximum number of VISTA links to pursue in a path-finding operation # Get the database connected: print("INFO: Connect to database...", file = sys.stderr) database = vista_network.connect(dbServer, userName, password, networkName) # Read in the topology from the VISTA database: print("INFO: Read topology from database...", file = sys.stderr) vistaGraph = vista_network.fillGraph(database) # Read in the shapefile information: print("INFO: Read GTFS shapefile...", file = sys.stderr) gtfsShapes = gtfs.fillShapes(shapePath, vistaGraph.gps) # Initialize the path-finder: pathFinder = path_engine.PathEngine(pointSearchRadius, pointSearchPrimary, pointSearchSecondary, limitLinearDist, limitDirectDist, limitDirectDistRev, distanceFactor, driftFactor, nonPerpPenalty, limitClosestPoints, limitSimultaneousPaths) pathFinder.maxHops = maxHops # Begin iteration through each shape: shapeIDs = gtfsShapes.keys() "@type shapeIDs: list<int>" shapeIDs.sort() gtfsNodesResults = {} "@type gtfsNodesResults: dict<int, list<path_engine.PathEnd>>" if limitMap is not None: for shapeID in limitMap: if shapeID not in shapeIDs: print("WARNING: Limit shape ID %d is not found in the shape file." % shapeID, file = sys.stderr) for shapeID in shapeIDs: "@type shapeID: int" if limitMap is not None and shapeID not in limitMap: continue print("INFO: -- Shape ID %d --" % shapeID, file = sys.stderr) # Find the path for the given shape: gtfsNodes = pathFinder.constructPath(gtfsShapes[shapeID], vistaGraph) # File this away as a result for later output: gtfsNodesResults[shapeID] = gtfsNodes return gtfsNodesResults
def restorePathMatch(dbServer, networkName, userName, password, shapePath, pathMatchFilename): # Get the database connected: print("INFO: Connect to database...", file = sys.stderr) database = vista_network.connect(dbServer, userName, password, networkName) # Read in the topology from the VISTA database: print("INFO: Read topology from database...", file = sys.stderr) vistaGraph = vista_network.fillGraph(database) # Read in the shapefile information: print("INFO: Read GTFS shapefile...", file = sys.stderr) gtfsShapes = gtfs.fillShapes(shapePath, vistaGraph.gps) # Read the path-match file: print("INFO: Read the path-match file '%s'..." % pathMatchFilename, file = sys.stderr) with open(pathMatchFilename, 'r') as inFile: gtfsNodes = path_engine.readStandardDump(vistaGraph, gtfsShapes, inFile) "@type gtfsNodes: dict<int, list<path_engine.PathEnd>>" # Filter out the unused shapes: unusedShapeIDs = set() for shapeID in gtfsShapes.keys(): if shapeID not in gtfsNodes: del gtfsShapes[shapeID] unusedShapeIDs.add(shapeID) return (vistaGraph, gtfsShapes, gtfsNodes, unusedShapeIDs)
def restorePathMatch(dbServer, networkName, userName, password, shapePath, pathMatchFilename, useDirectDist=True): # Get the database connected: print("INFO: Connect to database...", file=sys.stderr) database = vista_network.connect(dbServer, userName, password, networkName) # Read in the topology from the VISTA database: print("INFO: Read topology from database...", file=sys.stderr) vistaGraph = vista_network.fillGraph(database, useDirectDist) # Read in the shapefile information: print("INFO: Read GTFS shapefile...", file=sys.stderr) gtfsShapes = gtfs.fillShapes(shapePath, vistaGraph.gps) # Read the path-match file: print("INFO: Read the path-match file '%s'..." % pathMatchFilename, file=sys.stderr) with open(pathMatchFilename, 'r') as inFile: gtfsNodes = path_engine.readStandardDump(vistaGraph, gtfsShapes, inFile) "@type gtfsNodes: dict<int, list<path_engine.PathEnd>>" # Filter out the unused shapes: unusedShapeIDs = set() for shapeID in compat.listkeys(gtfsShapes): if shapeID not in gtfsNodes: del gtfsShapes[shapeID] unusedShapeIDs.add(shapeID) return (vistaGraph, gtfsShapes, gtfsNodes, unusedShapeIDs)
def pathMatch(dbServer, networkName, userName, password, shapePath, limitMap = None): # Default parameters, with explanations and cross-references to Perrine et al., 2015: pointSearchRadius = 1000 # "k": Radius (ft) to search from GTFS point to perpendicular VISTA links pointSearchPrimary = 350 # "k_p": Radius (ft) to search from GTFS point to new VISTA links pointSearchSecondary = 200 # "k_s": Radius (ft) to search from VISTA perpendicular point to previous point limitLinearDist = 3800 # Path distance (ft) to allow new proposed paths from one point to another limitDirectDist = 3500 # Radius (ft) to allow new proposed paths from one point to another limitDirectDistRev = 500 # Radius (ft) to allow backtracking on an existing link (e.g. parking lot) distanceFactor = 1.0 # "f_d": Cost multiplier for Linear path distance driftFactor = 2.0 # "f_r": Cost multiplier for distance from GTFS point to its VISTA link nonPerpPenalty = 1.5 # "f_p": Penalty multiplier for GTFS points that aren't perpendicular to VISTA links limitClosestPoints = 12 # "q_p": Number of close-proximity points that are considered for each GTFS point limitSimultaneousPaths = 8 # "q_e": Number of proposed paths to maintain during pathfinding stage maxHops = 12 # Maximum number of VISTA links to pursue in a path-finding operation # Get the database connected: print("INFO: Connect to database...", file = sys.stderr) database = vista_network.connect(dbServer, userName, password, networkName) # Read in the topology from the VISTA database: print("INFO: Read topology from database...", file = sys.stderr) vistaGraph = vista_network.fillGraph(database) # Read in the shapefile information: print("INFO: Read GTFS shapefile...", file = sys.stderr) gtfsShapes = gtfs.fillShapes(shapePath, vistaGraph.gps) # Initialize the path-finder: pathFinder = path_engine.PathEngine(pointSearchRadius, pointSearchPrimary, pointSearchSecondary, limitLinearDist, limitDirectDist, limitDirectDistRev, distanceFactor, driftFactor, nonPerpPenalty, limitClosestPoints, limitSimultaneousPaths) pathFinder.maxHops = maxHops # Begin iteration through each shape: shapeIDs = compat.listkeys(gtfsShapes) "@type shapeIDs: list<int>" shapeIDs.sort() gtfsNodesResults = {} "@type gtfsNodesResults: dict<int, list<path_engine.PathEnd>>" if limitMap is not None: for shapeID in limitMap: if shapeID not in shapeIDs: print("WARNING: Limit shape ID %d is not found in the shape file." % shapeID, file = sys.stderr) for shapeID in shapeIDs: "@type shapeID: int" if limitMap is not None and shapeID not in limitMap: continue print("INFO: -- Shape ID %d --" % shapeID, file = sys.stderr) # Find the path for the given shape: gtfsNodes = pathFinder.constructPath(gtfsShapes[shapeID], vistaGraph) # File this away as a result for later output: gtfsNodesResults[shapeID] = gtfsNodes return gtfsNodesResults
def main(argv): # Initialize from command-line parameters: if (len(argv) < 1) or (argv[1].lower == "-h") or (argv[1].lower == "--help"): syntax() shapePath = argv[1] routeRestrictFilename = None if len(argv) > 1: i = 2 while i < len(argv): if argv[i] == "-x" and i < len(argv) - 1: routeRestrictFilename = argv[i + 1] i += 1 i += 1 # Create a fake GPS coordinate: graph = graph.GraphLib(0, 0) # Read in the shapefile information: print("INFO: Read GTFS shapefile...", file=sys.stderr) gtfsShapes = gtfs.fillShapes(shapePath, graph.GPS) # Filter shapes according to exclusion file: if routeRestrictFilename is not None: gtfsShapes = path_refine.filterRoutes(gtfsShapes, shapePath, gtfsShapes, routeRestrictFilename, True) # Similarity search: gtfsShapes = filterSimilarity(gtfsShapes) # Extract useful information: print("INFO: Print output...", file=sys.stderr) shapeIDs = compat.listkeys(gtfsShapes) "@type shapeIDs: list<int>" shapeIDs.sort() print( "shape_id,shape_pt_lat,shape_pt_lon,shape_pt_sequence,shape_dist_traveled" ) for shapeID in shapeIDs: "@type shapeID: int" for shapeEntry in gtfsShapes[shapeID]: "@type shapeEntry: gtfs.ShapesEntry" print("%d,%f,%f,%d," % (shapeEntry.shapeID, shapeEntry.lat, shapeEntry.lng, shapeEntry.shapeSeq))
def main(argv): # Initialize from command-line parameters: if (len(argv) < 1) or (argv[1].lower == "-h") or (argv[1].lower == "--help"): syntax() shapePath = argv[1] routeRestrictFilename = None if len(argv) > 1: i = 2 while i < len(argv): if argv[i] == "-x" and i < len(argv) - 1: routeRestrictFilename = argv[i + 1] i += 1 i += 1 # Create a fake GPS coordinate: graph = graph.GraphLib(0, 0) # Read in the shapefile information: print("INFO: Read GTFS shapefile...", file=sys.stderr) gtfsShapes = gtfs.fillShapes(shapePath, graph.GPS) # Filter shapes according to exclusion file: if routeRestrictFilename is not None: gtfsShapes = path_refine.filterRoutes(gtfsShapes, shapePath, gtfsShapes, routeRestrictFilename, True) # Similarity search: gtfsShapes = filterSimilarity(gtfsShapes) # Extract useful information: print("INFO: Print output...", file=sys.stderr) shapeIDs = gtfsShapes.keys() "@type shapeIDs: list<int>" shapeIDs.sort() print("shape_id,shape_pt_lat,shape_pt_lon,shape_pt_sequence,shape_dist_traveled") for shapeID in shapeIDs: "@type shapeID: int" for shapeEntry in gtfsShapes[shapeID]: "@type shapeEntry: gtfs.ShapesEntry" print("%d,%f,%f,%d," % (shapeEntry.shapeID, shapeEntry.lat, shapeEntry.lng, shapeEntry.shapeSeq))