gpt4 book ai didi

php - MYSQL/PHP/Postgis : Check if a coordinate is within the radius of another coordinate( little twist )

转载 作者:行者123 更新时间:2023-11-29 14:25:29 27 4
gpt4 key购买 nike

是的,我想知道如何检查某个坐标是否在另一个坐标半径内。但这可能是一个很小的差异,因为纬度、经度、半径存储在数据库中,而我们要检查的只是给定的坐标。

示例

数据库表

name    |   lat         |    long        |   radius(m) |
loc1 | 15.3333 | 120.312 | 100 |
loc2 | 120.321 | -15.5436 | 123 |

我的坐标为纬度 16,长 120如何检查该坐标是否落在 loc1 的 100m 半径内,假设该表中有一堆数据,具有不同的坐标和/或不同的半径。我想专门使用 PostgreSQL 来了解这一点,但对于 MYSQL 来说可能是一个好的开始

非常感谢。

最佳答案

通过 PostGIS,您可以使用 ST_DWithin function在地理类型上,使用平面公制缓冲区(或“半径”)距离和地理长/纬度数据。不需要做任何小改动,因为这种类型的查询对于 PostGIS 来说很常见。

例如,创建表(使用 PostGIS 2.0typmod 语法,对于 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 执行此操作,因为它无法将坐标从纬度/经度转换为以米为单位的距离。

关于php - MYSQL/PHP/Postgis : Check if a coordinate is within the radius of another coordinate( little twist ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11064402/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com