154 lines
4.6 KiB
Plaintext
154 lines
4.6 KiB
Plaintext
################################################################################
|
|
### 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;
|
|
|