首页 > 解决方案 > MariaDB 没有 ST_Distance_Sphere 的等效函数

问题描述

在 MySQL 5.7 中,有一个函数被调用ST_Distance_Sphere,可用于查找半径内的点,例如:

CREATE TABLE `places` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(256) DEFAULT NULL,
  `coordinates` point DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `places` ( `name`, `coordinates`)
VALUES ("Eiffel Tower", POINT(48.858271, 2.293795));

INSERT INTO `places` ( `name`, `coordinates`)
VALUES ("Pere Lachaise", POINT(48.861131, 2.394683));

INSERT INTO `places` ( `name`, `coordinates`)
VALUES ("Brooklyn", POINT(40.711089, -73.948391));

如果我们想查看距离巴黎市中心卢浮宫不到 10 公里的所有点,我们可以这样做:

SELECT name FROM places
WHERE ST_Distance_Sphere(coordinates, POINT(48.861105, 2.335337)) < 10000

但是 MariaDB 10.1+ 不支持此类功能

如何在 MariaDB 中重新创建相同的函数或重新创建相同的查询。以下帖子显示了一种重新创建相同函数FUNCTION ST_Distance_Sphere 在 MariaDB 中不存在的方法?

也许是这样的?

SELECT name FROM places
WHERE ST_Within(
   coordinates, ST_Buffer(POINT(48.861105, 2.335337), 10000)
);

任何帮助表示赞赏。

标签: mysqlgeometrymariadbgeospatial

解决方案


根据@adam78 和@Rick James 的建议,我这样解决了:

CREATE FUNCTION st_distance_sphere(pt1 POINT, pt2 POINT)
RETURNS double(10,2)

RETURN 6371000 * 2 * ASIN(
    SQRT(
        POWER(SIN((ST_Y(pt2) - ST_Y(pt1)) * pi()/180 / 2), 2) +
        COS(ST_Y(pt1) * pi()/180 ) *
        COS(ST_Y(pt2) * pi()/180) *
        POWER(SIN((ST_X(pt2) - ST_X(pt1)) * pi()/180 / 2), 2)
    )
)

推荐阅读