ラインの直線部分の距離

939 views
Skip to first unread message

伊藤敏

unread,
Mar 22, 2021, 4:22:25 AM3/22/21
to QGIS初心者質問グループ
お世話になります。
ラインデータの直線部分の距離を計算したいのですが、なにかプラグインはあるでしょうか?

sakuya_izayoi

unread,
Mar 22, 2021, 4:58:59 AM3/22/21
to QGIS初心者質問グループ
izayoiです。
フィールド計算機の
$length
関数で求められるのとは違うという意味合いでしょうか?

2021年3月22日月曜日 17:22:25 UTC+9 伊藤敏:
お世話になります。
ラインデータの直線部分の距離を計算したいのですが、なにかプラグインはあるでしょうか?

伊藤敏

unread,
Mar 22, 2021, 7:22:32 PM3/22/21
to QGIS初心者質問グループ
求めたいのは、ライン上の直線部分のみです。鉄道路線における直線部分のみで、国土数値情報の鉄道データ「 N05-19_RailroadSection2.shp 」
から直線部分の距離を出したい。

2021年3月22日月曜日 17:58:59 UTC+9 sakuya_izayoi:

sakuya_izayoi

unread,
Mar 23, 2021, 1:39:05 AM3/23/21
to QGIS初心者質問グループ
国土数値情報の鉄道データ「 N05-19_RailroadSection2.shp 」を確認してみました。

ここでおっしゃられる、直線とは何を指してらっしゃいますか?
ダウンロードできたファイルのは、「直線」で構成されたポリライン(連続線)となってます。
添付ファイルでは、例えばですが、
P1.東海道線のラインを一本選択してみた。
P2.直線区間に見える場所を拡大し、そのラインはどのように作られているのかを確認しました。右側の図のようにX-Xで区切られた直線がいっぱいつなげられているポリライン(連続線)となってます。
そうなりますと、どこからどこまでを「直線」とみなすのかという問題も出てきます。

そこで、
①このように連続線となっているのですが、どこまでを直線とみるのか。
②場合によってはトレースを行っても構わないのか、あるいは、①と被りますが自動である閾値以下なら一本線としてほしいのか。
③路線ごとに結果データが欲しいのか、路線区別無しで結果データが欲しいのか。

これらの内容が追加されると、もっと皆様が答えやすくとなると思います。
ご一考ください。

追伸
自分は路線データを使ったことが無かったので、初めて知ったのですが、路線データは非商用に限り使ってよいのですね。
いままで、行政区域など、商用利用可能のデータしか使ってこなかったから、うっかり業務で使わないように気を付けないと。

2021年3月23日火曜日 8:22:32 UTC+9 伊藤敏:
参考.pdf

伊藤敏

unread,
Mar 23, 2021, 3:53:46 AM3/23/21
to QGIS初心者質問グループ
詳しい解析ありがとうございます。
結論から言いますと上記の「自動である閾値以下なら一本線としてほしい」になるでしょうか。
X-Xの連続線で「直線と見なせる部分」の距離を出したい。
添付ファイルが今までに指摘された旧国鉄からの最長直線該当区間です。
X-Xと次のX-Xの相違角度が在る閾値以下は直線とする、みたいな計算ですかね。

2021年3月23日火曜日 14:39:05 UTC+9 sakuya_izayoi:
旧国鉄最長直線区間.png

mooya

unread,
Mar 30, 2021, 10:08:50 AM3/30/21
to QGIS初心者質問グループ
伊藤さま

 ポリラインの角度を判定するのは、下記スレッドが参考になると思います

2021年3月23日火曜日 16:53:46 UTC+9 伊藤敏:

Satoshi Itoh

unread,
Mar 31, 2021, 8:27:16 PM3/31/21
to QGIS初心者質問グループ
ありがとうございます。
参考になりそうですが、ハードルが高いので、じっくり取り組みたいと思います。
出来るかどうか少し弱腰です。

2021年3月30日火曜日 23:08:50 UTC+9 mooya:

ありた

