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)
})
}
「自作の「金融商品自動売買ツール」をGo言語で作ってみる」のサンプルコード(その1)
select * from ways where source =0
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(オプション) : エッジの反対方向のためのコスト。
さあ、道から乗って、LRTに乗って、橋を渡って、道に下りられるか?(道路と鉄道の強制マージの件)
JSONで、芳賀・宇都宮LRTの路線と一般道を、停車駅の単位で接続して、LRTを道路扱いする方法にしてみました。
で、昨日の実験結果の方法
を使って、utsunomiya-lrt-latest-1-no_modify.osmを手動で作成しました。
そんで、もって、
を使って、道路と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の架橋を通っていないぞ。これ前にも見たことがあるな。これかな
revese_costを入れたら、ちゃんとLRT架橋を通過しました
よし、これで、道路と鉄道の強制マージに目処が付きました。
ちなみに、OpenStreetMapに実装されていなかった部分を、JSONで道路工事をした結果、ちゃんと開通していることを確認しました。
街の中に道路を作って、ダイクストラ計算ができるか試してみた件 ―― 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. 調べていたら、駅の構成についての説明文を見つけました。後程、参考にさせて貰おうと思います。
JOSMのノードの追加は、「上級者モード」にならないと、メニューが出てきません。
JOSMのノードの追加は、「上級者モード」にならないと、メニューが出てきません。
とすると、メニューが見えるようになります。
この理由は、比較的、推測しやすいです。
もし間違って、このようなデタラメな地図が、OpenStreetMapの方に反映されるようなことになれば(アップロードされれば)、世界中の地図がメチャクチャになる、からです。
今、私がやっていることは、自分のシミュレータ用に都合よく地図を改竄(かいざん)していることですから、
ですから、間違っても、この改竄した地図をアップロードしないことに注意しなければなりません。
故に、「上級者モード」ということ ―― なんだろうなぁ、と思っています。
Edgeに移行したら「接続がプライベートではありません」が出てきて、ブラウザが表示できなくなった件
こんな感じになって、困っていました。
「セキュリティ保護なし」をクリックすると、次の画面が出てきます。
">"をクリックすると、
「証明のパス」を選ぶと、こんな感じになっています。
で、問題は、この「Cisco Umbrella Root CA」が、「信頼されたルート証明機関」に入っていないことらしいです。
ところが、これはインストールして使われるものでもないらしいとか、ネットでは色々書かれていましたが、私は、この「Cisco Umbrella Root CA」を力付くで、インストールしました。
"Cisco_Umbrella_Root_CA.cer"を探し出して、そのファイルを適当なディレクトリにダウンロード。ファイルを右クリックして、「証明証のインストール」を選んで、以下を実行。
これで、現在のところ、問題は出てこなくなっているようです。
(セキュリティ的にどうかとも思うのですが、作業できないと困るので)
以上
Windows10でファイルの更新日時を変更する方法
参考 https://qiita.com/kmr_hryk/items/882b4851e23cec607e70
Windows PowerShellから
Set-ItemProperty dummy.txt -Name LastWriteTime -Value "2020/05/13"
手回し発電機の動作検証した動画を、YouTubeにアップした件
で注文した「手回し発電機」が届きました。(早く配達されたようです)
で、先程、動作検証を終えましたので、動画をYouTubeにアップしておきました。
ちなみに、今回は、テロップ作りに、Vrewというソフトウェアを試してみました。
さくっとテロップを入れることができました。
AviUtlより100倍はラクだったと思います。
OpenStreetMapから、鉄道情報(芳賀・宇都宮LRT)を引き出して、ダイクストラ計算やってみました。
「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の架橋ができていました。
ただノード接続ができているか不明なので、これから調べてみます(経路が繋がっていないと、ダイクストラ計算はできないはずなので)。駅を手動で作るしかないかな・・・
pgRoutingのデータベース構成ファイル /usr/share/osm2pgrouting/mapconfig_for_cars.xml(自動車) で作った、DBのレコードの意味が混乱してきたので、ちょっと整理
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に対応しています。