Files
secondo/Algebras/JNet/Scripts/JNetFromOSMOSMFileGKAuto.SEC
2026-01-23 17:03:45 +08:00

395 lines
16 KiB
Plaintext

################################################################################
# JNet Import from Openstreetmap data in osm data file format. #
################################################################################
# Create and open database #
################################################################################
create database ruegen;
open database ruegen;
################################################################################
# Set path to osm source files. #
################################################################################
let SRC_DIR_PATH = '/home/jandt/Downloads/OSM-Dateien/';
let SOURCEFILE = 'mecklenburg-vorpommern.osm';
################################################################################
# Define rectangle selecting part of map which we are interested in. #
################################################################################
let GK_VALUE_FOR_REGION = 4;
#let PARTREGION = gk((rectangle2(13.094, 13.596, 53.846, 54.102))rect2region, GK_VALUE_FOR_REGION);
let PARTREGION = gk((rectangle2(13.244, 13.446, 53.946, 54.002))rect2region,
GK_VALUE_FOR_REGION4);
################################################################################
# Import the raw data from osm-file #
################################################################################
let osmNodesRel =
osmimport(SRC_DIR_PATH + SOURCEFILE ,'node')
extend [geoData: gk(makepoint(.lon,.lat),GK_VALUE_FOR_REGION)]
remove [lon,lat]
renameattr[pointType: "type"]
consume;
let osmWaysTmp =
osmimport(SRC_DIR_PATH + SOURCEFILE,'way')
renameattr[roadType: "type"]
filter [isdefined(.roadType)]
project[ref, name, roadType, osm_id, oneway, layer, maxspeed, nodeRefs]
consume;
let osmRestrictionsRel =
osmimport(SRC_DIR_PATH + SOURCEFILE,'restriction')
renameattr[fromWay: "from", viaNode: "via", toWay: "to"]
consume;
################################################################################
# Set vmax by maxspeed or roadType. Build sline from nodeRefs. Sortby ref and #
# name for later use. #
################################################################################
let secWaysTmp =
osmWaysTmp feed
projectextend[ref, name, roadType, osm_id, oneway, layer,
nodeRefs; vmax: ifthenelse(.maxspeed > 0, int2real(.maxspeed),
ifthenelse(.roadType contains "motorway", 130.0,
ifthenelse(.roadType contains "trunk", 130.0,
ifthenelse(.roadType contains "primary",100.0,
ifthenelse(.roadType contains "secondary",70.0,
ifthenelse(.roadType contains "tertiary",50.0,
ifthenelse(.roadType contains "residential",30.0,
ifthenelse(.roadType contains "living_street",15.0,
ifthenelse(.roadType contains "road",50.0,
ifthenelse(.roadType contains "unclassified",50.0,
ifthenelse(.roadType contains "service",50.0,
ifthenelse(.roadType contains "track", 5.0, 4.0))))))))))))]
projectextendstream[ref, name, roadType, osm_id, oneway, layer,
vmax; nodeIdString: tokenize(.nodeRefs,",")]
extend[nodeId: toObject(.nodeIdString,0)]
remove[nodeIdString]
addcounter[orderId,1]
osmNodesRel feed {n}
hashjoin[nodeId, osm_id_n, 9997]
projectextend[ref, name, roadType, osm_id, oneway, layer, vmax, orderId,
nodeId; nodePoint: .geoData_n]
sortby[osm_id, orderId]
groupby[osm_id, ref, name, roadType, oneway, layer,
vmax; geometry: group feed projecttransformstream [nodePoint] collect_sline[TRUE],
startNodeOSMId: group feed sortby [orderId] head[1] extract[nodeId],
endNodeOSMId: group feed sortby [orderId] tail[1] extract[nodeId]]
osmNodesRel feed {s}
hashjoin[startNodeOSMId, osm_id_s,9997]
projectextend[osm_id, ref, name, roadType, oneway, layer, vmax, geometry,
endNodeOSMId; sPoint: .geoData_s]
osmNodesRel feed {e}
hashjoin[endNodeOSMId, osm_id_e,9997]
projectextend[osm_id, ref, name, roadType, oneway, layer, vmax, geometry,
sPoint; ePoint: .geoData_e]
filter[toline(.geometry) intersects PARTREGION]
projectextend[osm_id, ref, name, roadType, oneway, layer,
vmax; geoData: set_startsmaller(.geometry, ifthenelse(.ePoint < .sPoint, FALSE, TRUE))]
sortby[ref, name, osm_id]
consume;
################################################################################
# Build roads relation #
################################################################################
let longRoadsTmp =
secWaysTmp feed
projectextend[ref, name, roadType, osm_id; sectCurve: toline(.geoData)]
filter [isdefined(.ref)]
filter[not(.roadType contains "link")]
projectextendstream[name, roadType, osm_id, sectCurve; refToken: tokenize(' '+.ref,";")]
projectextend[name, roadType, osm_id, sectCurve; ref: trim(toObject('"'+.refToken +'"',"a"))]
sortby[ref,osm_id]
groupby[ref; roadCurve: group feed projecttransformstream[sectCurve] collect_line[TRUE],
osmIdSet: group feed projecttransformstream[osm_id] createlistj]
sortby[ref, roadCurve, osmIdSet]
rdup
consume;
let roadsTmp =
secWaysTmp feed
projectextend[ref, name, roadType, osm_id; sectCurve: toline(.geoData)]
filter[not(isdefined(.ref))]
filter[isdefined(.name)]
filter[not(.roadType contains "link")]
sortby[name,osm_id]
groupby[name; roadCurve: group feed projecttransformstream[sectCurve] collect_line[TRUE],
osmIdSet: group feed projecttransformstream[osm_id] createlistj]
sortby[name, roadCurve, osmIdSet]
rdup
consume;
let roadsPartsTmp1 =
secWaysTmp feed
projectextend[ref, name, roadType, osm_id; sectCurve: toline(.geoData)]
filter[(.roadType contains "link")]
filter[isdefined(.ref) or isdefined(.name)]
sortby[osm_id]
groupby[osm_id; roadCurve: group feed projecttransformstream[sectCurve] collect_line[TRUE],
osmIdSet: group feed projecttransformstream[osm_id] createlistj]
sortby[osm_id, roadCurve, osmIdSet]
rdup
consume;
let roadsPartsTmp =
secWaysTmp feed
projectextend[ref, name, roadType, osm_id; sectCurve: toline(.geoData)]
filter[not(isdefined(.ref))]
filter[(not(isdefined(.name)))]
sortby[osm_id]
groupby[osm_id; roadCurve: group feed projecttransformstream[sectCurve] collect_line[TRUE],
osmIdSet: group feed projecttransformstream[osm_id] createlistj]
sortby[osm_id, roadCurve, osmIdSet]
rdup
consume;
let roadsRelTmp =
((longRoadsTmp feed project[roadCurve, osmIdSet])
(roadsTmp feed project[roadCurve, osmIdSet])
concat)
((roadsPartsTmp feed project[roadCurve, osmIdSet])
(roadsPartsTmp1 feed project[roadCurve, osmIdSet])
concat)
concat
projectextendstream[osmIdSet; geometry: .roadCurve polylines[TRUE]]
projectextend[osmIdSet; geoData: fromline(.geometry), lenth: size(.geometry)]
sortby[geoData]
addcounter[roadId,1]
sortby[roadId]
consume;
################################################################################
# Compute all junctions and terminating points by finding the existing #
# crossings between ways and add terminating points #
################################################################################
let crossingPtsTmp =
secWaysTmp feed project [osm_id,geoData,layer] {s1}
secWaysTmp feed project [osm_id,geoData,layer] {s2}
itSpatialJoin [geoData_s1, geoData_s2, 4 ,8]
filter[(.osm_id_s1 < .osm_id_s2) and (.layer_s1 = .layer_s2)]
filter[.geoData_s1 intersects .geoData_s2]
projectextendstream[; Road1: .osm_id_s1,
Road2: .osm_id_s2,
Pt: components(crossings(.geoData_s1, .geoData_s2))]
filter[isdefined(.Pt)]
consume;
let roadEndPoints =
roadsRelTmp feed
projectextendstream[geoData; osm_id: createstreamj(.osmIdSet)]
consume;
let junctionsTmp =
(((crossingPtsTmp feed projectextend[Pt; WayId: .Road1])
(crossingPtsTmp feed projectextend[Pt; WayId: .Road2])
concat)
((secWaysTmp feed projectextend [; Pt: getstartpoint(.geoData), WayId: .osm_id])
(secWaysTmp feed projectextend [; Pt: getendpoint(.geoData), WayId: .osm_id])
concat)
concat)
((roadEndPoints feed projectextend[;Pt: getstartpoint(.geoData), WayId: .osm_id])
(roadEndPoints feed projectextend[;Pt: getendpoint(.geoData), WayId: .osm_id])
concat)
concat
filter[isdefined(.Pt)]
consume;
let junctionNumbers =
junctionsTmp feed
project[Pt]
filter[isdefined(.Pt)]
sortby[Pt]
rdup
addcounter[JuncId,1]
consume;
let junctionsRelHelp=
junctionsTmp feed {j}
junctionNumbers feed {n}
itSpatialJoin[Pt_j, Pt_n,4,8]
projectextend[;wayId: .WayId_j, Pt: .Pt_j, juncId: .JuncId_n]
sortby[juncId, wayId]
rdup
consume;
let junctionsRel =
osmNodesRel feed {o}
junctionsRelHelp feed
itSpatialJoin[geoData_o,Pt,4,8]
projectextend[juncId, wayId;osm_id: .osm_id_o,
geoData: .geoData_o]
consume;
let terminatingPts =
junctionsRel feed
sortby [wayId]
groupby [wayId; WayPts: group feed projecttransformstream [geoData] collect_points [TRUE],
juncs: group feed projecttransformstream[juncId] createlistj]
consume;
################################################################################
# Split ways into sections #
################################################################################
let sectionsHelp1 =
secWaysTmp feed
terminatingPts feed {a}
hashjoin[osm_id, wayId_a,9997]
project[osm_id, ref, name, roadType, oneway, vmax, geoData, WayPts_a]
sortby [osm_id]
projectextendstream [osm_id, ref, name, roadType, oneway, geoData,
vmax; sectionCurve: toline(.geoData) polylines [FALSE,.WayPts_a]]
addcounter[SecId,1]
projectextend[osm_id, ref, name, SecId, roadType, oneway, vmax,
geoData; sectGeoData: fromline(.sectionCurve)]
extend[sectStartSmaller: get_startsmaller(.sectGeoData),
startNodePoint: getstartpoint(.sectGeoData),
endNodePoint: getendpoint(.sectGeoData),
lenth: size(.sectGeoData)]
extend[startOnCurve: atpoint(.geoData, .startNodePoint),
endOnCurve: atpoint(.geoData, .endNodePoint)]
projectextend[osm_id, ref, name, SecId, roadType, oneway, vmax,
lenth, startOnCurve, endOnCurve; geoDataSection: set_startsmaller(.sectGeoData,
ifthenelse(.startOnCurve < .endOnCurve,
.sectStartSmaller,
not(.sectStartSmaller)))]
extend[direc: ifthenelse((.oneway = 0) and (not(.roadType contains "motorway")),
[const jdirection value(Both)],
ifthenelse((.oneway = 0) and (.roadType contains "link"),
[const jdirection value(Both)],
ifthenelse(get_startsmaller(.geoDataSection) = (.startOnCurve < .endOnCurve),
[const jdirection value(Up)],
[const jdirection value(Down)]))),
startNodePoint: getstartpoint(.geoDataSection),
endNodePoint: getendpoint(.geoDataSection)]
junctionsRel feed {j}
itSpatialJoin[startNodePoint,geoData_j,4,8]
filter[.startNodePoint = .geoData_j]
projectextend[osm_id, ref, name, SecId, roadType, oneway, vmax, lenth,
direc, endNodePoint; startNodeOSMId: .osm_id_j,
startNodeJuncId: .juncId_j,
geoData: .geoDataSection]
consume;
let sectionsTmp=
sectionsHelp1 feed
junctionsRel feed {n}
itSpatialJoin[endNodePoint,geoData_n,4,8]
projectextend[osm_id, ref, name, SecId, roadType, oneway, vmax, geoData,
lenth, direc, startNodeOSMId, startNodeJuncId; endNodeOSMId: .osm_id_n,
endNodeJuncId: .juncId_n]
sortby[SecId]
rdup
consume;
################################################################################
# Connect roads with junctions and sections to compute roadintervals for each #
# section and junctions for each road #
################################################################################
let roadSectionsHelp =
roadsRelTmp feed
projectextendstream[roadId, geoData, lenth; sectOSMId: createstreamj(.osmIdSet)]
sectionsTmp feed sortby[osm_id] {s}
hashjoin[sectOSMId,osm_id_s,9997]
projectextend[roadId, geoData, sectOSMId, lenth, SecId_s, startNodeJuncId_s,
endNodeJuncId_s, direc_s, geoData_s,
lenth_s, vmax_s; startPoint: getstartpoint(.geoData_s),
endPoint: getendpoint(.geoData_s),
startPos: atpoint(.geoData, getstartpoint(.geoData_s)),
endPos: atpoint(.geoData, getendpoint(.geoData_s))]
filter[isdefined(.startPos)]
filter[isdefined(.endPos)]
sortby[roadId, secId_s]
rdup
consume;
let roadSections =
roadSectionsHelp feed
projectextend [roadId, startNodeJuncId_s, endNodeJuncId_s,
SecId_s, vmax_s, direc_s, lenth_s; geoData: .geoData_s,
routeInt: createrouteinterval(.roadId, .startPos, .endPos, .direc_s)]
sortby[roadId, routeInt]
rdup
consume;
let roadJunctions =
(roadSectionsHelp feed
projectextend[roadId; Pos: .startPoint,
juncId: .startNodeJuncId_s,
juncPosOnRoad: createroutelocation(.roadId, .startPos, .direc_s)])
(roadSectionsHelp feed
projectextend[roadId; Pos: .endPoint,
juncId: .endNodeJuncId_s,
juncPosOnRoad: createroutelocation(.roadId, .endPos, .direc_s)])
concat
sortby[roadId, juncId]
rdup
consume;
################################################################################
# Connect restrictions with junctions and positions #
################################################################################
let secRestrictionsNodes =
junctionsRel feed {j}
osmRestrictionsRel feed
hashjoin[osm_id_j,viaNode,9997]
projectextend [osm_id, fromWay, viaNode, toWay,
restriction; viaPoint: .geoData_j, viaJuncId: .juncId_j]
sectionsTmp feed {s1}
hashjoin[osm_id_s1,fromWay,9997]
projectextend[osm_id, fromWay, viaNode, toWay, restriction, viaPoint,
viaJuncId; fromWaySecId: .SecId_s1,
fromWayJuncId1: .startNodeJuncId_s1,
fromWayJuncId2: .endNodeJuncId_s1]
sectionsTmp feed {s2}
hashjoin[osm_id, toWay, 9997]
projectextend[osm_id, fromWay, viaNode, toWay, restriction, viaPoint,
viaJuncId, fromWaySecId, fromWayJuncId1,
fromWayJuncId2; toWaySecId: .SecId_s2,
toWayJuncId1: .startNodeJuncId_s1,
toWayJuncId2: .endNodeJuncId_s2]
sortby[viaJuncId]
consume;
let secRestrictionsSects =
sectionsTmp feed {s}
osmRestrictionsRel feed
hashjoin[osm_id_s, viaNode,9997]
projectextend[osm_id, fromWay, viaNode, toWay, restriction; viaSectionId: .SecId_s,
viaSectionJuncId1: .startNodeJuncId_s,
viaSectionJuncId2: .endNodeJuncId_s]
sectionsTmp feed {s1}
hashjoin[osm_id_s1,fromWay,9997]
projectextend[osm_id, fromWay, viaNode, toWay, restriction, viaSectionId,
viaSectionJuncId1, viaSectionJundId2; fromWaySecId: .SecId_s1,
fromWayJuncId1: .startNodeJuncId_s1,
fromWayJuncId2: .endNodeJuncId_s1]
sectionsTmp feed {s2}
hashjoin[osm_id_s1,toWay,9997]
projectextend[osm_id, fromWay, viaNode, toWay, restriction, viaSectionId,
viaSectionJuncId1, viaSectionJundId2, fromWaySecId, fromWayJuncId1,
fromWayJuncId2; toWaySecId: .SecId_s2,
toWayJuncId1: .startNodeJuncId_s2,
toWayJuncId2: .endNodeJuncId_s2]
sortby [viaSectionId]
consume;
close database;
quit;