unread,
Apr 5, 2021, 9:53:16 AM4/5/21
to QGIS初心者質問グループ
こんにちは

ラインの距離については、前の返信にあったように $length などで計算します。
それとは別に、「直線とみなす」ことについて、意図するとおりの結果が得られるか
わかりませんが、プロセシングツールの「ジオメトリの簡素化」があります。
アルゴリズムとして Douglas-Peuker 法や Visvalingam 法が利用できます。
パラメータの値を調整しながら実行してみてください。

Satoshi Itoh

unread,
Apr 13, 2021, 9:57:59 PM4/13/21
to QGIS初心者質問グループ
お世話になります。
ベクター>ジオメトリーツール>頂点の抽出、であるラインの頂点を作成すると、「distance」と「angle」その他の項が作成されます。
この「angle」は何の角度でしょうか?
頂点から頂点への角度ならある数値以下は直線みたいな定義ができると思うのですが。
ご存知のかたご教示いただけたらありがたいです。

2021年4月5日月曜日 22:53:16 UTC+9 ありた:

ありた

unread,
Apr 14, 2021, 8:27:50 AM4/14/21
to QGIS初心者質問グループ
こんにちは

「頂点の抽出」を実行する際のダイアログの右欄にあるように、頂点の二等分線の
角度となります。

たとえば図のように点 P1, P2, P3, P4, P5 で構成された折れ線(黒太線)があるとします。
P1 から P2 への線分を伸ばした半直線上に点 P2' があるとします。(同様に P3', P4' )
角 P2' - P2 - P3 の二等分線 P2 - BP2 を考えたとき、北向きの線 P2 - NP2 を基準として
時計回りの角度 NP2 - P2 - BP2 が、点 P2 における二等分線の角度として計算されます。

なお(閉じていない折れ線の場合)始点および終点は二等分線が定義できません。
そこで始点 P1 については角 NP1 - P1 - P2 が、終点は角 NP4 - P4 - P5 の値が使用されます。

レイアウト 1.png


Satoshi Itoh

unread,
Apr 15, 2021, 1:24:31 AM4/15/21
to QGIS初心者質問グループ
ありたさんお世話になります。
angleは傾向を見る時に同じ条件ですので、二等分線の角度そのままで計算できました。
ところがdistanceですが、 ダイアログの右欄 に「元のジオメトリに沿った距離」と書かれていますように、
計算するラインから作成した頂点のdistance欄はある開始点からの累積となっています。
(数値は一行ごとに大きくなります)
このdistanceの単位はなにでしょう?
マイルかと思いましたが実際の地図上の距離からするとマイルではなさそうです。
(34km強の長さが「1.5695404594」となります)


2021年4月14日水曜日 21:27:50 UTC+9 ありた:

ありた

unread,
Apr 15, 2021, 8:44:27 AM4/15/21
to QGIS初心者質問グループ
こんにちは

distance は、元となるジオメトリの座標値の単位です。
メートル単位で CRS で作られている場合、単位はメートルです。
度単位の CRS で作られている場合、単位は度です。


さて。あらためて、当初の目的について。
たとえば、下記の操作を行ってみましたが、割とよさそうな結果になりましたが
いかがでしょうか。

(1) 下記ページより令和元年データ N02-19_GML.zip をダウンロード

(2) QGIS に N02-19_RailroadSection.shp を読み込む

(3) N02-19_RailroadSection.shp は EPSG:6668 - JGD2011 (経緯度) で作成された
データであるため、プロセシングツールの「レイヤの再投影」で
「 EPSG:3857 - WGS84 / Pseudo-Mercator 」に変換する(※1)

(4) データは基本的に各駅間ごとにセグメント化されているので、
プロセシングツールの「融合 (dissolve)」で、基準となる属性に「 N02_003 」を
指定して融合する

(5) プロセシングツールの「ジオメトリの簡素化」で、簡素化処理を行う。
パラメータについては試行錯誤の余地があります。
たとえば Douglas-Peuker 法を使い、許容範囲は 30m にしてみました。(※1)

