「座標から半径5マイル以内のすべての行」が必要です。 、したがって、これはではありません まさにK最近傍(KNN)問題。関連しますが、あなたのケースはもっと単純です。 「私の座標に最も近い10行を見つけてください」 KNN問題になります。
座標をgeography
に変換します 値:
ST_SetSRID(ST_MakePoint(longitude, latitude),4326)::geography
または、より単純なgeometry
を使用することもできます。 タイプ。考えてみましょう:
4.2.2。ジオメトリデータタイプよりも地理データタイプを使用する場合
次に、次のようなテーブルがあります:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, geog geography NOT NULL
);
必要なのはST_DWithin()
だけです -および空間インデックス 高速化するには:
CREATE INDEX tbl_geog_gist ON tbl USING gist(geog);
クエリ:
SELECT *, ST_Distance(c.x, geog) AS distance -- distance is optional
FROM tbl t, (SELECT ST_GeographyFromText('SRID=4326;POINT(-72.63 42.06)')) AS c(x)
WHERE ST_DWithin(c.x, geog, 8045) -- distance in meter
ORDER BY distance; -- order is optional, you did not ask for that
または 元の列を使用して機能インデックスを作成できます...dba.SEのこの密接に関連する回答のこれとその他の詳細:
- 距離で注文