18

ST_DWithinドキュメントには、3番目のパラメーター(距離)はメートル単位であると記載されています。しかし、クエリを実行すると、3番目のパラメータが「度」になるようです。

これが私の簡略化されたテーブル構造です:

> \d+ theuser;
                         Table "public.theuser"
  Column  |          Type          | Modifiers | Storage  | Description 
----------+------------------------+-----------+----------+-------------
 id       | bigint                 | not null  | plain    | 
 point    | geometry               |           | main     | 
Indexes:
    "theuser_pkey" PRIMARY KEY, btree (id)
    "point_index" gist (point)
Referenced by:
    ...
Has OIDs: no

すべてのポイントはSRID=4326で保存されます。

そしてこれはクエリです:

> select * from theuser where ST_DWithin(point , ST_GeomFromText('POINT(120.9982 24.788)',4326) , 100 );

3番目のパラメータ(100)を「度」として受け取るため、すべてのデータが返されます。近くのポイントを見つけるには、0.001に絞り込む必要があります。

しかし、3番目のパラメーターとしてメーターを直接渡すにはどうすればよいですか(メーター/度の変換は行いたくない)?私のクエリの何が問題になっていますか?なぜpostgreSQLはドキュメントが言うようにそれをメートルとして受け取らないのですか?

環境:

> select version();
                                                  version                                                  
-----------------------------------------------------------------------------------------------------------
 PostgreSQL 8.4.9 on i486-pc-linux-gnu, compiled by GCC gcc-4.4.real (Ubuntu 4.4.3-4ubuntu5) 4.4.3, 32-bit

> SELECT postgis_lib_version();
 postgis_lib_version 
---------------------
 1.4.0

この問題を引き起こすのがSRIDである場合、どのSRIDが単位として「メートル」を直接使用しますか?(私はSRID = 2163に変換しようとしましたが、それでもある程度です)ありがとう。

4

5 に答える 5

18

ドキュメントから:

ジオメトリの場合:距離は、ジオメトリの空間参照系によって定義された単位で指定されます。

データがSRID=4326にある場合、指定する距離は度単位です。

ST_Transformとメーターベースの座標系を使用するか、 ST_Distance_Sphere(より高速で精度が低い)またはST_Distance_Spheroidの2つの関数のいずれかを使用する必要があります。

于 2011-12-09T12:08:42.413 に答える
15

geometryWGS84、つまりsrid 4326を使用している場合は、ジオメトリをキャストしてgeography単位をメートル単位にすることができます。

SELECT *
FROM theuser
WHERE ST_DWithin(
  point::geography,
  ST_GeomFromText('POINT(120.9982 24.788)',4326)::geography,
  100 -- DISTANCE IN METERS
);
于 2015-07-14T13:52:04.190 に答える
3

DWithinを使用するたびにメートルに変換することはお勧めしません。ちなみに、メートルが必要な場合は、アルベルス正積図法(多数あります)のような等面積投影法が必要です。ST_Buffer(point、degrees)を試してみませんか、そしてそれがグーグルアースで何をするかを見て、測定を行い、あなたが好きな数を見つけてください、通常あなたは事前定義された範囲を必要とします、例えば非常に近い= 0.00008、近い= 0.0005、遠い= 0.001、本当に遠い= 0.01、本当に本当に遠い= 0.1など(すべて度単位)。

あなたが最速の方法を求めた前の質問で、あなたは正しい方向にいます。

于 2011-12-09T17:18:47.450 に答える
3

ここで参照されているように、https: //postgis.net/docs/ST_DWithin.html、ST_DWithin関数には2つの異なるシグネチャがあります。

メーターを直接使用したい場合は、ブールフラグを持つ2番目の署名が機能します。

JPAの例として、以下にクエリを投稿します。

    @Query("select f from Facility as f where dwithin(f.address.coordinates, :center, 10000, true) = TRUE")
    List<Facility> findAllByDistance(@Param("center") Point point);
于 2020-05-20T14:19:14.543 に答える
-3

以下のクエリを試してください。私にとっては問題なく機能します。

select * from theuser where ST_DWithin(point , ST_GeomFromText('POINT(120.9982 24.788)',4326) , 0.1/111.325 );

ここで、0.1=100メートルです。

于 2014-01-16T09:54:26.227 に答える