Database 在数据库中对Lat/LONG进行聚类

Database 在数据库中对Lat/LONG进行聚类,database,latitude-longitude,cluster-analysis,geography,Database,Latitude Longitude,Cluster Analysis,Geography,我试图看看是否有人知道如何使用数据库对一些Lat/Long结果进行集群,以减少通过网络发送到应用程序的结果数量 在客户端或服务器(应用程序)端,有许多关于如何集群的资源。。但不是在数据库端:( ,由另一位S.O.成员提出。解决方案基于服务器端(即C#代码隐藏) 有没有人有过解决这个问题的运气或经验,但在数据库中?有没有数据库专家在经历了一场山楂和性感的DB挑战之后 请帮忙:) 编辑1:澄清-通过聚类,我希望将x数量的点分组为一个区域的单个点。所以,如果我说把所有的东西都聚集在一个1英里/1公里的

我试图看看是否有人知道如何使用数据库对一些Lat/Long结果进行集群,以减少通过网络发送到应用程序的结果数量

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

,由另一位S.O.成员提出。解决方案基于服务器端(即C#代码隐藏)

有没有人有过解决这个问题的运气或经验,但在数据库中?有没有数据库专家在经历了一场山楂和性感的DB挑战之后

请帮忙:)

编辑1:澄清-通过聚类,我希望将
x
数量的点分组为一个区域的单个点。所以,如果我说把所有的东西都聚集在一个1英里/1公里的正方形中,那么这个“正方形”中的所有结果都被分组成一个结果(比如说…正方形的中间)


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

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

我的意思是将世界地图分成(例如)100x100个矩阵(10000个簇),每个坐标被分配给其中一个簇

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

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


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

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

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(以及一些代码,当它丢失时将其回填)。

我可能会使用笛卡尔坐标(例如WGS-84 ECF)的修改版。它易于实现,收敛速度快,无论数据是什么样子都能适应。另外,您可以选择k来满足您的带宽需求,并且每个集群将具有相同数量的关联点(mod k)

我将创建一个集群质心表,并在原始数据表中添加一个字段,以指示它也属于哪个集群。如果您的数据是动态的,您显然希望定期更新集群。我不知道是否可以使用存储过程&trigger来实现这一点,但也许可以


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

因为我使用了的是的作者之一的聚类代码。它使用PHP和MySQL为不同的缩放级别构建集群/点树,并将其存储在数据库中,以便快速调用。即使您使用的是不同的数据库,其中一些可能对您有用。

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

为什么不测试多种方法

  • 使用转换.NET CLI中的库
  • 将代码和weka.dll(使用ilmerge)生成的程序集添加到数据库中

  • 就是做一些测试。没有哪个特定的集群比任何其他集群都更有效。

    如果您最终想要探索Geohash(它是在您发布此问题的同时发明的),下面是一个与Geohash相关的SQL Server TSQL函数的更丰富的实现,您可能会感兴趣


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

    您到底在寻找什么?一组表示数据集的精简的横向/纵向点,一组靠近给定“测试”点的点,或者完全是别的什么?在开场白中补充了说明。我也有同样的问题。你找到解决方案了吗?@shizik试着用谷歌搜索openlayers(这是一个映射JS库),看看它是否可以集群。在MS SQL Server 2008中,它们有空间索引。也许这些指标中的一个可以作为聚类指标,然后将结果分组到这个聚类指标中?嗨,达斯汀,我不明白。这是某种类型的DB sql代码吗?还是php之类的?我看不出它与数据库有什么关系?我的应用程序是用ruby编写的,这是库代码。我使用它来计算给定纬度和经度的散列,并将其与点一起存储在列中。每个点编辑都会重新计算散列,并使给定散列的所有点的缓存无效。我目前正在使用带有空间索引的地理类型。但我不知道如何使用它来获得分组/聚集结果。你有一些sql代码的例子吗?我错误地认为地理明确地给了你一棵树。我相信您可以使用Drew Hall的建议,使用GEOGRAPHY.STDistance作为k-means.kewlies!所需的距离函数。。。呃。。我不知道怎么做。。但我有点明白你的意思。隐马尔可夫模型。。数据不太动态。但我仍然需要考虑如何(以及多久一次)计算这些东西。陛下