PostGISを使用すると、地理的な長さ/緯度のデータで平面メトリックバッファー(または「半径」)距離を使用して、地理タイプでST_DWithin
関数を使用できます。このタイプのクエリはPostGISで一般的であるため、少しひねりを加える必要はありません。
たとえば、テーブルを作成します(PostGIS 2.0 typmod構文を使用します。PostGIS1.5の場合、地理列を作成するには他の関数を使用する必要があります)。
CREATE TABLE db_table
(
gid serial primary key,
name character varying(100),
geog geography(Point,4326),
radius_m numeric
);
CREATE INDEX db_table_idx ON db_table USING gist (geog);
INSERT INTO db_table(name, geog, radius_m)
VALUES
('loc1', ST_MakePoint( 20.312, 15.333), 100),
('loc2', ST_MakePoint(-15.543, 20.312), 123);
db_table
「16lat、120 long」のポイントから100以内のすべての行を見つけるための質問の場合:
SELECT *
FROM db_table
WHERE ST_DWithin(geog, ST_MakePoint(120, 16), radius_m + 100);
別の例として、someother_table
地理列がある場合は、次の2つに対して地理空間クエリを実行できます。
SELECT a.name, b.other_attr, ST_Distance(a.geog, b.geog) AS distance_m
FROM db_table a
JOIN someother_table b ON ST_DWithin(a.geog, b.geog, a.raidus_m + 100)
ORDER BY ST_Distance(a.geog, b.geog);
最後に、MySQLには座標を緯度/経度からメートル単位の距離に変換する機能がないため、MySQLではこれを実行できないと確信しています。