我有以下查询来访问给定纬度附近的最近位置。
我跟随奥利先生的博客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中存在空间数据类型,并使用具有显式列
lat
和long
的表,并使用该博客最初编写的示例代码。拥抱MySQL空间数据类型(疣和所有),然后看一下类似答案https://stackoverflow.com/a/21231960/31326的东西,这些东西似乎可以直接对空间数据类型做您想要的事情,但是正如该答案所指出的,有一些警告。
使用空间类型保存数据,并使用
pre-query
提取lat
和long
,然后再将其传递到原始示例代码中。关于mysql - 需要专家的帮助来解决空间数据查询中的细微变化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24263012/