14

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

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

这是一个类似的问题,由 SO 成员提出。解决方案是基于服务器端的(即背后的 C# 代码)。

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

请帮忙 :)

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

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

4

7 回答 7

12

我可能会为您的点使用笛卡尔(例如 WGS-84 ECF)坐标的k均值聚类的修改*版本。它易于实施和快速收敛,并且无论它看起来如何都能适应您的数据。此外,您可以选择k以满足您的带宽要求,并且每个集群将具有相同数量的关联点 (mod k)。

我会制作一个集群质心表,并在原始数据表中添加一个字段以指示它也属于哪个集群。如果您的数据是动态的,您显然希望定期更新集群。我不知道您是否可以使用存储过程和触发器来做到这一点,但也许。

*“修改”是调整计算出的质心向量的长度,使它们位于地球表面。否则你最终会得到一堆负高度的点(当转换回 LLH 时)。

于 2008-12-01T05:23:11.477 回答
6

如果您在地理位置上进行集群,我无法想象它是其他任何东西 :-),您可以将“集群 ID”与纬度/经度坐标一起存储在数据库中。

我的意思是将世界地图划分为(例如)一个 100x100 矩阵(10,000 个集群),每个坐标都分配给这些集群之一。

然后,您可以通过选择同一方格中的坐标来检测非常接近的坐标,并通过选择相邻方格中的坐标来检测适度接近的坐标。

您的正方形的大小(以及它们的数量)将取决于您需要聚类的准确程度。显然,如果您只有一个 2x2 矩阵,您可能会得到一些相距很远的坐标聚类。

您将始终拥有边缘情况,例如两个点靠得很近但在不同的集群中(一个集群的最北端,另一个集群的最南端),但您可以调整集群大小在客户端对结果进行后处理。

于 2008-12-01T04:48:13.577 回答
5

我为一个地理应用程序做了类似的事情,我想确保我可以轻松地缓存点集。我的地理哈希代码如下所示:

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

从那里一切都变得非常容易。我有一些代码用于抓取从给定点到给定半径的所有块,这些块将转换为单个 memcache multiget(以及一些代码在丢失时回填)。

于 2008-12-01T04:52:19.060 回答
2

对于movielandmarks.com,我使用了Mike Purvis的集群代码,他是《 Beginning Google Maps Applications with PHP and AJAX》的作者之一。它使用 PHP 和 MySQL 为不同的缩放级别构建集群/点树,​​并将其存储在数据库中,以便快速调用。即使您使用不同的数据库,其中一些可能对您有用。

于 2008-12-01T05:38:49.743 回答
1

为什么不测试多种方法?

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

做一些测试,就是这样。没有特定的聚类比其他任何人都更有效。

于 2010-01-15T11:43:22.863 回答
0

我相信你可以使用MSSQL 的空间数据类型。如果它们与我知道的其他空间数据类型相似,它们会将您的点存储在矩形树中,然后您可以转到较低分辨率的矩形以获取隐式集群。

于 2008-12-01T06:47:06.237 回答
0

如果您最终想要探索 Geohash(它是在您发布此问题的同时发明的),这里是您可能感兴趣的 SQL Server TSQL 的 Geohash 相关函数的更充实的实现。

我已经广泛使用整数版本的 Geohash 来对结果进行聚类,以减少发送到客户端的有限视口的数据。

于 2021-03-06T22:39:14.047 回答