2017-03-17 7 views
0

特に私は理解できない結果を得ています。私の理解は間違っている可能性がありますが、そうは思わないです。だから私は、誰かが「はい、それは既知の問題です」または「いいえ、それは正しく働いています、そして、あなたの理解が間違っている理由」と言うことを望んでいます。postGISのst_line_substringの潜在的な問題を知っている人はいますか?

これは私の例です。

私は次の緯度/経度のジオメトリを持っています。

LINESTRING(-1.32007599 51.06707497、-1.31192207 51.09430508、-1.30926132 51.10206677、-1.30376816 51.11133597、-1.29261017 51.12981493、-1.27510071 51.15906713、-1.27057314 51.16440941、-1.26606703 51.16897072、-1.26235485 51.17439257、-1.26089573 51.17875111、-1.26044512 51.1833917、-1.25793457 51.19727033、-1.25669003 51.20141159、-1.25347137 51.20630532、-1.24845028 51.21110444、-1.23325825 51.22457158、-1.2274003 51.22821321、-1.22038364 51.23103494、-1.20326042 51.23596583、-1.1776185 51.24346193、-1.16356373 51.24968088、-1.13167763 51.26363353、-1.12247229 51.2659966、 -1.11629248 51.26682901、-1.10906124 51.26728549、-1.09052181 51.26823871、-1.08522177 51.26885628、-1.07013702 51.27070895、-1.03683472 51.27350122、-1.00917578 51.27572955、-0.98243952 51.2779175、-0.9509182 51.28095094、-0.9267354 51.28305811、-0.90499878 51.28511151、 - 0.86051702 51.2883055、-0.83661318 51.29023789、-0.7534647 51.29708113、-0.74908733 51.29795323、-0.7400322 51.2988924、-0.71535587 51.30125366、-0.68475723 51.29863749、-0.65746307 51.30220618、-0.63246489 51.30380261、-0.60542822 51.30645873、-0.58150291 51.3103219、-0.57603121 51.31150225、-0.57062387 51.31317883 、-0.54195642 51.32475227は、-0.4855442 51.34771616は、-0.4553318 51.36283147)

これは私のテーブルに "GEOM" という列であるが、 "fibre_lines" と呼ばれます。私は次のような結果を得るため、次のクエリ、

select st_length(geography(geom), false) as full_length, 
    st_length(geography(st_line_substring(geom, 0, 1)), false) as full_length_2, 
    st_length(geography(st_line_substring(geom, 0, 0.5)), false) as first_half, 
    st_length(geography(st_line_substring(geom, 0.5, 1)), false) as second_half 
from fibre_lines 
where id = 10; 

を実行すると...

76399.4939375278 76399.4939375278 41008.9667229201 35390.5272197668

最初の二つは私には意味をなさない、彼らは単にあります球の地球を仮定した私の線の長さ。最初は明らかな関数を使用していますが、2番目の関数はst_line_substringを使用して行全体の長さを取得しています。これらの2つの値は一致します。

しかし、最後の2つは私に困惑しています。私はラインの前半の長さを求めています、そして、私は最後の半分の長さを求めています。私の期待は、これらが同等かほぼ同等であるということでした。代わりに、前半は後半より約6km長い。

ジオメトリをマップ上にプロットすると、線の最初の3分の1は北/南向き、残りの3分の2は東西になります。球形の地球上で長さを求めるときに違いが出るとは思っていませんでしたが、私が間違っていると言われてうれしいです(私が間違っている理由も説明されている限り)。

参考のため私は1.5.8を使用しています。これがバグであれば、新しいバージョンにアップグレードすることは可能ですが、簡単なことではありません。そのため、必要な場合にのみ行うことをお勧めします。

誰でもアイデアがありますか?

+0

ドST_AsText(ST_Line_SubString(GEOM、0、0.5)) とST_AsText(ST_Line_SubString(GEOM、0.5、1)) マッチング端を有し、開始点? – Arunas

+0

この質問は、おそらくst_lengthを使用したくないことを示唆しているようです:http://gis.stackexchange.com/questions/63762/why-is-sum-of-st-length-of-segments-20-too -大きい – Arunas

答えて

0

Arunasのコメントは私の質問に直接答えられませんでしたが、それは私が問題を特定すると思ういくつかの研究に私を導いてくれました。私はそれを私の頭の中でまっすぐに、そして部分的には他の人が不思議に思うように、部分的に投稿しています。

「ジオメトリ」と「地理」の間のPostGISの違いが鍵と思われます。ジオメトリは、通常はUTMで構成され、平面の上にグローブを投影して使用される2D平面ジオメトリです(この投影は設定可能です)。一方、地理学は、緯度/経度情報を具体的に格納するように設計されており、球面または回転楕円面のいずれかで作業するために使用されます。だから私は持っている本質的な問題は2つあり:私のオリジナルのポストから

  1. おそらく、明白ではない、私は緯度/経度の情報ではなく、のUTMを保存するためにジオメトリオブジェクトを使用していますということです。私はそれを正しい地理学にキャストして、正しい答えを得ることができますが、地理オブジェクトとして実際に保存した方が正しいでしょう。それは私のコードでいくつものキャストの必要性を排除するだけでなく、私が何か間違っていることをPostGISが教えてくれます。
  2. ST_Lengthはジオメトリまたはジオグラフィーのどちらでも使用できますが、ST_Line_Substringはジオメトリのみで動作します。したがって、私は中点を求めるときに、フラットなジオメトリの中間点を求めています。これは私に緯度座標の正解を与えるでしょうが、経度に関しては、私が赤道から離れているほど、(ほとんどの投影について)増加する誤差項を持ちます。

私は新しいバージョンのPostGISを見てきましたが、ST_Line_Substringやそれに類するものがないので、私に地理の50%ポイントを与えるようなものはないので、私はそれを "難しいST_Lengthを使って私のすべてのセグメントの長さを与えてから、それらを足して、補間に必要な数学をやります。

関連する問題