PostGIS
そのようなテーブルに緯度と経度を保存しないでください。代わりに、PostGISジオメトリまたは地理タイプ を使用してください 。
CREATE EXTENSION postgis;
CREATE TABLE foo (
geog geography;
);
CREATE INDEX ON foo USING gist(geog);
INSERT INTO foo (geog)
VALUES (ST_MakePoint(x,y));
これで、クエリを実行する必要があるときに、 KNN(<->
)を使用できます。 )
これは実際にインデックスでこれを行います。
SELECT *
FROM foo
ORDER BY foo.geog <-> ST_MakePoint(x,y)::geography;
クエリでは、明示的にHAVING distance < 5
があります 。インデックスでもそれを行うことができます。
SELECT *
FROM foo
WHERE ST_DWithin(foo.geog, ST_MakePoint(x,y)::geography, distance_in_meters)
ORDER BY foo.geog <-> ST_MakePoint(x,y)::geography;
これにより、すべてのポイントがdistance_in_meters
の外側にある場合、何も返されないことが保証されます。 。
さらに、xとyは10進数ですST_MakePoint(46.06, 14.505)