我想看看是否有人知道如何使用数据库对一些纬度/经度结果进行聚类,以减少通过线路发送到应用程序的结果数量。

有许多关于如何集群的资源,无论是在客户端还是在服务器(应用程序)端。但不在数据库端:(

这是一个类似的问题, ,一位 S.O. 同事问成员。该解决方案是基于服务器端的(即。后面是 C# 代码)。

有没有人有任何运气或经验来解决这个问题,但是在数据库中?是否有任何数据库专家正在寻求轴和性感的数据库挑战?

请帮忙 :)

编辑1:澄清 - 通过聚类,我希望分组 x 对于一个区域,将多个点合并为一个点。因此,如果我说将所有内容聚集在 1 英里/1 公里的正方形中,那么该“正方形”中的所有结果都会被分组为一个结果(比如说......正方形的中间)。

编辑2:我正在使用 MS Sql 2008,但我愿意听取其他数据库中是否有其他解决方案。

有帮助吗?

解决方案

我可能会使用 ķ的修改版本* -means集群使用笛卡尔(如WGS-84 ECF)坐标您的观点。这很容易实现,能够迅速收敛,并且能够适应您的数据,无论它是什么样子。另外,你可以挑选的ķ的,以满足您的带宽要求,每个集群将有相同数量的相关的积分(MOD K)。

我会做聚类中心的一个表,一个字段添加到原始数据表指出哪些群集它属于太。你明明想如果你的数据在所有动态定期更新集群。我不知道,如果你能做到这与存储过程和触发器,但也许。

*的“修饰”是调整所计算的质心向量的长度,因此他们会在地球的表面上。否则你最终与负高度(当转换回LLH)一串点。

其他提示

如果你集群地理位置,我无法想象它是别的:-),你可以在“集群ID”在数据库中纬度/长坐标一起存储。

我的意思是世界地图分割成(例如)一个100×100矩阵(10,000簇)和各坐标被分配到这些集群中的一个。

然后,可以通过选择那些在相邻的方块选择那些在相同的正方形和适度亲密的检测非常接近坐标。

你的方块的大小(因此它们的数量)将被如何准确需要的聚类决定。很显然,如果你只有一个2x2矩阵,你可以得到坐标是相隔很长的路的一些集群。

哟将始终具有边缘情况下,如两个点并拢但在不同的簇(在其集群一个北端,在其另一最南端),但你可以调整群集大小后处理在客户端的结果。

我做了,我想确保我可以很容易地高速缓存点集的地理应用程序类似的事情。我geohashing代码看起来是这样的:

def compute_chunk(latitude, longitude)
  (floor_lon(longitude) * 0x1000) | floor_lat(latitude)
end

def floor_lon(longitude)
  ((longitude + 180) * 10).to_i
end

def floor_lat(latitude)
  ((latitude + 90) * 10).to_i
end

每样东西从那里很容易。我有一些代码用于抓取所有块中从一个给定的点到给定半径会转化成单个内存缓存Multiget的(并且一些代码来回填,当它缺少)。

为了 电影地标网站 我使用了来自的聚类代码 迈克·珀维斯, ,作者之一 使用 PHP 和 AJAX 启动 Google 地图应用程序. 。它使用 PHP 和 MySQL 构建不同缩放级别的簇/点树,并将其存储在数据库中,以便快速调用。即使您使用不同的数据库,其中一些可能对您有用。

为什么不测试多种方法?

  1. 翻译 韦卡 .NET CLI 中的库 IKVM网络
  2. 将代码和 weka.dll (使用 ilmerge)生成的程序集添加到数据库中

也就是说,进行一些测试。没有哪个特定的聚类比其他任何聚类效果更好。

scroll top