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

指定された座標から5マイルの範囲にあるすべての建物を取得する

    x、yを保存する理由 別々の列に?それらをgeometryとして保存することを強くお勧めします またはgeography クエリ時間の不要なキャストオーバーヘッドを回避するため。

    そうは言っても、ST_DWithinを使用して、マイル単位で距離を計算および確認できます。 またはST_Distance

    (テストデータ)

    CREATE TABLE building (name text, long numeric, lat numeric);
    INSERT INTO building VALUES ('Kirk Michael',-4.5896,54.2835);
    INSERT INTO building VALUES ('Baldrine',-4.4077,54.2011);
    INSERT INTO building VALUES ('Isle of Man Airport',-4.6283,54.0804);
    

    ST_DWithin

    ST_DWithin 指定されたジオメトリが別のジオメトリから指定された距離内にある場合、trueを返します。次のクエリは、POINT(-4.6314 54.0887)から半径5マイル以内にあるジオメトリを検索します。 :

    SELECT name,long,lat,
      ST_Distance('POINT(-4.6314 54.0887)'::geography,
                  ST_MakePoint(long,lat)) * 0.000621371 AS distance
    FROM building
    WHERE
      ST_DWithin('POINT(-4.6314 54.0887)'::geography,
                  ST_MakePoint(long,lat),8046.72); -- 8046.72 metres = 5 miles;
    
            name         |  long   |   lat   |     distance      
    ---------------------+---------+---------+-------------------
     Isle of Man Airport | -4.6283 | 54.0804 | 0.587728347062174
    (1 row)
    

    ST_Distance

    関数ST_Distancegeography タイプパラメータ)は、距離をメートルで返します 。この関数を使用すると、最終的にメートルをマイルに変換するだけです。

    注意ST_Distanceを使用したクエリの距離 リアルタイムで計算されるため、空間インデックスを使用しないでください 。したがって、この関数をWHEREで使用することはお勧めしません。 句! SELECTではなく使用してください 句。それにもかかわらず、以下の例はそれがどのように行われるかを示しています:

    SELECT name,long,lat,
      ST_Distance('POINT(-4.6314 54.0887)'::geography,
                  ST_MakePoint(long,lat)) * 0.000621371 AS distance
    FROM building
    WHERE 
      ST_Distance('POINT(-4.6314 54.0887)'::geography,
                  ST_MakePoint(long,lat)) * 0.000621371 <= 5;
    
            name         |  long   |   lat   |     distance      
    ---------------------+---------+---------+-------------------
     Isle of Man Airport | -4.6283 | 54.0804 | 0.587728347062174
    (1 row)
    
    • ST_MakePointを使用してパラメータの順序を調整します :経度、緯度です。ない 逆です。

    デモ:db<>fiddle

    Amazon Athena相当(度単位の距離):

    SELECT *, ST_DISTANCE(ST_GEOMETRY_FROM_TEXT('POINT(-84.386330 33.753746)'),
          ST_POINT(long,lat)) AS distance
    FROM building
    WHERE 
      ST_Distance(ST_GEOMETRY_FROM_TEXT('POINT(-84.386330 33.753746)'),
      ST_POINT(long,lat)) <= 5;
    


    1. Oracleパーティションインデックス

    2. MariaDB 10.0/10.1でのInnoDBパーティションのインポート

    3. SQL Serverで動的SQLをクレンジング(SQLインジェクションを防止)する方法は?

    4. AzureContainerServiceでのDockerSwarmクラスターの作成