使用 mariaDb,mySQL 获取以 km 为单位的半径内的所有空间类型点

Posted

技术标签:

【中文标题】使用 mariaDb,mySQL 获取以 km 为单位的半径内的所有空间类型点【英文标题】:get all spatial type points within radius in km with mariaDb, mySQL 【发布时间】:2015-03-17 06:40:51 【问题描述】:

问题来了,

已经对此进行了多次研究,但没有找到任何明确且解释清楚的解决方案。有些人在谈论诸如 st_distancest_within 之类的函数,它们指的是 mysql/mariadb 版本,但这些函数似乎没有真正的文档,似乎不适合我的问题。

所以我想做的是:

获取所有空间点(lat,ln),它们在KILOMETRES 中定义半径的圆内。

用户将给出一个半径,范围在 1 到 100 公里之间,并将接收该半径内的所有数据库记录。

points”表如下所示:

ID -- POINT -- SOMETEXT

Point是mySql(>5.6) / mariaDb(5.5.40) (lat,lng)中使用的空间类型点

所以,查询应该是这样的:

"SELECT * FROM points WHERE (function... to get distance) <= definedDistance"

感谢您的帮助

【问题讨论】:

【参考方案1】:

我不同意你在这里写的:

有些人在谈论像 st_distance 或 st_within 这样的函数 它指的是 mysql/mariadb 版本,但这些功能似乎有 没有真正的文档,似乎不适合我的问题。

st_distance 是 documented 似乎非常适合您的问题。

查看我的示例,我正在寻找半径为 1 且中心位于 (2, 2) 的圆内的点:

CREATE TABLE geom (g GEOMETRY);

INSERT INTO geom VALUES (GeomFromText('POINT(1 1)'));
INSERT INTO geom VALUES (GeomFromText('POINT(1 2)'));
INSERT INTO geom VALUES (GeomFromText('POINT(1 3)'));
INSERT INTO geom VALUES (GeomFromText('POINT(1 4)'));
INSERT INTO geom VALUES (GeomFromText('POINT(2 2)'));
INSERT INTO geom VALUES (GeomFromText('POINT(3 3)'));
INSERT INTO geom VALUES (GeomFromText('POINT(4 4)'));

SELECT AsText(g) from geom where ST_Distance(point(2,2), g) <= 1

输出:

POINT(1 2)
POINT(2 2)

【讨论】:

我认为这个答案不正确。 MagiaDB ST_Distance 函数看起来像是在笛卡尔平面上计算距离(即简单的 X、Y 计算,而不是纬度、经度)。在这种情况下,该函数不能用于 GIS 点之间的距离。请参阅以下内容; set @p1 = point (90,0); set @p2 = point (90,50); select ST_Distance(@p1, @p2); 距离应该为 0,因为两个点都在北极。函数给出的答案是 50。PS 对不起,多个 cmets,我不知道如何添加代码块。

以上是关于使用 mariaDb,mySQL 获取以 km 为单位的半径内的所有空间类型点的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册以获取正确的语法 - phpMyAdmin

如何在 MySQL/MariaDB 中将 LONGTEXT 字段作为 JSON 返回

如何在 MariaDB/MySQL 工作台中获取 SELECT 语句的输出,以“table.column”格式命名列,而不仅仅是“column”?

在MYSQL中获取10km距离的记录

如何解决 Mariadb 与 mysql 的冲突以安装 mySQL-python 依赖项

如何以通过 ed25519 识别的用户身份使用 MYSQL Workbench 连接到 MariaDB (10.5.8)?