MYSQL / PHP / Postgis:检查坐标是否在另一个坐标的半径范围内(小扭曲)

时间:2012-06-16 14:46:53

标签: php mysql sql postgresql postgis

是的,我想知道如何检查某个坐标是否在另一个坐标半径范围内。这可能是一个小差异,因为lat,long,radius存储在数据库中,我们要检查的只是给定的坐标。

实施例

db table

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的良好开端

非常感谢你。

1 个答案:

答案 0 :(得分:1)

使用PostGIS,您可以在地理类型上使用ST_DWithin function,使用平面度量缓冲(或“半径”)距离与地理长/纬度数据。不需要很小的扭曲,因为这种类型的查询对于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做任何这个,因为它无法将坐标从Lat / Long转换为以米为单位的距离。

相关问题