11

次のクエリがあります。

select distance(GeomFromText('POINT(8 49)',4326),GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326))

これで 0.97 度になります。しかし、私はそれをメートル単位で必要とし、どの SRID に変換すればよいかわかりません。

Spatialiteの結果をメートル単位で取得する方法の例を教えてもらえますか?

ポジションはすべてヨーロッパにあります。

4

2 に答える 2

22

度単位の値を掛けるだけです。111195この値は(Earth mean radius)*PI/180、「地球の表面上のメートル単位の大円度の平均長さ」です。

この方法を使用して得られた結果は、WGS84 楕円体の測地線距離の 1% 以内です。


編集

OK、上記の私の答えは、「角度単位のアークをメートル単位の長さに変換する方法」という質問を表していますが、それはあなたが尋ねた質問ではありません(尋ねるべきでした)。

私は専門的に Spatialite を使用したことがないので、サンプル クエリが実際に「度単位の長さ」を返すと仮定しました。それは真実ではない。

残念ながら、Spatialite は「地理的な意味」での距離の計算に失敗しているようです。ジオメトリが SRID 4326 で定義されているにもかかわらず、それらは平面上にあるかのように扱われます。

簡単な証明を次に示します。

select Distance(GeomFromText('POINT(0 0)',4326),GeomFromText('POINT(3 4)',4326));

戻ります5.0

それは残念だ ...

元のクエリを見てみましょう。

select Distance(
  GeomFromText('POINT(8 49)',4326),
  GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326)
)

MS SQL Server での同等のクエリ:

SELECT (geography::STGeomFromText('POINT(8 49)', 4326)).STDistance(geography::STGeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)', 4326));

正しい結果がすぐに得られます105006.59673084648

では、Spatialite にはどのようなオプションがありますか?

確かに、コメントで言ったように、1 つのオプションは、ジオメトリを投影し、それらを計算することです。ヨーロッパで SRID 3035 を使用することも理にかなっています (場所がほとんどドイツにある場合は、SRID 25832 を検討します)。

select Distance(
  Transform(GeomFromText('POINT(8 49)',4326),25832),
  Transform(GeomFromText('LINESTRING(8.329969 49.919323,8.330181 49.919468)',4326),25832)
)

戻ります104969.401605453

あなたの他のサンプルについて(コメントで):

select distance(
  Transform(GeomFromText('POINT(8.328957 49.920900)',4326),3035),
  Transform(GeomFromText('POINT(8.339665 49.918000)',4326),3035)
)

もっと簡単な方法があります (POINT と LINESTRING ではなく、2 つの POINT がある場合): POINT で LINESTRING を作成し、次のGeodesicLengthように関数を使用します。

select GeodesicLength(GeomFromText('LINESTRING(8.328957 49.920900, 8.339665 49.918000)',4326))

予想どおり、が返されます833.910006698673

于 2012-08-30T21:06:29.353 に答える