是的,我想知道如何检查某个坐标是否在另一个坐标半径内。不过,这可能是一个 lil 差异,因为纬度,长,半径存储在数据库中,我们只要检查的是给定的坐标。
例
数据库表
name | lat | long | radius(m) |
loc1 | 15.3333 | 120.312 | 100 |
loc2 | 120.321 | -15.5436 | 123 |
我有一个坐标16 lat, 120 long
如何检查此坐标是否落在 loc1 的 100m 半径内,假设该表中有大量数据,具有不同的坐标和/或不同的半径。我想特别使用PostgreSQL来了解这一点,但对于MYSQL来说可能是一个好的开始。
非常感谢。
借助 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);
对于您的问题,要找到"16 lat, 120 long"点 100 范围内的所有db_table
行:
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做任何事情,因为它没有能力将坐标从纬度/经度转换为以米为单位的距离。