需要专家帮助解决空间数据查询的细微变化

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 中存在空间数据类型,并使用具有 latlong 显式列的表,并使用最初在该博客上编写的示例代码。

    拥抱 MySQL 空间数据类型(疣和所有)并查看类似这个答案 https://***.com/a/21231960/31326 的内容,它似乎可以直接使用空间数据类型执行您想要的操作,但如该答案中所述,有一些注意事项。

    使用空间类型保存数据,并使用pre-query 提取latlong,然后将其传递到原始示例代码中。

【讨论】:

谢谢,但是对于存储地理数据,如纬度和经度几何类型在 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 技术专家软件包

vuejs的数据驱动

[Effective JavaScript 笔记]第50条:迭代方法优于循环

甲骨文数据库专家视频分享云端读写分离篇

学好数据结构和算法 —— 复杂度分析

云计算(云会计)驱动的商业模式变化:数据驱动业务,数据创造价值公益讲座