Database 函数ST_Distance_Sphere在MariaDB中不存在

Database 函数ST_Distance_Sphere在MariaDB中不存在,database,mariadb,latitude-longitude,Database,Mariadb,Latitude Longitude,我想获取我所在位置周围的所有位置,但函数ST\u Distance\u Sphere不起作用 我的问题是: select *, astext(location) as location from `locations` where ST_Distance_Sphere(location, POINT(35.905069591297, 49.765869174153)) < 1000 选择*,astext(位置)作为“位置”中的位置` 其中ST_距离_球面(位置,点(35.90506991

我想获取我所在位置周围的所有位置,但函数
ST\u Distance\u Sphere
不起作用

我的问题是:

select *, astext(location) as location from `locations`
where ST_Distance_Sphere(location, POINT(35.905069591297, 49.765869174153)) < 1000
选择*,astext(位置)作为“位置”中的位置`
其中ST_距离_球面(位置,点(35.90506991297,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)
SQLSTATE[42000]:语法错误或访问冲突:
1305函数app.ST_Distance_Sphere不存在(SQL:
从“位置”中选择*,astext(位置)作为位置`
其中ST_距离_球面(位置,点(35.90506991297,49.765869174153))<1000)

我的答案的直接副本


几乎难以置信

找到


不仅如此,它还缺少MySQL所拥有的
ST_GeoHash

我认为这就是
ST_DISTANCE

对于那些仍然需要在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


该博客在MySQL/MariaDB中讨论了多种在全球范围内“寻找最近的”方法。作为讨论的一部分,我开发了这个存储函数。

我的数据库是mariadbt,有很多trig调用的公式适用于MySQL或MariaDB。MySQL最近(5.7.6)才实现了这个ST函数;MariaDB似乎还没有找到它。我看到了这个链接,但ST_Distance_Sphere函数并不相似!公式需要纬度和经度。但这就是你的
的组成部分,对吗?我建议的是一种有点混乱的解决方法,而不是简单的替换方法。我对MariaDB很生气:|我将数据库更改为PostgreSQL!:|这是针对平面几何体的,而不是球体一。我必须删除“开始”。另外,我猜空间索引不适用于此函数。正确吗?@moritz.vieli。正确,单线例行程序不需要开始。只要在基表上使用索引,这些函数就可以在视图、存储过程或触发器中使用。或者你是什么意思?让我们假设,我有一个SELECT语句,在这里我按st_distance_sphere排序。MariaDB是否使用我在列上添加的空间索引作为函数的参数?