2022/05,江端さんの技術メモ

package main

import (
	"fmt"
	"log"
	"net/http"

	"github.com/PuerkitoBio/goquery"
)

func main() {
	// Request the HTML page.
	res, err := http.Get("http://kobore.net")
	if err != nil {
		log.Fatal(err)
	}
	defer res.Body.Close()
	if res.StatusCode != 200 {
		log.Fatalf("status code error: %d %s", res.StatusCode, res.Status)
	}
	// Load the HTML document
	doc, err := goquery.NewDocumentFromReader(res.Body)
	if err != nil {
		log.Fatal(err)
	}
	doc.Find("input").Each(func(i int, s *goquery.Selection) {
		// For each item found, get the title
		title, _ := s.Attr("type")
		fmt.Printf("Review %d: %s\n", i, title)
	})
}

2022/05,江端さんの技術メモ

utsu_tram_db=# select * from ways where source =0
;
gid | osm_id | tag_id | length | length_m | name | source | target | source_osm | target_osm | cost | reverse_cost | cost_s | reverse_cost_s | rule | one_way | oneway | x1 | y1 | x2 | y2 | maxspeed_forward | maxspeed_backward | priority
| the_geom

gid | osm_id | tag_id | length | length_m | name |

source: 始点ノードの識別子

target : 始点ノードの識別子

| source_osm | target_osm |

costcost : エッジにかかる重み(負の重みは、エッジがグラフに挿入されるのを防ぎます)

reverse_cost: エッジの反対方向のためのコスト。

| cost_s | reverse_cost_s | rule | one_way | oneway |

x1 : エッジの始点のx座標

y1 : エッジの始点のy座標

x2 : エッジの終点のx座標

y2 : エッジの終点のy座標

| maxspeed_forward | maxspeed_backward | priority
| the_geom

 

・id : エッジの識別子 [int4] ・・・・source : 始点ノードの識別子 [int4] ・・・・target : 終点ノードの識別子 [int4] ・・・・cost : エッジにかかる重み(負の重みは、エッジがグラフに挿入されるのを防ぎます)。 [float8] ・・・・reverse_cost(オプション) : エッジの反対方向のためのコスト。

2022/05,江端さんの技術メモ

JSONで、芳賀・宇都宮LRTの路線と一般道を、停車駅の単位で接続して、LRTを道路扱いする方法にしてみました。

で、昨日の実験結果の方法

街の中に道路を作って、ダイクストラ計算ができるか試してみた件 ―― JOSMを使った道路追加の方法を試す

を使って、utsunomiya-lrt-latest-1-no_modify.osmを手動で作成しました。

そんで、もって、

OpenStreetMapから、鉄道情報(芳賀・宇都宮LRT)を引き出して、ダイクストラ計算やってみました。

を使って、道路とLRTのみのDBを作りました。

root@a2b2f7061d88:~# osm2pgrouting -f /utsu_db/utsunomiya-lrt-latest-1-no_modify.osm -c /utsu_db/mapconfig_for_cars_tram.xml -d utsu_tram_db -U postgres

これで、私は、LRTの架橋を使って、「さあ、道から乗って、LRTに乗って、橋を渡って、道に下りられるか?」を試してみます。

ターゲットとしたノードは、駅近くを選びました。

では始点の方を拡大します。

ダイクストラ計算の結果

postgres=# \c utsu_tram_db
You are now connected to database "utsu_tram_db" as user "postgres".
utsu_tram_db=# SELECT seq, node, edge, cost, agg_cost FROM pgr_dijkstra('SELECT gid as id, source, target,length_m as cost FROM ways',14779, 14266, false);
seq | node | edge | cost | agg_cost
-----+-------+-------+--------------------+--------------------
1 | 14779 | 42200 | 42.785394484227744 | 0
2 | 34 | 19785 | 7.618791492678159 | 42.785394484227744
3 | 35 | 48595 | 389.45546677917343 | 50.4041859769059
4 | 42701 | 59452 | 12.262652109536079 | 439.85965275607936
5 | 42982 | 59725 | 270.535671188774 | 452.12230486561543
6 | 42176 | 58890 | 215.43378099396782 | 722.6579760543895
7 | 42004 | 58695 | 620.3511502405348 | 938.0917570483573
8 | 42005 | 58696 | 199.48206530565716 | 1558.442907288892
9 | 42017 | 58710 | 162.9099908343982 | 1757.9249725945492
10 | 33448 | 48969 | 102.43865451629547 | 1920.8349634289475
11 | 14266 | -1 | 0 | 2023.273617945243
(11 rows)

QGISで書いてみたら、こうなった

あれ、LRTの架橋を通っていないぞ。これ前にも見たことがあるな。これかな

postGISのpgr_dijkstra()を試しているけど、理解できない現象が発生している件

 

revese_costを入れたら、ちゃんとLRT架橋を通過しました

よし、これで、道路と鉄道の強制マージに目処が付きました。

