User:Kannix/brouter
Jump to navigation
Jump to search
aim
- make brouter a navigable waterways router: https://brouter.grade.de
draft
- fetch navigable waterways in terms of vessel's dimensions
- maxhight
- maxdraft
- maxwidth
- maxlength
- add waiting times (locks, opening bridges) to ETA
- assign maxspeed to waterway categories (solved)
- assign different forward/backward speeds to free flowing rivers (solved)
- implemnt vector-tiles layer @ brouter-web
setup
prerequisites
- Plesk Obsidian / Ubuntu Bionic Beaver
- apt install default-jre
- https://github.com/nrenner/brouter-web/releases > brouter-web-standalone.0.11.1.zip
- more recent version: http://brouter.de/brouter/offline.html
- https://wiki.openstreetmap.org/wiki/Osmosis#Latest_stable_version
nginx
- additional nginx directives
location /brouter/ {
proxy_pass http://127.0.0.1:17777/;
}
brouter.grade.de
- config.js
if (hostname.endsWith('grade.de')) {
// online service (brouter.grade.de) configuration
BR.conf.host = origin + '/brouter';
BR.conf.profilesUrl = origin + '/brouter-server/profiles2/';
} else {
brouter-server
- https://github.com/frdmn/service-daemons/blob/master/debian
- etc/init.d/brouter-server (755)
NAME="brouter-server" PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" APPDIR="/var/www/vhosts/grade.de/brouter.grade.de/brouter-server" APPBIN="/usr/bin/java" APPARGS="-Xmx128M -Xms128M -Xmn8M -DmaxRunningTime=300 -cp brouter.jar btools.server.RouteServer ./segments4 ./profiles2 ./customprofiles 17777 1 localhost" USER="www-data" GROUP="psaserv"
update-rc.d brouter-server defaultsservice brouter-server startservice brouter-server statusservice brouter-server stop
map creation
issues
- https://groups.google.com/d/msg/osm-android-bikerouting/qAXXNdlXNiM/rm40DyDjBQAJ
- https://groups.google.com/forum/#!topic/osm-android-bikerouting/QoC-2QN7fAE
map data
- CEMT (incl. bridges)
- overpass sample query: https://overpass-turbo.eu/
- overpass API query: ways CEMT=* OR ship=yes OR motorboat=yes and fetch all tagged nodes of these ways (Nordholland ~9mb):
<osm-script>
<union>
<union>
<query type="way">
<has-kv k="CEMT"/>
<bbox-query s="51.90" n="53.50" w="4.00" e="7.25"/>
</query>
<query type="way">
<has-kv k="ship" v="yes"/>
<bbox-query s="51.90" n="53.50" w="4.00" e="7.25"/>
</query>
<query type="way">
<has-kv k="motorboat" v="yes"/>
<bbox-query s="51.90" n="53.50" w="4.00" e="7.25"/>
</query>
</union>
<recurse type="way-node"/>
</union>
<print mode="meta"/>
</osm-script>
formatting map data
./osmosis --read-xml file="test.osm" --write-xml file="test-2.osm"
all.brf
---context:global # following code refers to global config # the elevation parameters assign downhillcost 0 assign downhillcutoff 1.5 assign uphillcost 0 assign uphillcutoff 1.5 ---context:way # following code refers to way-tags assign turncost 0 assign initialcost 0 assign costfactor switch not or waterway= waterway=unknown 1 100000 ---context:node # following code refers to node tags assign initialcost 0
river.brf
---context:global # following code refers to global config # the elevation parameters assign downhillcost 0 assign downhillcutoff 1.5 assign uphillcost 0 assign uphillcutoff 1.5 ---context:way # following code refers to way-tags assign turncost 0 assign initialcost 0 assign costfactor switch or waterway=canal or waterway=river waterway=fairway 1 100000 ---context:node # following code refers to node tags assign initialcost 0
lookups.dat
---lookupversion:10 ---minorversion:13 ---context:way bicycle;0001245560 yes maxspeed;0000000001 none maxspeed;0000000001 4.5 maxspeed;0000000001 5 maxspeed;0000000001 6 4_mph maxspeed;0000000001 7 maxspeed;0000000001 8 maxspeed;0000000001 9 maxspeed;0000025232 10 maxspeed;0000000001 12 maxspeed;0000000001 13 maxspeed;0000000001 13.5 maxspeed;0000000001 15 maxspeed;0000000001 16 maxspeed;0000000001 20 maxspeed;0000000001 25 seamark:type;0000000001 lock_basin seamark:type;0000000001 bridge seamark:type;0000000001 fairway seamark:type;0000000001 recommended_track seamark:bridge:category;0000000001 fixed viaduct aqueduct suspension footbridge seamark:bridge:category;0000000001 opening swing bascule pontoon drawbridge seamark:bridge:category;0000000001 lifting transporter waterway;0000016046 river waterway;0000009496 canal waterway;0000000071 fairway waterway;0000000001 riverbank waterway;0000002202 weir waterway;0000001364 dam waterway;0000000386 lock waterway;0000000321 tidal_flat_slough waterway;0000000179 wadi waterway;0000000126 dock waterway;0000000113 fish_pass waterway;0000000086 boatyard waterway;0000000059 lock_gate waterway;0000000001 safe_water waterway;0000000001 stream waterway;0000000001 narrow draft;0000000001 * maxdraft;0000000001 * depth;0000000001 * maxdraught;0000000001 * passage_time;0000000001 * lock;0000000001 yes boat;0000019888 no private boat;0000002718 yes permissive motorboat;0000001077 yes motorboat;0000000808 no private privat Ship;0000000001 yes ship;0000000001 no CEMT;0000000001 0 CEMT;0000000001 I CEMT;0000000001 II CEMT;0000000001 III CEMT;0000000001 IV CEMT;0000000001 V CEMT;0000000001 Va CEMT;0000000001 Vb CEMT;0000000001 VI CEMT;0000000001 VIa CEMT;0000000001 VIb CEMT;0000000001 VIc CEMT;0000000001 VII brouter_route_placeholder_dummy_01;0000000001 dummy brouter_route_placeholder_dummy_02;0000000001 dummy brouter_route_placeholder_dummy_03;0000000001 dummy brouter_route_placeholder_dummy_04;0000000001 dummy brouter_route_placeholder_dummy_05;0000000001 dummy brouter_route_placeholder_dummy_06;0000000001 dummy brouter_route_placeholder_dummy_07;0000000001 dummy brouter_route_placeholder_dummy_08;0000000001 dummy brouter_route_placeholder_dummy_09;0000000001 dummy brouter_route_placeholder_dummy_10;0000000001 dummy brouter_route_placeholder_dummy_11;0000000001 dummy brouter_route_placeholder_dummy_12;0000000001 dummy brouter_route_placeholder_dummy_13;0000000001 dummy brouter_route_placeholder_dummy_14;0000000001 dummy brouter_route_placeholder_dummy_15;0000000001 dummy brouter_route_placeholder_dummy_16;0000000001 dummy brouter_route_placeholder_dummy_17;0000000001 dummy brouter_route_placeholder_dummy_18;0000000001 dummy brouter_route_placeholder_dummy_19;0000000001 dummy brouter_route_placeholder_dummy_20;0000000001 dummy brouter_route_placeholder_dummy_21;0000000001 dummy ---context:node disused;0000000001 yes waterway;0000050000 dam waterway;0000035000 waterfall waterway;0000000020 fish_pass waterway;0000015000 rapids waterway;0000040000 weir waterway;0000015000 lock_gate maxdraft;0000000001 * depth;0000000001 * water:depth;0000000001 * seamark:type;000007500 bridge seamark:bridge:category;0000000001 fixed viaduct aqueduct suspension footbridge seamark:bridge:category;0000000001 opening swing bascule pontoon drawbridge seamark:bridge:category;0000000001 lifting transporter seamark:bridge:clearance_width;0000000001 * seamark:bridge:clearance_height;0000000001 * seamark:bridge:clearance_height_safe;0000000001 * seamark:bridge:clearance_height_closed;0000000001 * seamark:bridge:clearance_height_open;0000000001 * seamark:type;0000002700 gate seamark:gate:clearance_width;0000000001 * seamark:gate:clearance_height;0000000001 * seamark:type;000000820 cable_overhead seamark:cable_overhead:clearance_height;0000000001 * seamark:cable_overhead:clearance_height_safe;0000000001 *
creating segment files
- make dir
mkdir tmp cd tmp mkdir srtm3_bef mkdir nodetiles mkdir waytiles mkdir waytiles55 mkdir nodes55 mkdir unodes55 mkdir segments
- OsmFastCutter <lookup-file> <node-dir> <way-dir> <node55-dir> <way55-dir> <border-file> <out-rel-file> <out-res-file> <filter-profile> <report-profile> <check-profile> <inputfile>
java -Xmx2600m -Xms2600m -Xmn32m -cp ../brouter-server-test.jar -Ddeletetmpfiles=true -DuseDenseMaps=true btools.util.StackSampler btools.mapcreator.OsmFastCutter ../profiles2/lookups.dat nodetiles waytiles nodes55 waytiles55 bordernids.dat relations.dat restrictions.dat ../profiles2/all.brf ../profiles2/river.brf ../profiles2/softaccess.brf test-2.osm
- PosUnifier <node-tiles-in> <node-tiles-out> <bordernids-in> <bordernodes-out> <srtm-data-dir>
java -Xmx2600m -Xms2600m -Xmn32m -cp ../brouter-server-test.jar -Ddeletetmpfiles=true -DuseDenseMaps=true btools.util.StackSampler btools.mapcreator.PosUnifier nodes55 unodes55 bordernids.dat bordernodes.dat ./srtm3_bef
- WayLinker <node-tiles-in> <way-tiles-in> <bordernodes> <restrictions> <lookup-file> <profile-file> <data-tiles-out> <data-tiles-suffix>
java -Xmx2600m -Xms2600m -Xmn32m -cp ../brouter-server-test.jar -DuseDenseMaps=true -DskipEncodingCheck=true btools.util.StackSampler btools.mapcreator.WayLinker unodes55 waytiles55 bordernodes.dat restrictions.dat ../profiles2/lookups.dat ../profiles2/all.brf segments rd5
custom profile
issues
waterway.brf
---model:btools.router.WaterwayModel
---context:global # following code refers to global config
# user values
# my boat in meter
assign boat_height 1.5 # %boat_height% | Boat height in Meter | number
assign boat_width 2.2 # %boat_width% | Boat width in Meter | number
assign boat_length 10.0 # Boat height in Meter | (not used now)
assign boat_draft 1.2 # %boat_draft% | Boat draft in Meter | number
assign literHour 1.5 # %literHour% | liter per hour | number
# my boat is CEMT class (decimal)
assign boat_class 1
# my boat has max speed
assign maxSpeed 18 # km/h (Caution: this is case sensitive internal parameter and different to maxspeed)
# handle with care, this belongs to your local area and your boat
assign speed_normal 10 # %speed_normal% | Speed in kmh | number
assign flow_rate 0 # %flow_rate% | Flow in kmh | number
# global values
assign validForBikes 0
assign validForCars 0
assign validForFoot 0
assign validForVessels 1
#assign totalMass = 1000 # unused at the moment xtotalMass% | Mass (in kg) of the bike + biker, for travel time computation | number
#assign bikerPower = 15000 # unused at the moment xbikerPower% | Average power (in W) provided by the biker, for travel time computation | number
assign shortest_way 1 # 0 as default
#assign vmax 20
assign turnInstructionMode 1 # 0=none, 1=auto-choose, 2=locus-style, 3=osmand-style, 4=comment-style, 5=gpsies
assign processUnusedTags 0 # lists all (incl. unused) key/value pairs in geojson
assign cost1speed 20 # kmh
assign inverseRouting 1
assign showspeed 1 # show speed instead of elevation (geojson)
assign waiting_lock 900 # in seconds, for one lock_gate
assign waiting_bridge 900 # in seconds
assign around_time 900 # in seconds, avoid obstacles
assign notdefined 10000
# https://wiki.openstreetmap.org/wiki/Key:CEMT
# https://wiki.openstreetmap.org/wiki/Inland_navigation
# CEMT is available in this region
assign can_use_CEMT true
---context:way # following code refers to way-tags
assign control_draft
# switch and CEMT=0 not maxdraft= true
switch and CEMT=0 not draft= true
# switch and CEMT=0 not depth= true
# switch and CEMT=0 not maxdraught= true
# switch and not waterway= not maxdraft= true
# switch and not waterway= not draft= true
# switch and not waterway= not depth= true
# switch and not waterway= not maxdraught= true
false
assign pass_lock
if seamark:type=lock_basin then (
true
)
else false
assign this_class # len width draught height
if CEMT=0 then 1 # used in NL for recreational boating fairways
else if CEMT=I then 2 # 38,50 5,05 1,8-2,2 4
else if CEMT=II then 3 # 50-55 6,6 2,5 4-5
else if CEMT=III then 4 # 67-80 8,2 2,5 4-5
else if CEMT=IV then 5 # 80-85 9,5 2,5 5,25-7
else if CEMT=V then 6 # 95-110 11,4 2,5-4,5 5,25-7
else if CEMT=Va then 6 # 95-110 11,4 2,5-4,5 5,25-7
else if CEMT=Vb then 7 # 172-185 11,4 2,5-4,5 5,25-9,1
else if CEMT=VI then 8 # 95-110 22,8 2,5-4,5 7-9,1
else if CEMT=VIa then 8 # 95-110 22,8 2,5-4,5 7-9,1
else if CEMT=VIb then 9 # 185-195 22,8 2,5-4,5 7-9,1
else if CEMT=VIc then 10 # 193-200 34,2 2,5-4,5 9,1
else if CEMT=VII then 11 # 195/285 34,2 2,5-4,5 9,1
else
0
assign use_CEMT
if not CEMT= then (
# if motorboat=no then false
# else if greater this_class boat_class then true
# else
switch motorboat=no false
switch ship=no false
switch CEMT=0|I|II|III|IV|V|Va|Vb|VI|VIa|VIb|VIc|VII true # make sure to drop classes you can't use
false
)
else
false
assign boat_maxspeed =
if ( and waterway=river reversedirection=yes ) then add speed_normal flow_rate
else if ( and waterway=river reversedirection= ) then sub speed_normal flow_rate
else speed_normal
assign maxspeed_impl =
switch CEMT=0 10 # 6
switch CEMT=I|II|III|IV 10
switch CEMT=V|Va|Vb 10 # 12
switch CEMT=VI|VIa|VIb|VIc|VII 15
20
assign maxspeed_expl =
switch maxspeed= notdefined
switch maxspeed=6 6
switch maxspeed=9 9
switch maxspeed=4.5 4.5
switch maxspeed=5 5
switch maxspeed=7 7
switch maxspeed=8 8
switch maxspeed=10 10
switch maxspeed=12 12
switch maxspeed=13 13
switch maxspeed=13.5 13.5
switch maxspeed=15 15
switch maxspeed=16 16
switch maxspeed=20 20
switch maxspeed=25 25
notdefined
assign maxspeed_defined
switch lesser maxspeed_expl notdefined maxspeed_expl maxspeed_impl
assign maxspeed =
min maxspeed_defined boat_maxspeed
assign turncost 0
assign initialcost
if waterway=weir then around_time
else if waterway=dam then around_time
else if waterway=fish_pass then around_time
else
0
assign costfactor
if use_CEMT then (
1
)
else (
if waterway= then 10000
else if seamark:type=fairway then 1
else if waterway=canal then 1
else if waterway=river then 1
else if waterway=safe_water then 1
else if waterway=fairway then 1
else if waterway=narrow then 1
else if seamark:type=recommended_track then 1
else if motorboat=yes then 1
else
15000
)
---context:node # following code refers to node tags
assign control_node_draft
switch not maxdraft= true
switch not depth= true
switch not water:depth= true
false
assign control_bridge_fixed_height
if seamark:bridge:category=fixed then true
else false
assign control_bridge_opening_height
if seamark:bridge:category=opening then true
else false
assign control_node_bridge_width
if not seamark:bridge:clearance_width= then true
else false
assign initialcost
switch waterway=lock_gate waiting_lock
switch seamark:bridge:category=opening waiting_bridge
switch waterway=waterfall around_time
0
waterway_fast.brf
- assign costfactor to waterway-classes
waterway_short.brf
- do not assign costfactor to waterway-classes