需要专家帮助解决空间数据查询的细微变化
Posted
技术标签:
【中文标题】需要专家帮助解决空间数据查询的细微变化【英文标题】:Need expert's help to solve minor change in spatial data query 【发布时间】:2014-06-17 11:49:07 【问题描述】:我有以下查询来访问给定纬度周围最近的位置。 我关注了 Mr.Ollie 的 博客 Nearest-location finder for mysql,使用 hasrsine 公式查找给定 lat-long 周围最近的位置。
但由于缺乏空间数据查询方面的知识,我未能正确执行,因此寻求专家的建议来解决这个问题。
这是我的查询
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)))
这是我的桌子desc
+-----------+----------------+
| Field | Type |
+-----------+----------------+
| id | Int(10) |
| property | geometry |
+-----------+----------------+
select x(property) from mytable; //gives me lat
select y(property) from mytable; //gives me lan
我哪里出错了? 这是实现这一目标的方法吗?
请提出建议。
【问题讨论】:
【参考方案1】:在我看来,您假设一旦在查询中选择了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
中存储数据的非最佳方式
但是,在重新阅读该链接时,答案的 cmets 表明您现在可以使用空间数据类型。 (我告诉过你我在这里没有任何线索)这意味着将查询代码替换为 ST_Distance(g1,g2)
之类的东西,这实际上意味着完全重写示例。
换一种说法
您给出的示例假定空间数据类型和测试 MySQL 中不存在几何。但现在它们确实存在,它们 使这组示例代码无关紧要,并且您正在 如果您尝试将这两种分析形式结合起来,就会受到伤害。
更新 2
您可以遵循三种路径:
否认 MySQL 中存在空间数据类型,并使用具有 lat
和 long
显式列的表,并使用最初在该博客上编写的示例代码。
拥抱 MySQL 空间数据类型(疣和所有)并查看类似这个答案 https://***.com/a/21231960/31326 的内容,它似乎可以直接使用空间数据类型执行您想要的操作,但如该答案中所述,有一些注意事项。
使用空间类型保存数据,并使用pre-query
提取lat
和long
,然后将其传递到原始示例代码中。
【讨论】:
谢谢,但是对于存储地理数据,如纬度和经度几何类型在 MySQL 中更受欢迎。? @h.APP.y 我了解使用空间数据类型的愿望,但请参阅我的更新 我已经解决了这些问题,但没有得到适当的结果。那么我现在应该怎么做才能解决这个问题(建议)。【参考方案2】:最后我关注this link 并以此结束。 查询尚未优化,但运行良好。
这是我的查询
select id, ( 3959 * acos( cos( radians(12.91841) ) * cos( radians( y(property) ) ) * cos( radians( x(property)) - radians(77.58631) ) + sin( radians(12.91841) ) * sin( radians(y(property) ) ) ) ) AS distance from mytable having distance < 10 order by distance limit 10;
【讨论】:
以上是关于需要专家帮助解决空间数据查询的细微变化的主要内容,如果未能解决你的问题,请参考以下文章
与您分享:R-STUDIO Technician 技术专家软件包