2017-06-09 11 views
2

ある点が別の点から与えられた半径よりも離れていないかどうかを計算する必要があります。私は機能を使用したST_DWithin、Googleマップで私は2つのポイントの "ここにある"セクションを使用してlanLotを取得します。最初:(43.2137617, 76.8598076)および第2 (43.220109 76.865100)。それらの間の距離は1.25kmです。私のクエリPostgresql postgis ST_DWithinは常にtrueを返します

SELECT ST_DWithin (
    ST_GeomFromText('POINT(76.8598076 43.2137617)',3857), 
    ST_GeomFromText('POINT(76.865100 43.220109)',3857), 
    100 
); 

そして常にtrueを返します。私は半径100メートルを置き、SRID 3875を使用してメートルを使用していたと思います。なにが問題ですか?

答えて

1

使用している座標はCRS 3857には含まれていませんが、むしろCRS 4326のように投影されていないので、互いに100度以内の点を探しています。 4326にポイントを作成し、ST_Transformを使用して3857に投影し、距離計算をメートル単位で行う必要があります。

SELECT ST_DWithin (
    ST_Transform(ST_GeomFromText('POINT(76.8598076 43.2137617)',4326),3857), 
    ST_Transform(ST_GeomFromText('POINT(76.865100 43.220109)',4326),3857), 
    100 
); 

CRS 3857は、赤道から離れていくほど遠くの距離を保持しない投影です。代わりにST_Distance_Sphereを使用するとよいでしょう。 2つの方法を比較すると、最初のものはポイントと1125との間に825mを与えます。

SELECT ST_Distance_Sphere (
    ST_GeomFromText('POINT(76.8598076 43.2137617)',4326), 
    ST_GeomFromText('POINT(76.865100 43.220109)',4326)) 
    <= 100; 
関連する問題