################################################################################ ### Importing OSM data From osm-files (2 / 7) ################################################################################ ### Description: ### - Reads data on Streets and points of interest From osm-files. ### Please, see tu_Osm_import.sh for further details. ### ### Preconditions: ### - existing open database ### - enabled libxml2 support ### ### Postconditions: ### - StreetsTmp-reLation ### StreetsTmp: rel{GeoData: sline, Osm_id: int, name: string, ref: string, ### type: string, oNeway: int, bridge: int, maxspeed: int, ### tunnel: bool, layer: int} ### - pointsTmp-reLation ### pointsTmp: rel{Osm_id: int, timestamp: int, name: string, GeoData: point, ### type: string} ### - restrictionsTmp-reLation ### restrictionsTmp: rel{Osm_id: int, From: int, via: int, To: int, ### restriction: text} ### ### Author: ### - Thomas Uchdorf, thomas.uchdorf(at)fernuni-hagen.de ################################################################################ # Importing the raw data From an osm-file # on POIs and converting the (Longitude,Latitude)-coordinates inTo points # # Convention is that the osm-file within the direcTory SRC_DIR_PATH must be # named "city.osm" # let OsmNodesRel = osmimport(SRC_DIR_PATH,'node') extend [GeoData: makepoint(.Lon,.Lat)] remove [Lon,Lat] #filter[bbox(.GeoData) intersects PartRect] consume; # on Streets let OsmWaysTmp = osmimport(SRC_DIR_PATH,'way') filter [isdefined(.Type)] consume; # on restrictions let OsmRestrictionsRel = osmimport(SRC_DIR_PATH,'restriction') filter[.OsmType = "restriction"] remove [OsmType] consume; # Extending the references To osm nodes let OsmWayNodeRefsTmp = OsmWaysTmp feed sortby [Osm_id] projectextendstream [Osm_id; Abc: Tokenize(.NodeRefs,",")] addcounter[OrderId, 1] extend [NodeRef: ToObject(.Abc,0)] remove [Abc] consume; # Replacing the references To osm nodes by the actual points (Undefined points # have To be treated specially. They exist when points exceed the boundaries of # the bounding box.) #let OsmWayPointsTmp = # OsmNodesRel feed {p} # project [Osm_id_p,GeoData_p] # OsmWayNodeRefsTmp feed # hashjoin [Osm_id_p,NodeRef,99997] # extend [PointGeoData: .GeoData_p] # remove [GeoData_p] # consume; let OsmWayPointsTmp = OsmNodesRel feed project [Osm_id,GeoData] {p} OsmWayNodeRefsTmp feed smouterjoin [Osm_id_p,NodeRef] filter [isdefined(.NodeRef)] sortby [Osm_id,OrderId] filter [isdefined(.Osm_id_p)] addcounter[SubStreetId, 1] extend [PointGeoData: .GeoData_p] remove [GeoData_p] consume; # Combining sequences of way points with sequential order ids # (no gaps) To subStreets let osmUncheckedWaysTmp = OsmWayPointsTmp feed project [Osm_id,SubStreetId,OrderId] sortby [Osm_id,SubStreetId,OrderId] OsmWayPointsTmp feed project [Osm_id,SubStreetId,OrderId] sortby [Osm_id,SubStreetId,OrderId] {t} hashjoin [Osm_id,Osm_id_t,99997] filter [(.OrderId_t >= .OrderId) and (.SubStreetId_t = (.SubStreetId + (.OrderId_t - .OrderId)))] sortby [Osm_id,SubStreetId] groupby [Osm_id,SubStreetId; ToSubStreetId: group feed max [SubStreetId_t]] sortby [Osm_id,ToSubStreetId] groupby [Osm_id,ToSubStreetId; FromSubStreetId: group feed min [SubStreetId]] project [Osm_id,FromSubStreetId,ToSubStreetId] sortby [Osm_id,FromSubStreetId,ToSubStreetId] addcounter [NewSubStreetId,1] OsmWayPointsTmp feed extend [Osm_ref: .Osm_id] remove [Osm_id] sortby [Osm_ref,SubStreetId,OrderId] hashjoin [Osm_id,Osm_ref,99997] remove [Osm_ref] # Combining the points To lines sortby [Osm_id,NewSubStreetId,OrderId] groupby [Osm_id,NewSubStreetId; numPoints: group count, GeoData: group feed projecttransformstream [PointGeoData] collect_sline[TRUE]] consume; let OsmWaysRel = OsmWaysTmp feed osmUncheckedWaysTmp feed extend [HelpId: .Osm_id] remove [Osm_id] hashjoin [Osm_id,HelpId,99997] remove [NodeRefs,HelpId] consume; # Checking if Streets with broken lines exist (missing or wrong references) query OsmWaysRel feed filter [not(isdefined(.GeoData))] consume; # SToring the Street data let StreetsTmp = OsmWaysRel feed filter[bbox(.GeoData) intersects PartRect] consume; # SToring the POI data let PointsTmp = OsmNodesRel feed extend [Timestamp: "DUMMY"] consume; # SToring the restriction data let RestrictionsTmp = OsmRestrictionsRel feed # filter[bbox(.GeoData) intersects PartRect] consume;