使用 PostGIS,您可以在地理类型上使用该ST_DWithin
功能,使用平面公制缓冲区(或“半径”)距离和地理长/纬度数据。不需要小插曲,因为这种类型的查询在 PostGIS 中很常见。
例如,创建表(使用 PostGIS 2.0 typmod 语法,对于 PostGIS 1.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
在“16 lat,120 long”处查找点 100 内的所有行的问题:
SELECT *
FROM db_table
WHERE ST_DWithin(geog, ST_MakePoint(120, 16), radius_m + 100);
另一个例子,如果你有someother_table
一个地理列,你可以对两者进行地理空间查询:
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 做任何这些,因为它无法将坐标从 Lat/Long 转换为以米为单位的距离。