ちなみに、OpenStreetMapに実装されていなかった部分を、JSONで道路工事をした結果、ちゃんと開通していることを確認しました。

2022/05,江端さんの技術メモ

OpenStreetMapから、鉄道情報(芳賀・宇都宮LRT)を引き出して、ダイクストラ計算やってみました。

この投稿の最後に書いた『経路が繋がっていないと、ダイクストラ計算はできないはずなので』を、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では表示されません。

 

https://help.openstreetmap.org/questions/71446/how-to-get-changes-how-to-commit-only-changed-elements

に、

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 EXTENSION

hiro_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. 調べていたら、駅の構成についての説明文を見つけました。後程、参考にさせて貰おうと思います。

 

2022/05,江端さんの技術メモ

JOSMのノードの追加は、「上級者モード」にならないと、メニューが出てきません。

とすると、メニューが見えるようになります。

この理由は、比較的、推測しやすいです。

もし間違って、このようなデタラメな地図が、OpenStreetMapの方に反映されるようなことになれば(アップロードされれば)、世界中の地図がメチャクチャになる、からです。

今、私がやっていることは、自分のシミュレータ用に都合よく地図を改竄(かいざん)していることですから、

ですから、間違っても、この改竄した地図をアップロードしないことに注意しなければなりません。

故に、「上級者モード」ということ ―― なんだろうなぁ、と思っています。

2022/05,江端さんの技術メモ

こんな感じになって、困っていました。

「セキュリティ保護なし」をクリックすると、次の画面が出てきます。

">"をクリックすると、

「証明のパス」を選ぶと、こんな感じになっています。

で、問題は、この「Cisco Umbrella Root CA」が、「信頼されたルート証明機関」に入っていないことらしいです。

ところが、これはインストールして使われるものでもないらしいとか、ネットでは色々書かれていましたが、私は、この「Cisco Umbrella Root CA」を力付くで、インストールしました。

"Cisco_Umbrella_Root_CA.cer"を探し出して、そのファイルを適当なディレクトリにダウンロード。ファイルを右クリックして、「証明証のインストール」を選んで、以下を実行。

 

これで、現在のところ、問題は出てこなくなっているようです。
(セキュリティ的にどうかとも思うのですが、作業できないと困るので)

以上

2022/05,江端さんの技術メモ

「被災後に『購入しなっかったこと』を絶対に後悔するNo.1商品」

で注文した「手回し発電機」が届きました。(早く配達されたようです)

で、先程、動作検証を終えましたので、動画をYouTubeにアップしておきました。

ちなみに、今回は、テロップ作りに、Vrewというソフトウェアを試してみました。

さくっとテロップを入れることができました。

AviUtlより100倍はラクだったと思います。

2022/05,江端さんの技術メモ

(まとめ)地図DBの作り方

「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>

 

「OpenStreetMapのデータから鉄道だけを抽出してGeoJSONで出力する方法」を試してみた件

osm.pbfファイルを、osmファイルに変換する方法

で作った、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の架橋ができていました。

ただノード接続ができているか不明なので、これから調べてみます(経路が繋がっていないと、ダイクストラ計算はできないはずなので)。駅を手動で作るしかないかな・・・

2022/05,江端さんの技術メモ

pgRoutingのデータベース構成ファイル
/usr/share/osm2pgrouting/mapconfig_for_cars.xml(自動車)
で作った、DBのレコードの意味が混乱してきたので、ちょっと整理

utsu_db=# select * from ways limit 1;
gid | osm_id | tag_id | length | length_m | name | source | target | source_osm | target_osm | cost | reverse_cost | cost_s | reverse_cost_s | rule | one_way | oneway | x1 | y1 | x2 | y2 | maxspeed_forward | maxspeed_backward | priority | the_geom
30797 | 547468496 | 112 | 0.002103460902954004 | 194.17417410447345| | 23363 | 7527 | 5289963314 | 1937141869 | 0.002103460902954004 | 0.002103460902954004 | 13.980540535522088 | 13.980540535522088 | | 0 | UNKNOWN|139.9512784 | 36.5577371 | 139.9532349 | 36.5573415 | 50 | 50 | 2.5 | 0102000020E610000004000000852C66DF707E61400822E6ED6347424033EE17FD727E61403F41182E61474240AD2C76A0737E6140B41D537765474240FD1C7AE6807E61400F9A5DF756474240

sourceとtargetの違いが分からかなったけど、wayの両端の番号、ということで良さそう。

で、今度はnodeの方だけど

utsu_db=# select * from ways_vertices_pgr limit 1;
id | osm_id | eout | lon | lat | cnt | chk | ein | the_geom
----+-----------+------+--------------+-------------+-----+-----+-----+----------------------------------------------------
4 | 264184195 | | 139.95960820 | 36.60870170 | | | | 0101000020E6100000267F411CB57E61408242F3EFE94D4240

が、nodeの情報が書かれているものらしい。

で、ここが重要。

ways_vertices_pgr の"id"  は、waysの"source" または"targetに対応しています。