(6) 簡素化処理を行ったレイヤに対し、プロセシングツールの
「線をセグメントに分解」を使用し、各セグメントを個別のラインに分解する。

(7) セグメントに分解したレイヤに対し、フィールド計算機を開く。
length フィールドを追加し、式には $length とする。



この手順で、最長区間は「沼ノ端~社台手前」の約 25km でした。
「社台~白老手前」は別の直線とみなされました。
(このあたりはパラメータ次第で変化します。)


そもそも複線、複々線や駅での待避線などがあるなかで直線区間とは
なにを対象とした直線なのかかという問題と、使用した国土数値情報の
データの原典は「数値地図25000」を基本としており、精度も高々
地図情報レベル25000相当となので、誤差を含むということを
考慮する必要があります。

※1
メルカトル図法ですので、緯度 φ の地点では本来の距離の 1/cosφ だけ
引き延ばされます。本来の距離と差異が存在することはもちろんのこと
低緯度地域と高緯度地域で、それぞれ差異の度合いが異なります。
今回は距離感は直接的に分析に関わるものでないため、この特徴を
理解したうえで、 Pseudo Mercator を使用しています。

ジオメトリの簡素化で指定する値も、実際の距離ではなく、レイヤ上の
紙面上における引き伸ばされた数値です。



なお、試そうとされている角度による判別アルゴリズムは、以下のことを
気を付けて上手に判別しないと難しいと思います。
 ・微小角度の折れでも距離が長ければ、直線とみなすには誤差が大きい
 ・微小角度の折れが細かく積み重なれば、カーブも表現できる
 ・比較的大きな角度でも、細かなジグザグ状であれば直線とみなせる
  (鉄道ではあまりないかもしれませんが)

あるとしたら、 GIS データにおける折れ線ごとの角度差ではなく、
一定距離の前後区間の線形をもとに、カーブの 曲率半径を求め、
それが一定以上であればカーブではなく直線とみなす。とかでしょうか?

Satoshi Itoh

unread,
Apr 15, 2021, 7:22:34 PM4/15/21
to QGIS初心者質問グループ
ありたさん 丁寧な解説ありがとうございます。
ご指摘の
 A 微小角度の折れでも距離が長ければ、直線とみなすには誤差が大きい
 B 微小角度の折れが細かく積み重なれば、カーブも表現できる
 C 比較的大きな角度でも、細かなジグザグ状であれば直線とみなせる
はどのように解決するか以下のように考えました。
Aについて、ありたさんも触れられた沼ノ端~社台手前+微小角度+社台~白老手前が、一般的にいわれる「国鉄」最長直線区間
ですので、この「微小角度」までは直線と見なす。
Bは目視で明らかにカーブとわかれば除外
Cは前後の直線から判断
総合的には開始点から到達点までの直線との乖離幅で判断

しかし、ご教示いただいた方法がよりベストと考えますので、早速取り組みます。
(使用データはN02-19_RailroadSection.shpではなくN05-19_RailroadSection2.shpを考えています
N02-19は存続路線データ、N05-19は廃線を含むデータです。少しデータ構成が異なるようですが)

2021年4月15日木曜日 21:44:27 UTC+9 ありた:

Satoshi Itoh

unread,
Apr 18, 2021, 11:16:34 PM4/18/21
to QGIS初心者質問グループ
ありたさん いつもお世話になっております。
前のメール返信の作業を進めました。N05-19で同様に作業を進めたところ、上位ランクはN02-19とほぼ変わらない結果となりました。
さて知識不足で作業内容がよく理解できていないのですが、この作業で直線と判断する項目は「ジオメトリの簡素化」でしょうか?
またangleをもとに直線か否かの判断をしているのでしょうか?


2021年4月16日金曜日 8:22:34 UTC+9 Satoshi Itoh:

ありた

unread,
Apr 19, 2021, 7:56:01 PM4/19/21
to QGIS初心者質問グループ
こんにちは

