【问题标题】:FUNCTION ST_Distance_Sphere does not exist in MariaDBMariaDB 中不存在 FUNCTION ST_Distance_Sphere
【发布时间】:2017-06-07 09:42:51
【问题描述】:

我想获取我所在位置周围的所有位置,但函数 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
  • 具有大量三角函数调用的公式适用于 MySQL 或 MariaDB。 MySQL 直到最近(5.7.6)才实现了那个 ST 功能; MariaDB 似乎还没有把它捡起来。
  • 我看到了这个链接,但 ST_Distance_Sphere 功能不相似! MariaDb Docs
  • 公式需要纬度和经度。但这就是您的POINT 的组成部分,对吗?我建议的是一个有点混乱的解决方法,而不是简单的替换。
  • 我对 MariaDB 很生气:|我将数据库更改为 PostgreSQL! :|

标签: database mariadb latitude-longitude


【解决方案1】:

对于在 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 .True,单行例程不需要 BEGIN。只要在基表上使用索引,就可以在视图、存储过程或触发器中使用这些函数。或者你是什么意思?
  • 假设,我有一个 SELECT 语句,按 st_distance_sphere 排序。 MariaDB 是否使用我在列上添加的空间索引,该索引用作函数的参数?
  • 好吧,显然没有这个自实现的功能,导致mariadb中的空间索引完全没用。
【解决方案2】:

10.2+

此问题已通过MDEV-13467 修复并向后移植。可用 10.2.38、10.3.29、10.4.19、10.5.10

找到their support matrix here

【讨论】:

  • 更新 - ST_DISTANCE_SPHERE 终于在 MariaDB 10.2 之后可用了!感谢您发布该问题的链接,该问题现已“关闭”
  • @flexponsive 已更新,谢谢
  • 我在 Debian 10 服务器上使用 10.3.22-MariaDB 仍然得到“st_distance_sphere 不存在”
【解决方案3】:

http://mysql.rjweb.org/doc.php/find_nearest_in_mysql#gcdistdeg

该博客讨论了在 MySQL/MariaDB 中“查找最近”的多种方法。作为讨论的一部分,我开发了存储函数。

【讨论】:

    【解决方案4】:

    我想就是这样ST_DISTANCEhttps://mariadb.com/kb/en/library/st_distance/

    【讨论】:

    • 那是平面几何,不是球体。
    猜你喜欢
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 2020-10-11
    相关资源
    最近更新 更多