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_Distance
(geography
タイプパラメータ)は、距離をメートルで返します 。この関数を使用すると、最終的にメートルをマイルに変換するだけです。
注意 :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;