「OpenStreetMapから鉄道路線データを落とせない」と愚痴っていたら、社内の人から「OSMに鉄道データ入っていますよ」と言われて、愕然とした件
ところが、問題は、
/usr/share/osm2pgrouting/mapconfig_for_bicycles.xml(自転車)
/usr/share/osm2pgrouting/mapconfig_for_cars.xml(自動車)
/usr/share/osm2pgrouting/mapconfig_for_pedestrian.xml(歩行者)
の3つしか、準備されておらず、鉄道のテンプレートがありませんでした。
本当に鉄道を使ったDBはつくれないのかな? と思い、ちょっと試してみました。
こちらに、mapconfig_for_cars.xml があるので、それを見てみました。
私の場合、芳賀・宇都宮LRT と、一般の道路を交えたダイクストラを実現することが目的でしたが、まずは、(道路のことは忘れて)芳賀・宇都宮LRTの情報だけを取り出すことに注力しました。
で、こんなの(mapconfig_for_train.xml)を作ってみました。
ちなみに、"tram"とは路上電車のことで、要するにLRTのことです。
<?xml version="1.0" encoding="UTF-8"?> <configuration> <tag_name name="railway" id="1"> <tag_value name="tram" id="101" priority="1.0" maxspeed="40" /> </tag_name> </configuration>
id="1"> とか、 id="101" priority="1.0" maxspeed="40" /> は、適当に付けました(多分、この辺は適当で良いと思います)。
で、これで何が出てくるかを見ていたのですが、
<tag_name name="railway" id="1">
<tag_value name="tram" id="101" priority="1.0" maxspeed="40" />
</tag_name>
</configuration>
この結果、分かったことは、osmデータの中にある、<tag k="railway" v="tram"/> が含まれている、<way>のタグが取り出されることでした。
<way id="678320671" version="2" timestamp="2021-08-04T10:06:56Z" changeset="0">
<nd ref="6351482006"/>
<nd ref="5948014189"/>
<nd ref="5558816378"/>
<nd ref="5948014109"/>
<tag k="bridge" v="yes"/>
<tag k="railway" v="tram"/>
<tag k="electrified" v="contact_line"/>
<tag k="frequency" v="0"/>
<tag k="gauge" v="1067"/>
<tag k="maxspeed" v="40"/>
<tag k="name" v="(仮称)宇都宮ライトレール"/>
<tag k="railway" v="construction"/>
<tag k="voltage" v="750"/>
</way>
で作った、utunomiya-railway-latest.osm を使って、テスト用のDB (test_db)を作っておいて、
osm2pgrouting -f utunomiya-railway-latest.osm -c mapconfig_for_train.xml -d test_db -U postgres
をやってみました(実は、芳賀・宇都宮LRTの情報は、工事中の情報が入っていて、utunomiya-railway-latest.osmには、<tag k="construction" v="tram"/>と記載されていましたので、これを、強制的に<tag k="railway" v="tram"/>に置換しました)。
test_dbをQGISで表示したら、こんな感じで出てきました。
出発点のid = 1 と、
終着点のid = 6 を使って、
ダイクストラ計算を実施してみました。
root@a2b2f7061d88:/tmp# psql -U postgres
psql (12.5 (Debian 12.5-1.pgdg100+1))
Type "help" for help.
postgres=# \c test_db
You are now connected to database "test_db" as user "postgres".
test_db=# SELECT seq, node, edge, cost, agg_cost FROM pgr_dijkstra('SELECT gid as id, source, target,length_m as cost FROM ways',1, 6, false);
seq | node | edge | cost | agg_cost
-----+------+------+--------------------+--------------------
1 | 1 | 112 | 968.5677557470831 | 0
2 | 105 | 1 | 401.6831070639031 | 968.5677557470831
3 | 2 | 40 | 1932.1157045557927 | 1370.2508628109863
4 | 36 | 43 | 91.90138904387848 | 3302.3665673667792
5 | 39 | 65 | 111.55679510881248 | 3394.267956410658
6 | 63 | 67 | 159.06195161851494 | 3505.8247515194703
7 | 65 | 10 | 45.988089536965845 | 3664.886703137985
8 | 9 | 74 | 25.50249632394143 | 3710.874792674951
9 | 71 | 8 | 83.08385331794597 | 3736.3772889988927
10 | 7 | 12 | 27.274859434129702 | 3819.4611423168385
11 | 10 | 36 | 55.83052462128617 | 3846.736001750968
12 | 32 | 37 | 48.05528375189372 | 3902.5665263722544
13 | 33 | 2 | 700.36313814633 | 3950.621810124148
14 | 3 | 69 | 13.830090594515813 | 4650.984948270478
15 | 67 | 57 | 269.7483878007764 | 4664.815038864994
16 | 55 | 13 | 243.90865759717457 | 4934.56342666577
17 | 11 | 14 | 592.4332460936212 | 5178.472084262944
18 | 12 | 30 | 197.95743212114834 | 5770.905330356565
19 | 26 | 44 | 230.11474397115853 | 5968.862762477714
20 | 40 | 32 | 32.15748444428291 | 6198.977506448872
21 | 28 | 34 | 128.30514459608628 | 6231.134990893155
22 | 30 | 46 | 292.51977773825814 | 6359.440135489242
23 | 42 | 47 | 42.00097102860326 | 6651.9599132275
24 | 43 | 51 | 317.7487966492082 | 6693.960884256103
25 | 48 | 3 | 24.366299209335182 | 7011.709680905311
26 | 4 | 6 | 35.05578311994414 | 7036.075980114646
27 | 46 | 62 | 269.6784973606185 | 7071.13176323459
28 | 60 | 71 | 261.6741520558861 | 7340.810260595208
29 | 69 | 20 | 1312.5430898908662 | 7602.484412651094
30 | 18 | 72 | 86.31512692490578 | 8915.027502541961
31 | 70 | 4 | 962.8503750491366 | 9001.342629466868
32 | 5 | 60 | 131.65329169122384 | 9964.193004516004
33 | 58 | 59 | 129.1237292961209 | 10095.846296207228
34 | 57 | 53 | 93.77398873447196 | 10224.97002550335
35 | 50 | 55 | 200.4322777934951 | 10318.744014237822
36 | 52 | 7 | 4122.794957245806 | 10519.176292031318
37 | 6 | -1 | 0 | 14641.971249277123
(37 rows)
芳賀・宇都宮LRTの全長は、15kmと聞いていましので、ほぼドンピシャ(14641.971249277123メートル)が算出されていることが分かります。
ただ、現在のnodeの位置は、駅の場所に対応していないので、鉄道情報のosmファイルを手動で作り直す必要はあります(nodeとgeomの変更等)が、その前に、とりあえず今のままの方式で、道路ー鉄道混在のダイクストラができるか、試してみます。
(2時間経過)
こんなのを作って試してみました。
mapconfig_for_cars_tram.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<tag_name name="highway" id="1">
<tag_value name="motorway" id="101" priority="1.0" maxspeed="130" />
<tag_value name="motorway_link" id="102" priority="1.0" maxspeed="130" />
<tag_value name="motorway_junction" id="103" priority="1.0" maxspeed="130" />
<tag_value name="trunk" id="104" priority="1.05" maxspeed="110" />
<tag_value name="trunk_link" id="105" priority="1.05" maxspeed="110" />
<tag_value name="primary" id="106" priority="1.15" maxspeed="90" />
<tag_value name="primary_link" id="107" priority="1.15" maxspeed="90" />
<tag_value name="secondary" id="108" priority="1.5" maxspeed="90" />
<tag_value name="secondary_link" id="109" priority="1.5" maxspeed="90"/>
<tag_value name="tertiary" id="110" priority="1.75" maxspeed="90" />
<tag_value name="tertiary_link" id="111" priority="1.75" maxspeed="90" />
<tag_value name="residential" id="112" priority="2.5" maxspeed="50" />
<tag_value name="living_street" id="113" priority="3" maxspeed="20" />
<tag_value name="service" id="114" priority="2.5" maxspeed="50" />
<tag_value name="unclassified" id="117" priority="3" maxspeed="90"/>
<tag_value name="road" id="100" priority="5" maxspeed="50" />
</tag_name>
<tag_name name="railway" id="1">
<tag_value name="tram" id="101" priority="1.0" maxspeed="40" />
</tag_name>
</configuration>
osm2pgrouting -f utsunomiya.osm -c mapconfig_for_cars_tram.xml -d test_db2 -U postgres
(<tag k="construction" v="tram"/>の<tag k="railway" v="tram"/>の強制置換を忘れずに)
QGISで表示してみたところ、ちゃんとLRTの架橋ができていました。
ただノード接続ができているか不明なので、これから調べてみます(経路が繋がっていないと、ダイクストラ計算はできないはずなので)。駅を手動で作るしかないかな・・・