「ジオメトリの簡素化」は、ジオメトリ形状に大きな影響のないノードを削除し、
正確さや滑らかさを失う代わりに、単純な形状を求めるものです。

その過程で、直線っぽい区間を直線とみなす処理をある程度してくれます。



私も、アルゴリズムに関してちゃんと追い切れてませんが、 Douglas-Peuker 法は
始点と終点を結ぶ線に対し、もっとも離れた点が許容距離内にあるかを確認します。
許容距離内であれば、直線とみなし、対象点間のノードを削除します。
もし許容距離よりも離れている場合、その点で分割し、二つの直線に対し、再度
最遠点を求め、判定を繰り返していく方法です。

対して Visvalingam 法は、始点から順に、連続した3点で形成される三角形の
面積を確認します。もっとも小さな面積の三角形が許容範囲内であれば、
その三角形(中間点)を削除します。
削除した三角形に隣接した点に対し、再度三角形の面積を計算します。
そうして、削除できる点がなくなるまで繰り返す方法です。


「グリッドにスナップ」は、ある一定間隔の格子点にスナップした際に、
連続して同じ座標にスナップされるほど近接している場合、その点は
削除されるみたいです。
(スナップはノード削除の判定のみで、結果はもとの座標のまま)

Satoshi Itoh

unread,
Apr 19, 2021, 10:44:37 PM4/19/21
to QGIS初心者質問グループ
ありがとうございます。
ジオメトリの簡素化、許容範囲を35mにしたところ、沼ノ端から社台を越え白老の手前まで28.72km直線となりました。
許容範囲30mで計算した場合は最長区間は「沼ノ端~社台手前」の 25kmでしたから、この間3km内に始点と終点を結ぶ直線から30m-35m離れたポイントがあるということでしょうね。
ちなみに2位は中央線、東中野から立川越えまで25.23kmとなりました。


2021年4月20日火曜日 8:56:01 UTC+9 ありた:

ありた

unread,
Apr 20, 2021, 8:13:06 AM4/20/21
to QGIS初心者質問グループ
こんにちは

以前の返信にも書きましたが、正確には EPSG:3857 上での 35m になります。
メルカトル図法によって、実距離よりも引き伸ばされているため、実際には
もう少し短い距離で判定されています。

また、この実際の距離は緯度によって異なります。
全国を統一的に同じ基準の処理で比較を行いたい場合にはもう少し工夫が必要です。
(地域によって分割し、それぞれで適切な座標系に変換するなど)

Satoshi Itoh

unread,
Apr 21, 2021, 8:52:43 PM4/21/21
to QGIS初心者質問グループ
なんどもすみません。
知識不足でそもそもの疑問ですが、「$length」は
a長さを計測しろ、ということでしょうか?
それとも
b保持している「長さ」を表示しろ、
ということでしょうか?
aですかね・・

2021年4月20日火曜日 21:13:06 UTC+9 ありた:

ありた

unread,
Apr 22, 2021, 9:51:26 AM4/22/21
to QGIS初心者質問グループ
GIS データは基本的に距離のデータは保持していません。
(距離を属性情報として保持していることもありますが、その属性情報が
距離を示していることを GIS は認識することができません)

$length は「保持されている位置情報(座標値)をもとに地球上(準拠楕円体上)に
おける距離を計算しろ」という意味です。
データの座標系が経緯度座標系(単位:度)であっても、座標値から地球上の
どの地点に位置するか考慮し、実際の距離を計算します。
たとえば経緯度座標系において、「東経135度北緯35度の点と東経140度北緯35度との
点間の距離」は「456393.177m」です。

ちなみに length($geometry) は「保持されている位置情報(座標値)から、その座標系に
おける地図上の距離を計算しろ」という意味です。
たとえば経緯度座標系において、「東経135度北緯35度の点と東経140度北緯35度との
点間の距離」は「5度」です。


$lengthlength, $geometry などのように QGIS の式で使用可能な関数は、
「フィールド計算式」の右欄で動作や構文、例などのヘルプを確認することができます。
Reply all
Reply to author
Forward
0 new messages