8

私は現在、屋内マップ ナビゲーション アプリケーションを実行しています。私がやろうとしているのは、建物内のマップ ポイントのデータベースを構築することです。

私が使用するすべての座標は Google マップから取得されます (つまり、EPSG は 3857 です)。私が今しなければならないことは、メートル単位で距離を見つけ、メートル単位で D_Within を使用することです

2点間の距離を抽出しようとすると:

SELECT ST_DISTANCE(
ST_GeomFromText('POINT(' || StartLon || ' ' || StartLat || ')',3857),
ST_GeomFromText('POINT(' || EndLon || ' ' || EndLat || ')',3857))
FROM i3_building.floordata;

最初の 2 行の場合:

Start: 103.776047 1.292149; End: 103.77607 1.292212 (3 meters away)
Start: 103.776070 1.292212; End: 103.77554 1.292406 (50 meters away)

与えられた結果は次のとおりです。

2.59422435413724e-005
4.11096095831604e-005

それらは rad 単位ですが、2 番目の結果は最初の結果の 2 倍しかありません。だから私は混乱します。次に、メートルとして出力しようとします。

SELECT ST_DISTANCE(
    ST_GeographyFromText('POINT(' || StartLon || ' ' || StartLat || ')'),
    ST_GeographyFromText('POINT(' || EndLon || ' ' || EndLat || ')'))
FROM i3_building.floordata;

同じ行の結果は次のとおりです。

2.872546829
4.572207435

これは私が期待したものでもありません。私は PostGis と SRID にあまり詳しくないので、この質問は簡単に思えるかもしれませんが、助けてください。

4

2 に答える 2

19

座標参照系 (CRS) は 4326、lat/lon です。これは、Google マップとの混同の一般的な原因です。3857 は、Google マップでタイルに使用される CRS であり、球状の地球に基づいて投影されたメートルです。Google マップに追加されるベクター ソース (KML データ、GPS ダンプなど) は、緯度/経度 4326 である傾向があります。これは度単位であり、その場で変換されます。

2 つの緯度/経度ポイント間のメートル単位の距離が必要な場合は、ST_Distance_Sphereを使用します。たとえば、最初のポイント セットの場合、

SELECT ST_Distance_Sphere(ST_MakePoint(103.776047, 1.292149),ST_MakePoint(103.77607, 1.292212));

これは 7.457 メートルになります。2 番目のポイント セットは、同じクエリに基づいて、互いに 62.74 メートル離れています。

ST_Distance_Spheroidもあることに注意してください。これは、3 番目のパラメータである測定回転楕円体、つまり地球の形状の近似値を取ります。これはより正確になる可能性がありますが、短い距離ではおそらく重要ではありません。

ST_Distance は、投影された座標で距離を示します。これが、緯度/経度の値を差し込むと奇妙な結果が得られた理由と考えられます。

編集:コメントに記載されているように、Postgis 2.2 以降、この関数の名前はST_DistanceSphereに変更されました

于 2014-07-08T06:04:24.933 に答える