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 を使用しています。
ジオメトリの簡素化で指定する値も、実際の距離ではなく、レイヤ上の
紙面上における引き伸ばされた数値です。
なお、試そうとされている角度による判別アルゴリズムは、以下のことを
気を付けて上手に判別しないと難しいと思います。
・微小角度の折れでも距離が長ければ、直線とみなすには誤差が大きい
・微小角度の折れが細かく積み重なれば、カーブも表現できる
・比較的大きな角度でも、細かなジグザグ状であれば直線とみなせる