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

332 lines
8.9 KiB
Plaintext
Raw Normal View History

2026-01-23 17:03:45 +08:00
################################################################################
### Adjusting imported OSM data to the standard geofabrik format (3 / 7)
################################################################################
### Description:
### - This script is only needed, if the shape files used for import were
### created manually. It adjusts the imported OSM data to the generic format
### provided by shape files from the provider geofabrik.
### Please, see tu_shp_import.sh for further details.
###
### Preconditions:
### - existing open database
### - streetsTmp-relation
### streetsTmp: rel{geoData: sline, ID: int, part: int, attrib: string}
###
### 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}
###
### Author:
### - Thomas Uchdorf, thomas.uchdorf(at)fernuni-hagen.de
################################################################################
# --- Working on streets
# Concatenating split up attrib-strings
let StreetsWholeAttrib =
StreetsTmp feed
sortby [ID,Part]
extend [Tags: trim(.Attrib)]
remove [Attrib]
groupby [ID;
AllTags: group feed
aggregateB [Tags;
fun(A: text,B: text)
(A + B); A
]]
extend [HelpId: .ID]
remove [ID]
streetsTmp feed
filter [.Part = 0]
remove [Part, Attrib]
hashjoin [HelpId,ID,99997]
extend [Attrib: .AllTags]
remove [AllTags]
consume;
# Deleting temporary relation
delete StreetsTmp;
# Ignoring unwanted data on railways, barriers and so on
let InterestingStreets =
StreetsWholeAttrib feed
filter [.Attrib contains "highway"]
consume;
# Extending tags that are kept in one attribute
let StreetTags =
InterestingStreets feed
extendstream [Abc: tokenize(.attrib,"|")]
consume;
# Creating temporary relations with data on the relevant tags
let RoadClassTags =
StreetTags feed
sortby [ID]
groupby [ID;
Cnt: group count,
RoadClassTmp: group feed
aggregateB [Abc;
fun(A: text,B: text)
ifthenelse(A contains "highway = ",
trim(A),
ifthenelse(B contains "highway = ",
trim(B),
'UNKNOWN'));
'EMPTY']]
projectextend [;
OsmId: .ID,
RroadClass: replace(.RoadClassTmp,'highway = ',"")]
consume;
# TODO add special treatment for one-ways in the opposite direction of the road
# (oneway = -1 or oneway = reverse)
let OneWayTags =
InterestingStreets feed
projectextend [;
OsmId: .ID,
OneWay:
ifthenelse((.Attrib contains "oneway = yes") or
(.Attrib contains "oneway = 1") or
(.Attrib contains "oneway = true"),
1,
ifthenelse((.Attrib contains "oneway = -1") or
(.Attrib contains "oneway = reverse"),-1,0))]
consume;
let NameTags =
StreetTags feed
sortby [ID]
groupby [ID;
Cnt: group count,
NameTmp: group feed
aggregateB [Abc;
fun(A: text,B: text)
ifthenelse(A contains "name = ",
trim(A),
ifthenelse(B contains "name = ",
trim(B),
'UNKNOWN'));
'UNKNOWN']]
projectextend [;
OsmId: .ID,
Name: replace(.NameTmp,'name = ',"")]
consume;
let LayerTags =
StreetTags feed
sortby [ID]
groupby [ID;
Cnt: group count,
LayerTmp: group feed
aggregateB [Abc;
fun(A: text,B: text)
ifthenelse(A contains "layer = ",
trim(A),
ifthenelse(B contains "layer = ",
trim(B),
'UNKNOWN'));
'UNKNOWN']]
projectextend [;
OsmId: .ID,
Layer: replace(.LayerTmp,'layer = ',"")]
consume;
let TunnelTags =
InterestingStreets feed
projectextend [; OsmId: .ID, Tunnel: (.Attrib contains "tunnel = yes")]
consume;
let BridgeTags =
InterestingStreets feed
projectextend [;
OsmId: .ID,
Bridge: ifthenelse(.Attrib contains "bridge = yes", 1, 0)]
consume;
let RefTags =
StreetTags feed
sortby [ID]
groupby [ID;
Cnt: group count,
RefTmp: group feed
aggregateB [Abc;
fun(A: text,B: text)
ifthenelse(A contains "ref = ",
trim(A),
ifthenelse(A contains "ref = ",
trim(B),
'UNKNOWN'));
'UNKNOWN']]
projectextend [;
OsmId: .ID,
Ref: replace(.RefTmp,'ref = ',"")]
consume;
let MaxSpeedTags =
StreetTags feed
sortby [ID]
groupby [ID;
Cnt: group count,
MaxspeedTmp: group feed
aggregateB [Abc;
fun(A: text,B: text)
ifthenelse(A contains "maxspeed = ",
trim(A),
ifthenelse(B contains "maxspeed = ",
trim(B),
'UNKNOWN'));
'UNKNOWN']]
projectextend [;
OsmId: .ID,
Maxspeed: replace(.MaxspeedTmp,'maxspeed = ',"")]
consume;
# Assembling the street data
let StreetsTmp =
(((((((RoadClassTags feed
OneWayTags feed {a}
hashjoin [OsmId, OsmId_a, 999997])
NameTags feed {b}
hashjoin [OsmId, OsmId_b, 999997])
LayerTags feed {c}
hashjoin [OsmId, OsmId_c, 999997])
TunnelTags feed {d}
hashjoin [OsmId, OsmId_d, 999997])
BridgeTags feed {e}
hashjoin [OsmId, OsmId_e, 999997])
RefTags feed {f}
hashjoin [OsmId, OsmId_f, 999997])
MaxSpeedTags feed {g}
hashjoin [OsmId, OsmId_g, 999997])
InterestingStreets feed
hashjoin [OsmId, ID, 999997]
projectextend [GeoData;
Osm_id: .OsmId,
type: tostring(.RoadClass),
Oneway: .OneWay_a,
Name: tostring(.Name_b),
Layer: ifthenelse(.Layer_c contains "UNKNOWN",
0,
toObject(.Layer_c,1)),
Tunnel: .Tunnel_d,
Bridge: .Bridge_e,
Ref: tostring(.Ref_f),
Maxspeed: ifthenelse(.Maxspeed_g contains "UNKNOWN",
0,
toObject(.Maxspeed_g,1))]
consume;
# Deleting temporary relation
delete InterestingStreets;
# Deleting tag-relations
delete RoadClassTags;
delete OneWayTags;
delete NameTags;
delete LayerTags;
delete TunnelTags;
delete BridgeTags;
delete RefTags;
delete MaxSpeedTags;
delete StreetTags;
# --- Processing POIs
# Concatenating split up attrib-strings
let PointsWholeAttrib =
PointsTmp feed
sortby [ID,Part]
extend [Tags: trim(.Attrib)]
remove [Attrib]
groupby [ID;
AllTags: group feed
aggregateB [Tags;
fun(A: text,B: text)
(A + B); A
]]
consume;
# Extending tags that are kept in one attribute
let PointTags =
PointsWholeAttrib feed
extendstream [Tags: tokenize(.AllTags,"|")]
consume;
# Creating temporary relations with data on the relevant tags
let NameTags =
PointTags feed
sortby [ID]
groupby [ID;
Cnt: group count,
NameTmp: group feed
aggregateB [Tags;
fun(A: text,B: text)
ifthenelse(A contains "name = ",
trim(A),
ifthenelse(B contains "name = ",
trim(B),
'UNKNOWN'));
'UNKNOWN']]
projectextend [;
OsmId: .ID,
Name: replace(.NameTmp,'name = ',"")]
consume;
let AmenityTags =
PointTags feed
sortby [ID]
groupby [ID;
Cnt: group feed count,
AmenityTmp: group feed
aggregateB [Tags;
fun(A: text,B: text)
ifthenelse(A contains "amenity = ",
trim(A),
ifthenelse(B contains "amenity = ",
trim(B),
'UNKNOWN'));
'UNKNOWN']]
projectextend [;
OsmId: .ID,
Type: replace(.AmenityTmp,'amenity = ',"")]
consume;
# Renaming pointsTmp
let PointsHelp =
PointsTmp feed
consume;
delete PointsTmp;
# Restoring pointsTmp and inserting missing attributes from the temporary
# tag-relations
let PointsTmp =
(PointsHelp feed
filter [.Part = 0]
remove [Part, Attrib]
NameTags feed
smouterjoin [ID, OsmId]
filter [isdefined(.ID)])
remove [OsmId]
AmenityTags feed
smouterjoin [ID, OsmId]
filter [isdefined(.ID)]
remove [ID]
extend [Osm_id: .OsmId, Timestamp: 0]
remove [OsmId]
filter [not((isdefined(.Name) and (.Name = 'UNKNOWN'))
and (isdefined(.Type) and (.Type = 'UNKNOWN')))]
consume;
# Deleting temporary relations
delete PointsHelp;
delete PointsWholeAttrib;
# Deleting tag-relations
delete PointTags;
delete NameTags;
delete AmenityTags;