【问题标题】:SQL: search of nearest in 2d square and circleSQL:在二维正方形和圆形中搜索最近的
【发布时间】:2010-09-25 08:42:06
【问题描述】:

我有一张桌子:积分

它有 2 个字段:X,Y

每一行代表二维字段上的一个点

我希望能够搜索半径为 R 的点,例如

和A边一样是正方形

顺便说一句:我使用 PHP 来访问我的数据库。

我的主要观点是最接近图形点的中心,因为第一个结果是像 quqe

如何在 SQL 中做这样的事情?

【问题讨论】:

  • 我有点困惑。在前 2 张图片中,红点似乎是正方形和圆形的中心,但在第 3 张图片中不是。这是为什么呢?
  • +1 表示图表,尽管内容与文本不符 :) 参见最后一张图表 - 红点不是最靠近中心的(!)

标签: php sql search 2d


【解决方案1】:

数学上的圆点满足方程

(c.X-p.X)^2 + (c.Y-p.Y)^2 <= R^2

其中c是圆的中心,p - 点,R - 半径

正方形

max(abs(c.X-p.X),abs(c.Y-p.Y)) <= A/2

其中 c 是正方形的中心,p - 点,A - 正方形的边

您可以用任何语言编写这些方程式。

等式的左侧称为距离,用于各种度量。为了找到最近的点,您应该按 distance asceniding 排序结果集并获取第一个结果。

类似这样的:

select top 1 p.X, p.X from Points p
otrder by ((@x - p.X)*(@x - p.X)+(@y - p.Y)*(@y - p.Y))

【讨论】:

  • 嗯,第一个表达式还可以,第二个就不行了(应该是max(...) &lt;= A/2)。此外,方程是“断言两个表达式相等的数学语句”。
【解决方案2】:

如果您的查询不是应用程序的核心,Gandjustas 的答案是一个不错的解决方案。如果此几何/空间数据对您非常重要,并且您在处理此类数据时需要速度,那么您应该查看 RDBMS 的地理空间扩展。

我假设您使用 mysql,您可以使用 spatial extensions。 适当的数据类型和索引将为您提供

Distance(g1, g2)

和其他有用的功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    相关资源
    最近更新 更多