【问题标题】:Clustering Lat/Longs in a Database在数据库中聚类纬度/经度
【发布时间】:2010-09-24 17:01:33
【问题描述】:

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

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

This is a similar question,由一位 S.O. 同事询问。成员。解决方案是基于服务器端的(即背后的 C# 代码)。

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

请帮忙:)

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

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

【问题讨论】:

  • 您到底在寻找什么——一组能很好地代表数据集的经纬度点的减少、给定“测试”点附近的一组点,或者完全是其他的东西?跨度>
  • 在开篇文章中添加了说明。
  • 我遇到了同样的问题。你找到解决办法了吗?
  • @shizik 尝试用谷歌搜索 openlayers(它是一个映射 JS 库)并查看它是否可以集群。

标签: database latitude-longitude cluster-analysis geography


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 在 MS SQL Server 2008 中,它们具有空间索引。也许这些索引之一可以用作 clusterID,然后将结果分组到这个 clusterID 索引中?
【解决方案2】:

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

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(以及一些代码在丢失时回填)。

【讨论】:

  • 嗨达斯汀 - 我不明白。这是某种类型的 DB sql 代码吗?或者一些php什么的?我看不出它与数据库有什么关系?
  • 我的应用程序是用 ruby​​ 编写的,这是库代码。我使用它来计算给定纬度和经度的哈希值,并将其与点一起存储在列中。每次点编辑都会重新计算哈希并使给定哈希的所有点的缓存无效。
【解决方案3】:

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

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

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

【讨论】:

  • kewlies! ...呃..我不知道该怎么做..但我有点明白你在说什么。嗯..数据不是太动态。但我仍然需要考虑我需要如何(以及多久)计算这些东西。唔。太难了!
【解决方案4】:

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

【讨论】:

  • 张贴这个以防有人像我一样从谷歌到这里..你可以找到thread mentioned above using archive.org - 它包含指向源文件的链接。似乎繁重的工作是通过 php 完成的 - 也许不是最好的方法,但值得一读。
【解决方案5】:

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

【讨论】:

  • 我目前正在使用带有空间索引的 GEOGRAPHY 类型。但我不确定如何使用它来获得分组/聚类结果。你有一些sql代码示例吗?
  • 我错误地假设 GEOGRAPHY 明确地给了你一棵树。我相信您可以使用 Drew Hall 的建议,使用 GEOGRAPHY.STDistance 作为 k-means 所需的距离函数。
【解决方案6】:

为什么不测试多种方法?

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

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

【讨论】:

  • 哇,伙计。我不明白你的意思:(
  • 聚类算法有很多。每个算法都有自己的参数。提供最佳答案是完全不可能的。测试 weka 库中的一些聚类算法(k-means、fuzzy-c mean 等)。要不翻译整个代码,您可以在数据库服务器中嵌入一个包含 weka 的程序集(sql 2008 接受 .NET 程序集)。因此,您可以测试多个变体。
【解决方案7】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-03
    • 2016-08-17
    • 1970-01-01
    • 2015-02-11
    • 2012-12-01
    • 2011-08-04
    • 1970-01-01
    • 2019-08-04
    相关资源
    最近更新 更多