【问题标题】:what's the efficient algorithm to find points in a circle based on geographic coordinates?基于地理坐标在圆中查找点的有效算法是什么?
【发布时间】:2014-06-27 20:57:40
【问题描述】:

我正在研究基于地理坐标查找最近人的实现。比如人A有坐标(经度和纬度)m,我想在以m为半径的圆内找人x

我打算将地理坐标存储在 MySQL 数据库中,搜索最近坐标的有效方法是什么?

我的具体问题是:

  1. 应该在数据库中存储哪些字段以进行高效搜索?我打算只存储人的坐标。
  2. 寻找最近人的算法是什么?我计划计算人 A 的坐标与数据库中存储的坐标之间的距离。

但是,如果数据库中的坐标数量很大,我认为计算效率会降低。

实现此应用程序的更好方法是什么?

【问题讨论】:

  • 如何仅提取具有可能可能在半径内的 X 或 Y 坐标的每个人,然后对其进行半径计算?
  • 如果您关心性能,我肯定会考虑使用面向列的数据库来解决此类问题。
  • 一个“面向列的数据库”?如果他的数据库不是“面向列”的,它可能是 NoSQL 数据库之一,在某种程度上,它仍然会关心“列”(或文档属性)。
  • 面向列与面向行:en.wikipedia.org/wiki/Column-oriented_DBMS。两者都有“列”。一个按列查看数据,另一个按行查看。

标签: algorithm search coordinates


【解决方案1】:

一个简单的 Pithagoras 定理应用:

-- The coordinates of the person at the center of the "circle"
set @x0 = (select x from persons where id=1),
    @y0 = (select y from persons where id=1);
-- Calculate the distance for each point in the persons table, excluding the "center"
select *, sqrt(pow(x - @x0, 2) + pow(y - @y0, 2)) as distance
from persons
where id != 1
order by sqrt(pow(x - @x0, 2) + pow(y - @y0, 2))

【讨论】:

  • 不需要 SqRt(速度增加)。相反,如果有人说在 4 英里之内,你平方那个值 (16),现在每一行都不需要 SqRt。
  • @ErikPhilips 你是对的......它可以从order by 子句中删除
【解决方案2】:

我意识到这里专门讨论的是 SQL Server,而不是 MySql。但是,这并不意味着您不能实施类似的解决方案。 (似乎MySql has Spatial Indexes)。

这是在使用网格的多种数据库技术中实现的。有一个很棒的视频深入介绍了网格坐标如何在名为 Creating High Performance Spatial Database 的 sql 位上工作。

这里有几张来自MSDN Spatial Indexing Overview 的网格技术图片。

将地球分解为多个级别的网格。

找出哪些网格包含部分或全部对象(正方形、圆形等)..

这种技术允许非常快速地包含和排除,而无需计算每个对象的距离(非常耗时)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2015-07-29
    • 2015-12-02
    • 2021-07-19
    相关资源
    最近更新 更多