############################################################################### # Creates a network from data imported by fullosmimport from open street map # # osm-File. # ################################################################################ ############################################################################### # Create and open database # ############################################################################### create database keDB; open database keDB; ############################################################################### # Set import parameter # ############################################################################### let SOURCEFILE = '/home/jandt/Downloads/OSM-Dateien/KL_Enkenbach.osm'; ############################################################################### # import osm data from file # ############################################################################### query fullosmimport(SOURCEFILE, "Osm"); ################################################################################ # Extend taginformation with default values for needed but not yet set tags # ################################################################################ let WayIdsWithoutTags = OsmWays feed project [WayId] sortby[WayId] OsmWayTags feed projectextend[;WayId: .WayIdInTag] sortby [WayId] rdup mergediff consume; let OsmWayTagsLayerExtended = OsmWayTags feed sortby [WayIdInTag] groupby [WayIdInTag; C: group feed filter [.WayTagKey = "layer"] count] filter [.C = 0] projectextend [WayIdInTag; WayTagKey: 'layer', WayTagValue: '0'] consume; let LayerTagForWayIdsWithoutTag = WayIdsWithoutTags feed projectextend[; WayIdInTag: .WayId, WayTagKey: 'layer', WayTagValue: '0'] consume; let OsmWayTagNew = ((OsmWayTags feed) (OsmWayTagsLayerExtended feed) concat) (LayerTagForWayIdsWithoutTag feed) concat consume; ############################################################################### # Connect Spatial Information for nodes and ways # ############################################################################### let SpatialPosOfNodes = OsmNodes feed projectextend [NodeId; NodePos: makepoint(.Lon,.Lat)] consume; let SpatialWayCurveSimple = OsmWays feed SpatialPosOfNodes feed hashjoin[NodeRef, NodeId, 99997] project[WayId, NodeCounter, NodePos] sortby [WayId, NodeCounter] groupby[WayId; WayCurve: group feed projecttransformstream[NodePos] collect_sline[TRUE]] consume; let SpatialWayCurveComplex = OsmWays feed SpatialWayCurveSimple feed filter[not(isdefined(.WayCurve))] {s} hashjoin[WayId, WayId_s] project[WayId, NodeCounter, NodeRef] SpatialPosOfNodes feed hashjoin[NodeRef, NodeId, 99997] project[WayId, NodeCounter, NodePos] sortby [WayId, NodeCounter] groupby[WayId; WayCurve: group feed projecttransformstream[NodePos] collect_line[TRUE], StartPointCurve: group feed head[1] extract[NodePos]] projectextendstream[WayId, StartPointCurve; WayC: .WayCurve longlines] addcounter[PartNo,1] projectextend[WayId, PartNo, StartPointCurve, WayC; StartPoint: getstartpoint(.WayC), EndPoint: getendpoint(.WayC)] sortby[WayId, PartNo] extend_last[PrevEndPoint: ..EndPoint :: [const point value(0.0 0.0)]] sortby[WayId, PartNo] projectextend[WayId; WayCurve: ifthenelse(.StartPointCurve = .StartPoint, .WayC, ifthenelse(.StartPoint = .PrevEndPoint, .WayC, set_startsmaller(.WayC, not(get_startsmaller(.WayC)))))] consume; let SpatialWayCurve = (SpatialWayCurveSimple feed filter [isdefined(.WayCurve)]) (SpatialWayCurveComplex feed) concat filter [isdefined(.WayCurve)] consume; ################################################################################ # Collect tag information by identfier # ################################################################################ let NestedNodeRel = SpatialPosOfNodes feed OsmNodeTags feed hashjoin[NodeId,NodeIdInTag] project[NodeId, NodePos, NodeTagKey, NodeTagValue] sortby[NodeId, NodePos, NodeTagKey, NodeTagValue] rdup nest [NodeId, NodePos; NodeInfo] consume; let NestedWayRel = SpatialWayCurve feed OsmWayTagNew feed hashjoin [WayId, WayIdInTag] project[WayId, WayCurve, WayTagKey, WayTagValue] filter[not(((.WayTagKey = "oneway") and ((.WayTagValue = "no") or (.WayTagValue = "false") or (.WayTagValue = "0"))))] sortby[WayId, WayCurve, WayTagKey, WayTagValue] rdup nest[WayId, WayCurve; WayInfo] projectextend[WayId, WayInfo; WayC: .WayCurve, ChangeDirection: ifthenelse(.WayInfo afeed filter [.WayTagKey = "oneway"] filter [(.WayTagValue = "-1") or (.WayTagValue = "reverse")] count > 0, TRUE, FALSE)] projectextend[WayId, WayInfo; WayCurve: ifthenelse(.ChangeDirection, set_startsmaller(.WayC, not(get_startsmaller(.WayC))), .WayC)] consume; let NestedRelationRel = OsmRelations feed OsmRelationTags feed hashjoin[RelId, RelIdInTag] project[RelId, RefCounter, MemberRef, MemberType, MemberRole, RelTagKey, RelTagValue] sortby[RelId, RefCounter, MemberRef, MemberType, MemberRole, RelTagKey, RelTagValue] rdup nest [RelId, RefCounter, MemberRef, MemberType, MemberRole; RefInfo] nest [RelId; RelInfo] consume; ################################################################################ # Build roads defined by relations defined by osm # ################################################################################ let RoadParts = NestedWayRel feed filter [.WayInfo afeed filter[.WayTagKey = "highway"] filter[(.WayTagValue contains "living") or (.WayTagValue contains "motorway") or (.WayTagValue contains "path") or (.WayTagValue contains "primary") or (.WayTagValue contains "residential") or (.WayTagValue contains "road") or (.WayTagValue contains "secondary") or (.WayTagValue contains "service") or (.WayTagValue contains "tertiary") or (.WayTagValue contains "trunk") or (.WayTagValue contains "track") or (.WayTagValue contains "unclassified") or (.WayTagValue contains "pedestrian")] count > 0] filter [isdefined(.WayCurve)] filter [not(isempty(.WayCurve))] consume; let RoadsByRefH1 = RoadParts feed filter[not(iscycle(.WayCurve))] filter[.WayInfo afeed filter[.WayTagKey = "oneway"] count = 0] filter[.WayInfo afeed filter[.WayTagKey = "ref"] count > 0] filter[.WayInfo afeed filter[.WayTagKey = "highway"] filter[not(.WayTagValue contains "link")] count > 0] unnest[WayInfo] filter[.WayTagKey = "ref"] projectextendstream[WayId, WayCurve; RefToken: tokenize(' '+.WayTagValue,";/")] projectextend[WayId, WayCurve; Ref: trim(toObject('"'+.RefToken +'"',"a"))] sortby[Ref, WayCurve] consume; let RoadsByRefSimpleH1 = RoadsByRefH1 feed sortby[Ref, WayCurve] groupby[Ref; C: group feed count] consume; let RoadsByRefSimpleH2 = RoadsByRefSimpleH1 feed filter [.C = 1] {r1} RoadsByRefH1 feed {r2} hashjoin[Ref_r1, Ref_r2] projectextend[; Ref: .Ref_r1, RoadCurve: .WayCurve_r2] consume; let RoadsByRefSimpleH3 = RoadsByRefSimpleH1 feed filter [.C > 1] {r1} RoadsByRefH1 feed {r2} hashjoin[Ref_r1, Ref_r2] projectextend[; Ref: .Ref_r2, WayCurve: .WayCurve_r2] sortby[Ref, WayCurve] groupby[Ref; RoadC: group feed projecttransformstream[WayCurve] collect_sline[TRUE]] projectextend[Ref; RoadCurve: .RoadC] consume; let RoadsByRefSimple = (RoadsByRefSimpleH2 feed) (RoadsByRefSimpleH3 feed) concat sortby[Ref, RoadCurve] consume; let RoadsByRefComplex = RoadsByRefH1 feed sortby[Ref, WayCurve] RoadsByRefSimple feed filter[not(isdefined(.RoadCurve))] {s} hashjoin[Ref, Ref_s] projectextend[Ref, WayCurve; StartPoint: getstartpoint(.WayCurve)] sortby[Ref, WayCurve, StartPoint] groupby[Ref; RoadC: group feed projecttransformstream[WayCurve] collect_line[TRUE], StartPointCurve: group feed head[1] extract[StartPoint]] projectextendstream[Ref, StartPointCurve; RoadCur: .RoadC longlines] addcounter[PartNo,1] projectextend[Ref, PartNo, StartPointCurve, RoadCur; StartPoint: getstartpoint(.RoadCur), EndPoint: getendpoint(.RoadCur)] sortby[Ref, PartNo] extend_last[PrevEndPoint: ..EndPoint :: [const point value(0.0 0.0)]] sortby[Ref, PartNo] projectextend[Ref; RoadCurve: ifthenelse(.StartPointCurve = .StartPoint, .RoadCur, ifthenelse(.StartPoint = .PrevEndPoint, .RoadCur, set_startsmaller(.RoadCur, not(get_startsmaller(.RoadCur)))))] consume; let RoadsByRef = (RoadsByRefSimple feed filter [isdefined(.RoadCurve)]) (RoadsByRefComplex feed) concat filter [isdefined(.RoadCurve)] consume; let RoadsByNameH1 = RoadParts feed filter[not(iscycle(.WayCurve))] filter[.WayInfo afeed filter[.WayTagKey = "oneway"] count = 0] filter[.WayInfo afeed filter[.WayTagKey = "name"] count > 0] filter[.WayInfo afeed filter[.WayTagKey = "ref"] count = 0] filter[.WayInfo afeed filter[.WayTagKey = "highway"] filter[not(.WayTagValue contains "link")] count > 0] unnest[WayInfo] filter[.WayTagKey = "name"] projectextend[WayId, WayCurve; Name: trim(toObject('"'+.WayTagValue +'"',"a"))] sortby[Name, WayCurve] consume; let RoadsByNameSimpleH1 = RoadsByNameH1 feed sortby[Name, WayCurve] groupby[Name; C: group feed count] consume; let RoadsByNameSimpleH2 = RoadsByNameSimpleH1 feed filter [.C = 1] {r1} RoadsByNameH1 feed {r2} hashjoin[Name_r1, Name_r2] projectextend[;Name: .Name_r1, RoadCurve: .WayCurve_r2] consume; let RoadsByNameSimpleH3 = RoadsByNameSimpleH1 feed filter [.C > 1] {r1} RoadsByNameH1 feed {r2} hashjoin[Name_r1, Name_r2] projectextend[; Name: .Name_r1, WayCurve: .WayCurve_r2] sortby[Name, WayCurve] groupby[Name; RoadC: group feed projecttransformstream[WayCurve] collect_sline[TRUE]] projectextend[Name; RoadCurve: .RoadC] consume; let RoadsByNameSimple = (RoadsByNameSimpleH2 feed) (RoadsByNameSimpleH3 feed) concat sortby[Name, RoadCurve] consume; let RoadsByNameComplex = RoadsByNameH1 feed RoadsByNameSimple feed filter[not(isdefined(.RoadCurve))] {s} hashjoin[Name, Name_s] projectextend[Name, WayCurve; StartPoint: getstartpoint(.WayCurve)] sortby[Name, WayCurve, StartPoint] groupby[Name; RoadC: group feed projecttransformstream[WayCurve] collect_line[TRUE], StartPointCurve: group feed head[1] extract[StartPoint]] projectextendstream[Name, StartPointCurve; RoadCur: .RoadC longlines] addcounter[PartNo,1] projectextend[Name, PartNo, StartPointCurve, RoadCur; StartPoint: getstartpoint(.RoadCur), EndPoint: getendpoint(.RoadCur)] sortby[Name, PartNo] extend_last[PrevEndPoint: ..EndPoint :: [const point value(0.0 0.0)]] sortby[Name, PartNo] projectextend[Name; RoadCurve: ifthenelse(.StartPointCurve = .StartPoint, .RoadCur, ifthenelse(.StartPoint = .PrevEndPoint, .RoadCur, set_startsmaller(.RoadCur, not(get_startsmaller(.RoadCur)))))] consume; let RoadsByName = (RoadsByNameSimple feed filter [isdefined(.RoadCurve)]) (RoadsByNameComplex feed) concat filter [isdefined(.RoadCurve)] consume; let RoadLinksH1 = RoadParts feed filter[not(iscycle(.WayCurve))] filter[.WayInfo afeed filter[.WayTagKey = "oneway"] count = 0] filter[.WayInfo afeed filter[.WayTagKey = "highway"] filter[.WayTagValue contains "link"] count > 0] unnest[WayInfo] filter[.WayTagKey = "highway"] filter[.WayTagValue contains "link"] project[WayId, WayCurve] sortby[WayId, WayCurve] consume; let RoadLinksSimpleH1 = RoadLinksH1 feed sortby[WayId, WayCurve] groupby[WayId; C: group feed count] consume; let RoadLinksSimpleH2 = RoadLinksSimpleH1 feed filter [.C = 1] {r1} RoadLinksH1 feed {r2} hashjoin [WayId_r1, WayId_r2] projectextend[; WayId: .WayId_r1, RoadCurve: .WayCurve_r2] consume; let RoadLinksSimpleH3 = RoadLinksSimpleH1 feed filter [.C > 1] {r1} RoadLinksH1 feed {r2} hashjoin [WayId_r1, WayId_r2] projectextend[; WayId: .WayId_r1, WayCurve: .WayCurve_r2] sortby[WayId, WayCurve] groupby[WayId; RoadC: group feed projecttransformstream[WayCurve] collect_sline[TRUE]] projectextend[WayId; RoadCurve: .RoadC] consume; let RoadLinksSimple = (RoadLinksSimpleH2 feed) (RoadLinksSimpleH3 feed) concat sortby[WayId, RoadCurve] consume; let RoadLinksComplex = RoadLinksH1 feed RoadLinksSimple feed filter[not(isdefined(.RoadCurve))] {s} hashjoin[WayId, WayId_s] projectextend[WayId, WayCurve; StartPoint: getstartpoint(.WayCurve)] sortby[WayId, WayCurve, StartPoint] groupby[WayId; RoadC: group feed projecttransformstream[WayCurve] collect_line[TRUE], StartPointCurve: group feed head[1] extract[StartPoint]] projectextendstream[WayId, StartPointCurve; RoadCur: .RoadC longlines] addcounter[PartNo,1] projectextend[WayId, PartNo, StartPointCurve, RoadCur; StartPoint: getstartpoint(.RoadCur), EndPoint: getendpoint(.RoadCur)] sortby[WayId, PartNo] extend_last[PrevEndPoint: ..EndPoint :: [const point value(0.0 0.0)]] sortby[WayId, PartNo] projectextend[WayId; RoadCurve: ifthenelse(.StartPointCurve = .StartPoint, .RoadCur, ifthenelse(.StartPoint = .PrevEndPoint, .RoadCur, set_startsmaller(.RoadCur, not(get_startsmaller(.RoadCur)))))] consume; let RoadLinks = (RoadLinksSimple feed filter [isdefined(.RoadCurve)]) (RoadLinksComplex feed) concat filter [isdefined(.RoadCurve)] consume; let RoadRestH1 = RoadParts feed filter[not(iscycle(.WayCurve))] filter[.WayInfo afeed filter[.WayTagKey = "oneway"] count = 0] filter[.WayInfo afeed filter[.WayTagKey contains "ref"] count = 0] filter [.WayInfo afeed filter[.WayTagKey contains "name"] count = 0] filter [.WayInfo afeed filter[.WayTagKey = "highway"] filter[.WayTagValue contains "link"] count = 0] unnest[WayInfo] filter[.WayTagKey = "highway"] project[WayId, WayCurve] sortby[WayId, WayCurve] consume; let RoadRestSimpleH1 = RoadRestH1 feed sortby[WayId, WayCurve] groupby[WayId; C: group feed count] consume; let RoadRestSimpleH2 = RoadRestSimpleH1 feed filter [.C = 1] {r1} RoadRestH1 feed {r2} hashjoin[WayId_r1, WayId_r2] projectextend[; WayId: .WayId_r1, RoadCurve: .WayCurve_r2] consume; let RoadRestSimpleH3 = RoadRestSimpleH1 feed filter [.C > 1] {r1} RoadRestH1 feed {r2} hashjoin[WayId_r1, WayId_r2] projectextend[; WayId: .WayId_r1, WayCurve: .WayCurve_r2] sortby[WayId, WayCurve] groupby[WayId; RoadC: group feed projecttransformstream[WayCurve] collect_sline[TRUE]] projectextend[WayId; RoadCurve: .RoadC] consume; let RoadRestSimple = (RoadRestSimpleH2 feed) (RoadRestSimpleH3 feed) concat sortby[WayId, RoadCurve] consume; let RoadRestComplex = RoadRestH1 feed RoadRestSimple feed filter[not(isdefined(.RoadCurve))] {s} hashjoin[WayId, WayId_s] projectextend[WayId, WayCurve; StartPoint: getstartpoint(.WayCurve)] sortby[WayId, WayCurve, StartPoint] groupby[WayId; RoadC: group feed projecttransformstream[WayCurve] collect_line[TRUE], StartPointCurve: group feed head[1] extract[StartPoint]] projectextendstream[WayId, StartPointCurve; RoadCur: .RoadC longlines] addcounter[PartNo,1] projectextend[WayId, PartNo, StartPointCurve, RoadCur; StartPoint: getstartpoint(.RoadCur), EndPoint: getendpoint(.RoadCur)] sortby[WayId, PartNo] extend_last[PrevEndPoint: ..EndPoint :: [const point value(0.0 0.0)]] sortby[WayId, PartNo] projectextend[WayId; RoadCurve: ifthenelse(.StartPointCurve = .StartPoint, .RoadCur, ifthenelse(.StartPoint = .PrevEndPoint, .RoadCur, set_startsmaller(.RoadCur, not(get_startsmaller(.RoadCur)))))] consume; let RoadRest = (RoadRestSimple feed filter [isdefined(.RoadCurve)]) (RoadRestComplex feed) concat filter [isdefined(.RoadCurve)] consume; let RoadsByOneway = RoadParts feed filter [not(iscycle(.WayCurve))] filter [.WayInfo afeed filter [.WayTagKey = "oneway"] count > 0] projectextend[; Name: num2string(.WayId), Curve: .WayCurve] consume; let RoadsByCycle = RoadParts feed filter[iscycle(.WayCurve)] projectextend[;Name: num2string(.WayId), Curve: set_startsmaller(.WayCurve, TRUE)] consume; let Roads = ( ( (RoadsByRef feed projectextend[;Name: .Ref, Curve: .RoadCurve]) (RoadsByName feed projectextend[;Name: .Name, Curve: .RoadCurve]) concat) ( (RoadLinks feed projectextend[;Name: num2string(.WayId), Curve: .RoadCurve]) (RoadRest feed projectextend[;Name: num2string(.WayId), Curve: .RoadCurve]) concat) concat) ( (RoadsByCycle feed) (RoadsByOneway feed) concat) concat filter [isdefined(.Curve)] extend[CurvLength: size(.Curve)] sortby [CurvLength desc] addcounter[Rid,1] consume; ############################################################################### # Build Junctions # ############################################################################### let ExtendedRoadParts = RoadParts feed projectextend[WayId; StartPoint: getstartpoint(.WayCurve), EndPoint: getendpoint(.WayCurve)] consume; let CrossingPtsTmpH1 = RoadParts feed unnest[WayInfo] filter[.WayTagKey = "layer"] projectextend[WayId, WayCurve; Layer: .WayTagValue] consume; let CrossingPtsTmp = CrossingPtsTmpH1 feed {s1} CrossingPtsTmpH1 feed {s2} itSpatialJoin [WayCurve_s1, WayCurve_s2, 4 ,8] filter[(.Layer_s1 = .Layer_s2)] filter[.WayId_s1 < .WayId_s2] filter[.WayCurve_s1 intersects .WayCurve_s2] projectextendstream[WayId_s1, WayId_s2; Pt: components(crossings(.WayCurve_s1, .WayCurve_s2))] filter[isdefined(.Pt)] projectextend[Pt; WayId1: .WayId_s1, WayId2: .WayId_s2] consume; let CrossingsAndRoadPartEndPoints = ((ExtendedRoadParts feed projectextend[WayId; Point: .StartPoint]) (ExtendedRoadParts feed projectextend[WayId; Point: .EndPoint]) concat) ((CrossingPtsTmp feed projectextend[; WayId: .WayId1, Point: .Pt]) (CrossingPtsTmp feed projectextend[; WayId: .WayId2, Point: .Pt]) concat) concat sortby[WayId, Point] krduph[WayId, Point] consume; let RoadEnds = Roads feed projectextend[Rid; StartPoint: getstartpoint(.Curve), EndPoint: getendpoint(.Curve)] consume; let RoadEndPointsA = (RoadEnds feed projectextend[Rid; Point: .StartPoint]) (RoadEnds feed projectextend[Rid; Point: .EndPoint]) concat sortby[Rid, Point] rdup consume; let AddJuncs = RoadEndPointsA feed project[Point] sortby[Point] CrossingsAndRoadPartEndPoints feed project[Point] sortby[Point] mergediff consume; let JunctionIds = (CrossingsAndRoadPartEndPoints feed project[Point]) (AddJuncs feed) concat sortby [Point] rdup filter [isdefined(.Point)] addcounter[Jid,1] consume; let JunctionPositionsOnRoads1 = CrossingsAndRoadPartEndPoints feed filter[isdefined(.Point)]{p1} JunctionIds feed filter[isdefined(.Point)]{j} itSpatialJoin[Point_p1,Point_j,4,8] filter [.Point_p1 = .Point_j] projectextend[;Jid: .Jid_j, Point: .Point_j, WayId: .WayId_p1] RoadParts feed {w} hashjoin[WayId, WayId_w] projectextend[Jid, Point, WayId; WayCurve: .WayCurve_w, WayStartPoint: getstartpoint(.WayCurve_w), WayEndPoint: getendpoint(.WayCurve_w)] Roads feed {r1} itSpatialJoin[Point,Curve_r1,4,8] filter[.Point inside .Curve_r1] filter[.WayStartPoint inside .Curve_r1] filter[.WayEndPoint inside .Curve_r1] filter[.WayCurve inside .Curve_r1] projectextend[Jid, Point, WayId; Rid: .Rid_r1, RMeas: atpoint(.Curve_r1,.Point), WayStartPosOnRoute: atpoint(.Curve_r1, .WayStartPoint), WayEndPosOnRoute: atpoint(.Curve_r1, .WayEndPoint)] sortby[Jid, Point, WayId, Rid, RMeas, WayStartPosOnRoute, WayEndPosOnRoute] rdup consume; let JunctionPositionsOnRoads2 = CrossingsAndRoadPartEndPoints feed filter[isdefined(.Point)]{p1} JunctionIds feed filter[isdefined(.Point)]{j} itSpatialJoin[Point_p1,Point_j,4,8] filter [.Point_p1 = .Point_j] projectextend[;Jid: .Jid_j, Point: .Point_j, WayId: .WayId_p1] sortby[Jid, Point, WayId] JunctionPositionsOnRoads1 feed project[Jid, Point, WayId] sortby[Jid, Point, WayId] mergediff RoadParts feed {w} hashjoin[WayId, WayId_w] projectextend[Jid, Point, WayId; WayCurve: .WayCurve_w, WayStartPoint: getstartpoint(.WayCurve_w), WayEndPoint: getendpoint(.WayCurve_w)] Roads feed {r1} itSpatialJoin[Point,Curve_r1,4,8] filter[.Point inside .Curve_r1] projectextend[Jid, Point, WayId; Rid: .Rid_r1, RMeas: atpoint(.Curve_r1,.Point), WayStartPosOnRoute: atpoint(.Curve_r1, getstartpoint(intersection(.WayCurve, .Curve_r1))), WayEndPosOnRoute: atpoint(.Curve_r1, getendpoint(intersection(.WayCurve, .Curve_r1)))] sortby[Jid, Point, WayId, Rid, RMeas, WayStartPosOnRoute, WayEndPosOnRoute] rdup consume; let JunctionPositionsOnRoads = (JunctionPositionsOnRoads1 feed) (JunctionPositionsOnRoads2 feed) concat consume; let JunctionsAtRoadEnds = RoadEndPointsA feed filter[isdefined(.Point)] {r} JunctionIds feed filter [isdefined(.Point)] {j} itSpatialJoin[Point_r,Point_j,4,8] filter [.Point_r = .Point_j] projectextend[; Jid: .Jid_j, Point: .Point_j, Rid: .Rid_r] Roads feed {r1} hashjoin[Rid, Rid_r1] projectextend[Jid, Point, Rid; RMeas: atpoint(.Curve_r1,.Point)] sortby [Jid, Point, Rid, RMeas] rdup consume; let JunctionsAtRoadEndPairs = JunctionsAtRoadEnds feed {j1} JunctionsAtRoadEnds feed {j2} hashjoin[Jid_j1, Jid_j2] filter [.Rid_j1 <= .Rid_j2] filter [.RMeas_j1 # .RMeas_j2] projectextend [;Jid: .Jid_j1, R1id: .Rid_j1, R1Meas: .RMeas_j1, R2id: .Rid_j2, R2Meas: .RMeas_j2, NewCC: 65535] sortby [Jid, R1id, R1Meas, R2id, R2Meas, NewCC] krduph[Jid, R1id, R1Meas, R2id, R2Meas, NewCC] consume; let JunctionRoadPairs = JunctionPositionsOnRoads feed {j1} JunctionPositionsOnRoads feed {j2} hashjoin[Jid_j1, Jid_j2] filter[.Rid_j1 <= .Rid_j2] projectextend[;Jid: .Jid_j1, Point: .Point_j1, R1id: .Rid_j1, R1Meas: .RMeas_j1, R2id: .Rid_j2, R2Meas: .RMeas_j2, CC: 65535, WayId1: .WayId_j1, Way1StartPosOnRoute: .WayStartPosOnRoute_j1, Way1EndPosOnRoute: .WayEndPosOnRoute_j1, WayId2: .WayId_j2, Way2StartPosOnRoute: .WayStartPosOnRoute_j2, Way2EndPosOnRoute: .WayEndPosOnRoute_j2] sortby [Jid, R1id, R1Meas, R2id, R2Meas, CC, Way1StartPosOnRoute, Way1EndPosOnRoute, Way2StartPosOnRoute, Way2EndPosOnRoute, WayId1, WayId2] krduph[Jid, R1id, R1Meas, R2id, R2Meas, CC, Way1StartPosOnRoute, Way1EndPosOnRoute, Way2StartPosOnRoute, Way2EndPosOnRoute] consume; ############################################################################### # Compute correct Connectivity Code # ############################################################################### # Select Onewaycurves # ############################################################################### let RoadEndPoints = JunctionRoadPairs feed sortby [Jid, R1id, R1Meas, R2id, R2Meas] groupby [Jid; C: group feed count] filter [.C = 1] {s} JunctionRoadPairs feed hashjoin[Jid_s, Jid] filter[.R1id = .R2id] filter[.WayId1 = .WayId2] projectextend[Jid, R1id, R1Meas, R2id, R2Meas; NewCC: ifthenelse(.R1Meas = 0, 16, 2)] consume; let OneWayCurveIds = NestedWayRel feed filter[.WayInfo afeed filter[.WayTagKey = "oneway"] filter[not((.WayTagValue = "no") or (.WayTagValue = "false") or (.WayTagValue = "0"))] count > 0] project[WayId] consume; let MotorWayCurveIds = NestedWayRel feed filter[.WayInfo afeed filter [.WayTagKey = "highway"] filter [.WayTagValue = "motorway"] count > 0] project [WayId] consume; let RoundaboutWayCurveIds = NestedWayRel feed filter [.WayInfo afeed filter [.WayTagKey = "junction"] filter [.WayTagValue = "roundabout"] count > 0] project [WayId] consume; let OneWayIds = ((OneWayCurveIds feed) (RoundaboutWayCurveIds feed) concat) (MotorWayCurveIds feed) concat sortby [WayId] rdup consume; let JunctionsOfCycles = JunctionRoadPairs feed filter [.R1id = .R2id] filter [.WayId1 = .WayId2] RoundaboutWayCurveIds feed hashjoin[WayId1, WayId] projectextend[Jid, R1id, R1Meas, R2id, R2Meas; NewCC: 1285] consume; let JunctionsOfOnewaysSameRID1 = JunctionRoadPairs feed filter[.R1id = .R2id] filter[.WayId1 # .WayId2] OneWayIds feed hashjoin[WayId1, WayId] projectextend[Jid, R1id, R1Meas, R2id, R2Meas; NewCC: ifthenelse(.Way1StartPosOnRoute < .Way1EndPosOnRoute, ifthenelse(.R1Meas = .Way1EndPosOnRoute, .CC binand 21845, ifthenelse(.R1Meas = .Way1StartPosOnRoute, .CC binand 3855, .CC binand 1285)), ifthenelse(.R1Meas = .Way1EndPosOnRoute, .CC binand 43690, ifthenelse(.R1Meas = .Way1StartPosOnRoute,.CC binand 61680, .CC binand 41120)))] consume; let JunctionsOfOnewaysSameRID2 = JunctionRoadPairs feed filter [.R1id = .R2id] filter [.WayId1 # .WayId2] OneWayIds feed hashjoin[WayId2, WayId] projectextend[Jid, R1id, R1Meas, R2id, R2Meas; NewCC: ifthenelse(.Way2StartPosOnRoute < .Way2EndPosOnRoute, ifthenelse(.R2Meas = .Way2EndPosOnRoute, .CC binand 21845, ifthenelse(.R2Meas = .Way2StartPosOnRoute, .CC binand 3855, .CC binand 1285)), ifthenelse(.R2Meas = .Way2EndPosOnRoute, .CC binand 43690, ifthenelse(.R2Meas = .Way2StartPosOnRoute, .CC binand 61680, .CC binand 41120)))] consume; let JunctionsWithOneWayOnRouteA = JunctionRoadPairs feed filter[.R1id < .R2id] filter[.WayId1 # .WayId2] OneWayIds feed hashjoin[WayId1, WayId] projectextend[Jid, R1id, R1Meas, R2id, R2Meas; NewCC: ifthenelse(.Way1StartPosOnRoute <= .Way1EndPosOnRoute, ifthenelse(.R1Meas = .Way1EndPosOnRoute, .CC binand 56797, ifthenelse(.R1Meas = .Way1StartPosOnRoute, .CC binand 65295, .CC binand 56589)), ifthenelse(.R1Meas = .Way1EndPosOnRoute, .CC binand 61166, ifthenelse(.R1Meas = .Way1StartPosOnRoute,.CC binand 65520, .CC binand 61152)))] consume; let JunctionsWithOneWayOnRouteB = JunctionRoadPairs feed filter[.R1id < .R2id] filter [.WayId1 # .WayId2] OneWayIds feed hashjoin[WayId2, WayId] projectextend[Jid, R1id, R1Meas, R2id, R2Meas; NewCC: ifthenelse(.Way2StartPosOnRoute <= .Way2EndPosOnRoute, ifthenelse(.R2Meas = .Way2EndPosOnRoute, .CC binand 30583, ifthenelse(.R2Meas = .Way2StartPosOnRoute, .CC binand 4095, .CC binand 1911)), ifthenelse(.R2Meas = .Way2EndPosOnRoute, .CC binand 48095, ifthenelse(.R2Meas = .Way2StartPosOnRoute, .CC binand 61695, .CC binand 45243)))] consume; ################################################################################ # Build Relation of Restrictions for way connections # ################################################################################ let ViaNodesRel = NestedRelationRel feed filter [.RelInfo afeed filter [.RefInfo afeed filter [.RelTagKey contains "restriction"] count > 0] count > 0] unnest [RelInfo] filter[.MemberRole = "via"] filter [.MemberType = "node"] SpatialPosOfNodes feed hashjoin[MemberRef,NodeId] projectextend[RelId, NodeId, NodePos; RelTagVal: .RefInfo afeed extract [RelTagValue]] consume; let ViaWaysRel = NestedRelationRel feed filter [.RelInfo afeed filter [.RefInfo afeed filter [.RelTagKey contains "restriction"] count > 0] count > 0] unnest [RelInfo] filter [.MemberRole = "via"] filter [.MemberType = "way"] SpatialWayCurve feed hashjoin[MemberRef, WayId] projectextend[RelId, WayId, WayCurve; RelTagVal: .RefInfo afeed extract [RelTagValue]] consume; let FromWaysRel = NestedRelationRel feed filter [.RelInfo afeed filter [.RefInfo afeed filter [.RelTagKey contains "restriction"] count > 0] count > 0] unnest [RelInfo] filter [.MemberRole = "from"] SpatialWayCurve feed hashjoin[MemberRef, WayId] project[RelId, WayId, WayCurve] consume; let ToWaysRel = NestedRelationRel feed filter [.RelInfo afeed filter [.RefInfo afeed filter [.RelTagKey contains "restriction"] count > 0] count > 0] unnest [RelInfo] filter [.MemberRole = "to"] SpatialWayCurve feed hashjoin[MemberRef, WayId] project[RelId, WayId, WayCurve] consume; let NodeRestrictions = ViaNodesRel feed {v} FromWaysRel feed {f} hashjoin[RelId_v, RelId_f] project [RelId_v, NodeId_v, NodePos_v, RelTagVal_v, WayId_f] ToWaysRel feed {t} hashjoin[RelId_v, RelId_t] project[NodeId_v, NodePos_v, RelTagVal_v, WayId_f, WayId_t] sortby [NodeId_v, NodePos_v, WayId_f, WayId_t, RelTagVal_v] rdup consume; let RestrictedJunctionsAA1 = JunctionRoadPairs feed NodeRestrictions feed itSpatialJoin[Point, NodePos_v,4,8] filter[.Point = .NodePos_v] filter[.WayId1 = .WayId_f] filter[.WayId2 = .WayId_t] filter [.R1id = .R2id] projectextend [Jid, R1id, R1Meas, R2id, R2Meas;NewCC: ifthenelse(.WayId1 = .WayId2, ifthenelse(.Way1StartPosOnRoute < .Way1EndPosOnRoute, ifthenelse(.Way1StartPosOnRoute = .R1Meas, .CC binand 65519, .CC binand 65533), ifthenelse(.Way1StartPosOnRoute = .R1Meas, .CC binand 65533, .CC binand 65519)), ifthenelse(.Way1StartPosOnRoute < .Way1EndPosOnRoute, ifthenelse(.Way1StartPosOnRoute = .R1Meas, ifthenelse(.RelTagVal_v contains "no", .CC binand 65503, .CC binand 65327), ifthenelse(.RelTagVal_v contains "no", .CC binand 65534, .CC binand 65521)), ifthenelse(.Way1StartPosOnRoute = .R1Meas, ifthenelse(.RelTagVal_v contains "no", .CC binand 65534, .CC binand 65521), ifthenelse(.RelTagVal_v contains "no", .CC binand 65503, .CC binand 65327))))] sortby[Jid, R1id, R1Meas, R2id, R2Meas, NewCC] consume; let RestrictedJunctionsAA2 = JunctionRoadPairs feed NodeRestrictions feed itSpatialJoin[Point, NodePos_v,4,8] filter[.Point = .NodePos_v] filter[.WayId2 = .WayId_f] filter[.WayId1 = .WayId_t] filter [.R1id = .R2id] projectextend [Jid, R1id, R1Meas, R2id, R2Meas;NewCC: ifthenelse(.WayId1 = .WayId2, ifthenelse(.Way2StartPosOnRoute < .Way2EndPosOnRoute, ifthenelse(.Way2StartPosOnRoute = .R2Meas, .CC binand 65519, .CC binand 65533), ifthenelse(.Way2StartPosOnRoute = .R2Meas, .CC binand 65533, .CC binand 65519)), ifthenelse(.Way2StartPosOnRoute < .Way2EndPosOnRoute, ifthenelse(.Way2StartPosOnRoute = .R2Meas, ifthenelse(.RelTagVal_v contains "no", .CC binand 65503, .CC binand 65327), ifthenelse(.RelTagVal_v contains "no", .CC binand 65534, .CC binand 65521)), ifthenelse(.Way2StartPosOnRoute = .R2Meas, ifthenelse(.RelTagVal_v contains "no", .CC binand 65534, .CC binand 65521), ifthenelse(.RelTagVal_v contains "no", .CC binand 65503, .CC binand 65327))))] sortby[Jid, R1id, R1Meas, R2id, R2Meas, NewCC] consume; let RestrictedJunctionsAB = JunctionRoadPairs feed NodeRestrictions feed itSpatialJoin[Point, NodePos_v,4,8] filter[.Point = .NodePos_v] filter[.WayId1 = .WayId_f] filter[.WayId2 = .WayId_t] filter[.R1id < .R2id] projectextend [Jid, R1id, R1Meas, R2id, R2Meas; NewCC: ifthenelse(.WayId1 = .WayId2, 0, ifthenelse(.Way1StartPosOnRoute < .Way1EndPosOnRoute, ifthenelse(.Way2StartPosOnRoute < .Way1EndPosOnRoute, ifthenelse(.Way1StartPosOnRoute = .R1Meas, ifthenelse(.Way2StartPosOnRoute = .R2Meas, ifthenelse(.RelTagVal_v contains "no", .CC binand 65471, .CC binand 65359), ifthenelse(.RelTagVal_v contains "no", .CC binand 65407, .CC binand 65423)), ifthenelse(.Way2StartPosOnRoute = .R2Meas, ifthenelse(.RelTagVal_v contains "no", .CC binand 65531, .CC binand 65524), ifthenelse(.RelTagVal_v contains "no", .CC binand 65527, .CC binand 65528))), ifthenelse(.Way1StartPosOnRoute = .R1Meas, ifthenelse(.Way2StartPosOnRoute = .R2Meas, ifthenelse(.RelTagVal_v contains "no", .CC binand 65407, .CC binand 65423), ifthenelse(.RelTagVal_v contains "no", .CC binand 65471, .CC binand 65359)), ifthenelse(.Way2StartPosOnRoute = .R2Meas, ifthenelse(.RelTagVal_v contains "no", .CC binand 65527, .CC binand 65528), ifthenelse(.RelTagVal_v contains "no", .CC binand 65531, .CC binand 65524)))), ifthenelse(.Way2StartPosOnRoute < .Way1EndPosOnRoute, ifthenelse(.Way1StartPosOnRoute = .R1Meas, ifthenelse(.Way2StartPosOnRoute = .R2Meas, ifthenelse(.RelTagVal_v contains "no", .CC binand 65531, .CC binand 655524), ifthenelse(.RelTagVal_v contains "no", .CC binand 65527, .CC binand 65528)), ifthenelse(.Way2StartPosOnRoute = .R2Meas, ifthenelse(.RelTagVal_v contains "no", .CC binand 65471, .CC binand 65359), ifthenelse(.RelTagVal_v contains "no", .CC binand 65407, .CC binand 65423))), ifthenelse(.Way1StartPosOnRoute = .R1Meas, ifthenelse(.Way2StartPosOnRoute = .R2Meas, ifthenelse(.RelTagVal_v contains "no", .CC binand 65527, .CC binand 65528), ifthenelse(.RelTagVal_v contains "no", .CC binand 65531, .CC binand 65524)), ifthenelse(.Way2StartPosOnRoute = .R2Meas, ifthenelse(.RelTagVal_v contains "no", .CC binand 65407, .CC binand 65423), ifthenelse(.RelTagVal_v contains "no", .CC binand 65471, .CC binand 65359))))))] sortby[Jid, R1id, R1Meas, R2id, R2Meas, NewCC] consume; let RestrictedJunctionsBA = JunctionRoadPairs feed NodeRestrictions feed itSpatialJoin[Point, NodePos_v,4,8] filter[.Point = .NodePos_v] filter[.WayId2 = .WayId_f] filter[.WayId1 = .WayId_t] filter[.R1id < .R2id] projectextend [Jid, R1id, R1Meas, R2id, R2Meas; NewCC: ifthenelse(.WayId1 = .WayId2,0, ifthenelse(.Way1StartPosOnRoute < .Way1EndPosOnRoute, ifthenelse(.Way2StartPosOnRoute < .Way1EndPosOnRoute, ifthenelse(.Way1StartPosOnRoute = .R1Meas, ifthenelse(.Way2StartPosOnRoute = .R2Meas, ifthenelse(.RelTagVal_v contains "no", .CC binand 61439, .CC binand 8191), ifthenelse(.RelTagVal_v contains "no", .CC binand 65279, .CC binand 61951)), ifthenelse(.Way2StartPosOnRoute = .R2Meas, ifthenelse(.RelTagVal_v contains "no", .CC binand 57343, .CC binand 12287), ifthenelse(.RelTagVal_v contains "no", .CC binand 65023, .CC binand 62207))), ifthenelse(.Way1StartPosOnRoute = .R1Meas, ifthenelse(.Way2StartPosOnRoute = .R2Meas, ifthenelse(.RelTagVal_v contains "no", .CC binand 65279, .CC binand 61951), ifthenelse(.RelTagVal_v contains "no", .CC binand 61439, .CC binand 8191)), ifthenelse(.Way2StartPosOnRoute = .R2Meas, ifthenelse(.RelTagVal_v contains "no", .CC binand 65023, .CC binand 62207), ifthenelse(.RelTagVal_v contains "no", .CC binand 57343, .CC binand 12287)))), ifthenelse(.Way2StartPosOnRoute < .Way1EndPosOnRoute, ifthenelse(.Way1StartPosOnRoute = .R1Meas, ifthenelse(.Way2StartPosOnRoute = .R2Meas, ifthenelse(.RelTagVal_v contains "no", .CC binand 57343, .CC binand 12287), ifthenelse(.RelTagVal_v contains "no", .CC binand 65023, .CC binand 62207)), ifthenelse(.Way2StartPosOnRoute = .R2Meas, ifthenelse(.RelTagVal_v contains "no", .CC binand 61439, .CC binand 8191), ifthenelse(.RelTagVal_v contains "no", .CC binand 65279, .CC binand 61951))), ifthenelse(.Way1StartPosOnRoute = .R1Meas, ifthenelse(.Way2StartPosOnRoute = .R2Meas, ifthenelse(.RelTagVal_v contains "no", .CC binand 65023, .CC binand 62207), ifthenelse(.RelTagVal_v contains "no", .CC binand 57343, .CC binand 12287)), ifthenelse(.Way2StartPosOnRoute = .R2Meas, ifthenelse(.RelTagVal_v contains "no", .CC binand 65279, .CC binand 61951), ifthenelse(.RelTagVal_v contains "no", .CC binand 61439, .CC binand 8191))))))] sortby[Jid, R1id, R1Meas, R2id, R2Meas, NewCC] consume; let Junctions = ( ( ( (JunctionsWithOneWayOnRouteA feed) (JunctionsWithOneWayOnRouteB feed) concat) ( (RestrictedJunctionsAA1 feed) (RestrictedJunctionsAA2 feed) concat) concat) ( ( (RestrictedJunctionsAB feed) (RestrictedJunctionsBA feed) concat) ( (JunctionsOfOnewaysSameRID1 feed) (JunctionsOfOnewaysSameRID2 feed) concat) concat) concat) ( ( (RoadEndPoints feed) (JunctionsAtRoadEndPairs feed) concat) ( (JunctionRoadPairs feed projectextend[Jid, R1id, R1Meas, R2id, R2Meas; NewCC: .CC]) (JunctionsOfCycles feed) concat) concat) concat project[Jid, R1id, R1Meas, R2id, R2Meas, NewCC] sortby[Jid, R1id, R1Meas, R2id, R2Meas] groupby[Jid, R1id, R1Meas, R2id, R2Meas; CC: group feed projecttransformstream[NewCC] binands] consume; ############################################################################### # Way Restrictions can not be encoded now in the network data format now # # Because we have no information from where the car comes before in the # # network data model # ############################################################################### let WayRestrictions = ViaWaysRel feed {v} FromWaysRel feed {f} hashjoin[RelId_v, RelId_f] project [RelId_v, WayId_v, WayCurve_v, RelTagVal_v, WayId_f, WayCurve_f] ToWaysRel feed {t} hashjoin[RelId_v, RelId_t] project[WayId_v, WayCurve_v, RelTagVal_v, WayId_f, WayCurve_f, WayId_t, WayCurve_t] sortby[WayId_v, WayId_f, WayId_t, RelTagVal_v, WayCurve_v, WayCurve_f, WayCurve_t] rdup consume; ################################################################################ # Build network with all possible restrictions # ################################################################################ let KENetwork = thenetwork(1, 0.0001, Roads feed projectextend[Rid, CurvLength, Curve; Dual: FALSE, StartS: get_startsmaller(.Curve)] consume, Junctions feed project [R1id, R1Meas, R2id, R2Meas, CC] consume); close database;