【问题标题】:Select all points that are within a 100 metre radius of a POINT()选择 POINT() 半径 100 米内的所有点
【发布时间】:2014-01-16 08:49:34
【问题描述】:

我在数据库中有一个表,其中包含超过一百万个地理空间点,我们将其称为 'flags'。我还有一个实时'vehicles'的提要,它们报告了它们的纬度和经度位置。

每次通过车辆的位置时,我都需要运行执行此操作的代码:

选择该车辆位置 100 米半径范围内的所有标志

这可以通过 SQL 实现吗?如果是这样,我该怎么做?

【问题讨论】:

  • 不是我的反对意见,但你应该展示你已经尝试过的事情
  • @AnthonyBlake 我很乐意,但如果我不知道从哪里开始,我无法展示我已经尝试过做的事情 D:(因此我问这个问题)跨度>
  • 你在用 MySQL 的spatial extensions吗?
  • @eggyal 非常感谢!这看起来非常有用。只需要更新 MySQL,我会检查一下。

标签: mysql sql geospatial


【解决方案1】:

使用公式应该是可行的

(x-center_x)^2 + (y - center_y)^2 < radius^2

你有所有的组成部分要做

SELECT foo
  FROM point p
 WHERE (((p.x - vehicle.x) * (p.x - vehicle.x)) + ((p.y - vehicle.y) * (p.y - vehicle.y))) < 1000

或者类似的东西,我已经采取了一些语法平底船

【讨论】:

  • 这没有利用 MySQL 的空间扩展,也不是测地线(毕达哥拉斯定理只适用于欧几里得几何)。
  • 100 米的距离足够小,您可以使用近似值(相对于Haversine 公式)。但是响应者的方法是毕达哥拉斯定理,该定理在赤道很好,但随着您向两极移动(由于经度线的曲率),误差会增大。我建议在等边投影上使用毕达哥拉斯定理,该等边投影近似于沿经线的曲率。见movable-type.co.uk/scripts/latlong.html
【解决方案2】:

检查这些资源:

  1. Selecting points within a bounding circle -- 给出最优解的详细信息:选择矩形区域,然后过滤掉不落入该正方形内圆的点;
  2. Select coordinates which fall within a radius of a central point? -- stackoverflow 上的类似问题。

【讨论】:

    猜你喜欢
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多