街の中に道路を作って、ダイクストラ計算ができるか試してみた件 ―― JOSMを使った道路追加の方法を試す
この投稿の最後に書いた『経路が繋がっていないと、ダイクストラ計算はできないはずなので』を、JOSMを使ってなんとかできないか実験中しています。
で、こちらの本で例題として出している街のデータを使って実験します(宇都宮のデータはデカすぎるので)。
https://github.com/TomoichiEbata/hirohakama/tree/main/hiro_db の hirohakama.osmを使って実験します。
まず、hirohakama.osm から hirohakama1.osmを複製して、さらに、このhirohakama1.osmを、JOSMにローディングして、ファイル → 保存をします。JOSMに入れるだけで、フォーマットの一部が変更されるからです。
こうしておいて、さらに、hirohakama1.osmのコピー、hirohakama2.osmを作成します。
以後、この2つのファイルを比較することで、作成状況を把握していきたいと思います。
まず、すでにあるノード(node)間を繋いで道路を作ってみます。(小さい□がnodeです)
をクリックして、
この2点間に線を引きます。
で、その後、このhirohakama2.osmをセーブして、hirohakama1.osmと比較してみました。
結果は以下の通り。way id='220736115' に、ref='3813457320'のノードが追加されています(この一行だけ)。
ちなみに、ref='3813457320'のノードの情報は、
<node id='3813457320' timestamp='2015-11-02T07:07:06Z' uid='3057995' user='oini' visible='true' version='1' changeset='35026994' lat='35.5957559' lon='139.4735283' />
となっています。
既存のノード同士をくっ付けるのであれば、結構簡単にできそうです。
では、ノード以外の道路を適当に繋げるとどうなるかを、調べてみます。
で、ノード番号 -101965, -101966 の座標は入っていませんでした(作られていませんでした)。多分ダイクストラやっても、無視されると思います。
見落していました。作られていました(ファイルの最初の方だったので)。
<node id='-101792' action='modify' visible='true' lat='35.59604489421' lon='139.47307912887' />
<node id='-101793' action='modify' visible='true' lat='35.59558383511' lon='139.47265061383' />
ノードを動かしたら、
ちゃんと、ノードの座標も動いていました。
ただ、ノードでない場所(×の部分)とかを動かしてノードを増やしても、先程のようにマイナスのノード番号が出てきて、座標も追加されませんでした。
しかし、ノードの追加はしたいなぁ(今後のことを考えると)
で、"JOSM" "ノードの追加" で検索したら、このページが出てきました。
しかし、ただノードを追加すれば良いってもんじゃない。既存のWAYに埋め込まなれば意味がない。さて、どうしようか。
今考えている、最も安直なアイデアは、
OSMファイルに、ノード番号 -101965, -101966 の座標を手で書き込む、です。
試してみて、上手くいったら、またご報告します。
不要です。座標(ノード)はできていました。現時点の問題は、QGISとかに表示されない、ということです。
私が、人工的に追加したノードの記述は、
<node id='-101792' action='modify' visible='true' lat='35.59604489421' lon='139.47307912887' />
ですが、オリジナルのノードは、
<node id='278288868' timestamp='2015-11-02T07:00:53Z' uid='3057995' user='oini' visible='true' version='4' changeset='35026937' lat='35.5997134' lon='139.4660138' />
と、だいぶ表示形式が違うようです。
JOSMでは表示されますが、QGISでは表示されません。
に、
JOSMは、どの要素が変更されたかを正確に記録しています。アップロード時には、あなたが触っていないオブジェクトはすべて無視されます。タグを追加して後で削除した場合など、例外があるかもしれません。
この情報はOSM XMLファイルにも保存されます。action='modify' と action='delete' の要素だけが、OSM データベースにアップロードされます。
との記載がありました。つまり、本番情報として認識されないのかな、と思っています。
https://wiki.openstreetmap.org/wiki/JA:%E3%83%8E%E3%83%BC%E3%83%89
には、
名前 | 値 | 説明 |
---|---|---|
id | 整数(>=1) | ノードのIDはノードの中でのみ一意となる。(同じIDを持つウェイが存在しても良い。)一般的なエディターでは、サーバーに保存される前のノードのIDに負数が用いられる。サーバー上のノードのIDは不変であり、既存のノードに割り当てられたIDは将来にわたって変更されない。削除されたノードのIDが最利用されることはない(削除を取り消した場合を除く)。 |
という記載があるので、少なくとも負数を使うのは、ダメみたい。
近くにある、このNodeとWayを参照してみる。
(宇都宮レールウェイの場合)<tag k='construction' v='tram'/>と記載されていましたので、これを、強制的に<tag k='railway' v='tram'/>に置換する
(1)node id, way idの負数から、マイナスを取って、強制的に正数にする(他のnodeやwayとぶつかっていないことを確認する)
(2)"action='modify'" を削除してみる
(2)<tag k='highway' v='residential' />を追加してみる。
<way id='102395' visible='true'>
<nd ref='101792' />
<nd ref='101793' />
<tag k='highway' v='residential' />
</way>
で、これでQGISで表示したら、やっと出てきました。
この、手動で変更したhirohakama-21.osmが、postgreSQL+postGISに載るかやってみました。
詳しい手続は、このWebサイトから探していただくか、面倒なら、GISをDIYで作ろう―PostGISを使い倒すを手に入れて下さい。
root@abbab13a933e:/# psql -U postgres
psql (12.5 (Debian 12.5-1.pgdg100+1))
Type "help" for help.postgres=# CREATE DATABASE hiro_db21;
CREATE DATABASE
postgres=# \c hiro_db21
You are now connected to database "hiro_db21" as user "postgres".
hiro_db21=# create extension postgis;
CREATE EXTENSION
hiro_db21=# create extension pgrouting;
CREATE EXTENSIONhiro_db21=# \dt
List of relations
Schema | Name | Type | Owner
--------+-----------------+-------+----------
public | spatial_ref_sys | table | postgres
(1 row)hiro_db21=# exit
root@abbab13a933e:/# osm2pgrouting -f /hiro_db/hirohakama-21.osm -c /usr/local/share/osm2pgrouting/mapconfig_for_cars.xml -d hiro_db21 -U postgres
さて、ダイクストラがちゃんと働いているかを調べてみました。
hiro_db21=# SELECT seq, node, edge, cost FROM pgr_dijkstra('SELECT gid as id,
source, target,length as cost, reverse_cost FROM ways',31, 262);
seq | node | edge | cost
-----+------+------+------------------------
1 | 31 | 1 | 0.0002245334340526014
2 | 1 | 3 | 0.000629444702259577
3 | 2 | 356 | 0.00046326006156789223
4 | 262 | -1 | 0
(4 rows)
QGISで調べてみました。
新しい道路で、ダイクストラ計算ができていることが確認できました。
P.S. 調べていたら、駅の構成についての説明文を見つけました。後程、参考にさせて貰おうと思います。