-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmaster-ski.lua
148 lines (138 loc) · 5.13 KB
/
master-ski.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
-- exclude: ski lifts
api_version = 3
Set = require('lib/set')
Sequence = require('lib/sequence')
Handlers = require("lib/way_handlers")
Relations = require("lib/relations")
--require("segments-ski");
require("handlers");
function WayHandlers.skiaerialway(profile,way,result,data)
if not data.aerialway or data.aerialway =='' then
return;
end
result.forward_speed=15; result.forward_rate=15;
result.backward_mode = mode.inaccessible;
-- duration of gondolas
local duration = way:get_value_by_key("duration")
if duration and durationIsValid(duration) then
result.duration = math.max( parseDuration(duration), 1 )
end
-- station, goods
if data.aerialway == 'gondola' or data.aerialway == 'cable_car' or data.aerialway == 'mixed_lift' then
result.forward_classes['gondola'] = true; result.backward_classes['gondola'] = true;
result.backward_mode = mode.ferry;
result.backward_speed=result.forward_speed; result.backward_rate=result.forward_rate/10;
elseif data.aerialway == 'chair_lift' then
result.forward_classes['chairlift'] = true;
elseif data.aerialway == 't-bar' or data.aerialway == 'j-bar' or data.aerialway == 'platter' or data.aerialway == 'drag_lift' then
result.forward_classes['platter'] = true;
result.forward_rate=result.forward_speed/4;
elseif data.aerialway == 'rope_tow' or data.aerialway == 'zip_line' or data.aerialway == 'magic_carpet' then
result.forward_classes['child'] = true;
result.forward_rate=result.forward_speed/4;
else
-- remaining: goods, station, pilon, yes
--print(data.aerialway);
result.forward_mode = mode.inaccessible;
return false;
end
result.forward_mode = mode.ferry;
result.name = result.name .. ' 🚡';
end
function WayHandlers.skipiste(profile,way,result,data)
-- piste: downhill, foot (for foot transfer between stations)
if not data.piste or data.piste == '' then
return;
end
-- remove piste that are areas, ususally not good for routing
if way:get_value_by_key('area') == 'yes' or way:get_value_by_key('leisure') == 'sports_centre' then
return false;
end
if data.piste == 'foot' or data.piste=='connection' then
result.forward_speed=3; result.forward_rate=3;
result.backward_speed=3; result.backward_rate=3;
result.backward_mode = mode.walking; result.forward_mode = mode.walking;
result.name = result.name .. ' 🚶';
return result;
end
if data.piste == 'downhill' then
result.forward_speed=30; result.forward_rate=30;
result.forward_mode = mode.driving;
result.name = result.name .. ' ⛷';
result.backward_ref = '🚶';
result.backward_speed = 1/10; result.backward_rate = 1/100;
result.backward_mode = mode.walking;
-- todo: class dificulty
return result;
end
end
function WayHandlers.skinordic(profile,way,result,data)
if not data.piste or not data.piste == 'nordic' then
return
end
if data.piste == 'nordic' then
result.forward_speed=5; result.forward_rate=5;
result.backward_speed=5; result.backward_rate=5;
result.backward_mode = mode.driving; result.forward_mode = mode.driving;
result.forward_classes['nordic'] = true; result.backward_classes['nordic'] = true;
end
end
function WayHandlers.namesfromrelations(profile,way,result,data,relations)
if not result.name or result.name == '' then result.name = get_from_rel(relations, way, "piste:type", '*', "name"); end
if not result.name or result.name == '' then result.name = get_from_rel(relations, way, "piste:type", '*', "ref"); end
if not result.name or result.name == '' then result.name = get_from_rel(relations, way, "route", 'ski', "name"); end
end
function setup()
return {
properties = {
weight_name = 'routability',
--force_split_edges = true
},
default_mode = mode.ferry,
default_speed = 1,
classes = Sequence {
'gondola', 'chairlift', 'platter', 'child', 'nordic'
},
-- classes to support for exclude flags
excludable = Sequence {
Set {'gondola'},
Set {'chairlift'},
Set {'platter'},
Set {'child'},
Set {'gondola','chairlift','platter','child'},
Set {'nordic'}
},
relation_types = Sequence {
"route", "piste:type"
}
}
end
function process_way(profile, way, result, relations)
local data = {
aerialway = way:get_value_by_key('aerialway'),
piste = way:get_value_by_key('piste:type')
}
if way:get_value_by_key('railway') == 'funicular' then
data.aerialway = 'gondola'
end
-- data.piste from relation's piste:type
if not data.piste then data.piste = get_from_rel(relations, way, "piste:type", '*', "piste:type"); end
-- if data.piste is still not set, every way in route=ski is piste:type=nordic
if not data.piste and get_from_rel(relations, way, "route", 'ski', "route") then data.piste='nordic'; end
if ( not data.aerialway or data.aerialway =='') and ( not data.piste or data.piste == '') then
return
end
handlers = Sequence {
WayHandlers.default_mode,
WayHandlers.names,
WayHandlers.namesfromrelations,
--WayHandlers.oneway,
WayHandlers.skiaerialway, WayHandlers.skipiste, -- grep piste
WayHandlers.skinordic, -- grep nordic
}
WayHandlers.run(profile, way, result, data, handlers, relations)
end
return {
setup = setup,
process_way = process_way
}