MariaDB中不存在函数ST_Distance_Sphere。

17

我想获取我所在位置周围的所有位置,但函数ST_Distance_Sphere无法正常工作。

我的查询:

select *, astext(location) as location from `locations`
where ST_Distance_Sphere(location, POINT(35.905069591297, 49.765869174153)) < 1000

错误:

SQLSTATE[42000]: Syntax error or access violation:
1305 FUNCTION app.ST_Distance_Sphere does not exist (SQL:
select *, astext(location) as location from `locations`
where ST_Distance_Sphere(location, POINT(35.905069591297, 49.765869174153)) < 1000)

我的数据库是MariaDb。 - webafra
这个有很多三角函数调用的公式可以在MySQL或MariaDB中运行。MySQL最近才实现了那个ST函数(5.7.6); MariaDB似乎还没有采用它。 - Rick James
我看到了这个链接,但是ST_Distance_Sphere函数并不相似! MariaDb文档 - webafra
公式需要纬度和经度。但这就是您的“POINT”所组成的,对吗?我建议一个有点混乱的解决方法,而不是简单的替换。 - Rick James
我对MariaDB感到生气 :| 我把数据库改成了PostgreSQL! :| - webafra
4个回答

15

对于那些仍然需要MariaDB中这个函数的功能,您可以基于公式创建该函数。

    CREATE FUNCTION `st_distance_sphere`(`pt1` POINT, `pt2` POINT) RETURNS 
    decimal(10,2)
    BEGIN
    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) ));
    END

我不得不删除“BEGIN”。另外,我猜空间索引在这个函数中不起作用。对吗? - moritz.vieli
@moritz.vieli ,确实,对于单行例程,不需要使用BEGIN。只要在基本表上使用索引,就可以在视图、存储过程或触发器中使用函数。你的意思是什么? - Carlos Poma
假设我有一个SELECT语句,其中我按st_distance_sphere排序。MariaDB是否使用我添加到列上的空间索引作为函数参数使用? - moritz.vieli
显然,使用这个自己实现的函数,会使得Mariadb中的空间索引完全无用。 - user3700562

9

更新 - 在MariaDB 10.2版本之后,ST_DISTANCE_SPHERE终于可用了!感谢您发布问题链接,现在该问题已经“关闭”。 - flexponsive
@flexponsive 已更新,谢谢。 - Evan Carroll
1
我在Debian 10服务器上使用10.3.22-MariaDB,仍然出现“st_distance_sphere不存在”的问题。 - cnmuc

1

-3

7
这适用于平面几何,而不是球面几何。 - Hex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接