sql >> データベース >  >> RDS >> PostgreSQL

座標から半径5マイル以内のすべての行をクエリするにはどうすればよいですか?

    「座標から半径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のこの密接に関連する回答のこれとその他の詳細:

    • 距離で注文


    1. SQL Serverで参照エンティティを検索します:sys.dm_sql_referencing_entities()

    2. サーバーに接続できません-ネットワーク関連またはインスタンス固有のエラー

    3. SQLテーブルの初心者向けガイド

    4. SQLite COUNT