Files
secondo/Algebras/OSM/Scripts/TuImportOsmDataFromOsmFile.sec

154 lines
4.6 KiB
Plaintext
Raw Permalink Normal View History

2026-01-23 17:03:45 +08:00
################################################################################
### 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;