我有以下查询来访问给定纬度附近的最近位置。
我跟随奥利先生的博客Nearest-location finder for MySQL,使用Haversine公式在给定的经纬度附近找到了最近的位置。

但是由于缺乏有关空间数据查询的知识,我无法正确执行它,因此寻求专家的意见来解决此问题。

这是我的查询

  SELECT z.id,
       p.distance_unit
                * DEGREES(ACOS(COS(RADIANS(p.latpoint))
                * COS(RADIANS(z.(x(property))))
                * COS(RADIANS(p.longpoint) - RADIANS(z.(y(property))))
                + SIN(RADIANS(p.latpoint))
                * SIN(RADIANS(z.(x(property)))))) AS distance_in_km
 FROM mytable AS z
 JOIN (   /* these are the query parameters */
       SELECT  12.00  AS latpoint,  77.00 AS longpoint,
               20.0 AS radius,      111.045 AS distance_unit
   ) AS p
 WHERE z.(x(property))
    BETWEEN p.latpoint  - (p.radius / p.distance_unit)
        AND p.latpoint  + (p.radius / p.distance_unit)
   AND z.(y(property)
    BETWEEN p.longpoint - (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
        AND p.longpoint + (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
 ORDER BY distance_in_km
 LIMIT 15;


当我运行此查询时,出现错误

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(x(property))))                 * COS(RADIANS(p.longpoint) - RADIANS(z.(y(geo' at line 1


我也尝试过z.(GeomFromText(x.property)))

这是我的桌子描述

+-----------+----------------+
| Field     |    Type        |
+-----------+----------------+
|  id       |        Int(10) |
| property  |       geometry |
+-----------+----------------+

select x(property) from mytable; //gives me lat
select y(property) from mytable; //gives me lan


我要去哪里错了?
这是实现这一目标的方法吗?

请提出建议。

最佳答案

在我看来,您假设在查询中选择了z.id后,就可以直接访问x(property)y(property)

(除了-这些名称中是否真的有括号?)

所以对我来说,您应该替换类似

* COS(RADIANS(z.(x(property))))


用类似的东西

* COS(RADIANS( select x(property) from mytable where id = z.id ))


但是,在进一步考虑之后,我认为您的mytable没有所需的结构。通过查看链接,我相信您的mytable应该具有类似于以下的结构:

+-----------+----------------+
| Field     |    Type        |
+-----------+----------------+
|  id       |        Int(10) |
| latitude  |        Float   |
| longitude |        Float   |
+-----------+----------------+


这样你就可以做

* COS(RADIANS(z.latitude))


注意

以上是基于我不了解MySQL支持空间数据类型(我不知道如何使用)的原因

更新资料

我只是做了一些谷歌搜索来了解空间类型,并发现了这一点:

How do you use MySQL spatial queries to find all records in X radius? [closed]

这表明您无法使用mysql中的空间数据类型来完成您想做的事情。因此,这使您回到使用非最佳方式在mutable中存储数据的方式

但是,在重新阅读该链接时,对答案的注释表明您现在可以使用空间数据类型。 (我告诉过您这里没有任何线索),这意味着用ST_Distance(g1,g2)之类的东西替换查询代码,这实际上意味着完全重写该示例。

换一种方式


  您给出的示例假设空间数据类型和测试
  几何在MySQL中不存在。但是既然它们确实存在,它们
  使这组示例代码无关紧要,并且您将
  如果您尝试将两种形式的分析结合起来,就会感到非常痛苦。


更新2

您可以遵循以下三种路径:


否认MySQL中存在空间数据类型,并使用具有显式列latlong的表,并使用该博客最初编写的示例代码。
拥抱MySQL空间数据类型(疣和所有),然后看一下类似答案https://stackoverflow.com/a/21231960/31326的东西,这些东西似乎可以直接对空间数据类型做您想要的事情,但是正如该答案所指出的,有一些警告。
使用空间类型保存数据,并使用pre-query提取latlong,然后再将其传递到原始示例代码中。

关于mysql - 需要专家的帮助来解决空间数据查询中的细微变化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24263012/

10-16 14:17