【问题标题】:Calculation of accumulation area堆积面积计算
【发布时间】:2011-08-12 23:49:04
【问题描述】:

我正在寻找一种 GIS/几何算法:

我有 1000 个点随机分布在一个大区域(例如一个城市),我如何找出所有超过 15 个点的小区域?如下图所示:

每个点都有自己的经纬度坐标。小于200m x 200m的小面积。

【问题讨论】:

  • 您使用哪种数据结构来管理您的积分?
  • 所有点都存储在db表中。
  • 数据库中不是有这样的select语句吗?
  • 顺便说一句非常好的问题。喜欢清晰。

标签: c++ c delphi gis


【解决方案1】:

您应该看看 RTREE 结构。 见http://en.wikipedia.org/wiki/R-tree

你已经实现了这样的算法,例如在 SQlite3 引擎中。 见http://www.sqlite.org/rtree.html

我们的开源版本已经包含用于 Delphi 6 到 XE 的 RTREE 扩展,compiled by default since rev. 1.8

【讨论】:

  • 您可以通过混合不同的 DS(如 K-D 树和 R-Tree)来进一步优化您的搜索(如果适用),例如 2-Dim R 树。这样的 DS 将优化您的搜索时间,并根据定义的边界框为您提供输出。但是,对于在您的情况下将输出项断言为特定计数(例如 15),您必须应用递归搜索逻辑...
  • 致 A.Bouchez 和 Nains:对不起,我没有 R-Tree 的经验。能具体解释一下吗?
【解决方案2】:

不确定您的性能要求是什么。但是一个简单的实现是,对于每个点,总结到所有其他点的距离的倒数:

for i := 0 to 999 do
  for j := 0 to 999 do
    if i<>j then
      Point[i].Score := Point[i].Score + ( 1 / Distance(Point[i], Point[j]) );

每个累积区域中心附近的点得分最高。

【讨论】:

  • 这样一个算法的性能是O(n^2);应避免任何重要数量的点。对于 1000 个点,这会计算 100 万次。对于 10,000 点,这会计算 1 亿次!
  • 我完全清楚这一点。 “不确定您的性能要求是什么”和“天真的实现”。在现代 CPU 上,1000 分的 100 万次计算仍然可以在相当合理的时间内完成,提问者说他​​得到了 1000 分。这种方法的优点是实现起来很简单,并且可能以可接受的性能运行(但这只有提问者才能决定,因为他没有给我们足够的信息来确定这一点)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
  • 2018-06-16
  • 1970-01-01
  • 2021-03-19
  • 2014-03-21
相关资源
最近更新 更多