我正在尝试查看是否有人知道如何使用数据库对一些Lat / Long结果进行聚类,以减少通过线路发送到应用程序的结果数量。
有许多关于如何集群的资源,无论是在客户端还是在服务器(应用程序)端,而不是在数据库端:(
一位S.O.先生问道,{p> This is a similar question会员。解决方案基于服务器端(即后面的C#代码)。有没有人有解决这个问题的运气或经验,但是在数据库中?是否有任何数据库大师在追求hawt和性感数据库挑战?
请帮助:)
编辑1:澄清 - 通过聚类,我希望将x
个点数分组到一个区域。所以,如果我说集群中的所有东西都在1英里/ 1平方公里的范围内,那么'square'中的所有结果都是GROUP'D到一个结果中(比如......正方形的中间)。
答案 0 :(得分:12)
我可能会使用笛卡尔坐标(例如WGS-84 ECF)坐标来修改*版k-means clustering。它很容易实现和快速收敛,无论外观如何,都能适应您的数据。另外,您可以选择 k 以满足您的带宽要求,并且每个群集将具有相同数量的关联点(mod k)。
我创建了一个聚类质心表,并在原始数据表中添加一个字段,以指示它所属的聚类。如果您的数据完全是动态的,您显然希望定期更新群集。我不知道你是否可以用存储过程来做到这一点。触发,但也许。
*“修改”是调整计算质心向量的长度,使它们位于地球表面。否则你最终得到一堆负高度的点(当转换回LLH时)。
答案 1 :(得分:5)
如果你在地理位置聚类,我无法想象它是什么:-),你可以将“群集ID”与纬度/经度坐标一起存储在数据库中。
我的意思是将世界地图划分为(例如)100x100矩阵(10,000个群集),并将每个坐标分配给其中一个群集。
然后,您可以通过选择相同正方形中的坐标来检测非常接近的坐标,并通过选择相邻正方形中的坐标来适度接近坐标。
正方形的大小(以及它们的数量)将取决于您需要聚类的准确程度。显然,如果你只有一个2x2矩阵,你可以得到一些相距很远的坐标聚类。
Yo总是会有边缘情况,例如两个点靠近在一起,但在不同的集群中(集群中最北端,其中最南端),但是你可以调整集群大小 OR 在客户端处理结果。
答案 2 :(得分:4)
我为地理应用程序做了类似的事情,我想确保我可以轻松地缓存点集。我的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
从那里一切都变得非常简单。我有一些代码用于抓取从给定点到给定半径的所有块,这些块将转换为单个memcache multiget(以及一些代码在它丢失时回填)。
答案 3 :(得分:2)
对于movielandmarks.com,我使用了来自Mike Purvis的Beginning Google Maps Applications with PHP and AJAX作者之一的群集代码。它使用PHP和MySQL为不同的缩放级别构建簇/点树,将其存储在数据库中,以便快速调用。即使您使用的是其他数据库,其中一些可能对您有用。
答案 4 :(得分:1)
为什么不测试多种方法?
答案 5 :(得分:0)
我相信你可以使用MSSQL's spatial data types。如果它们与我所知的其他空间数据类型相似,它们会将您的点存储在矩形树中,然后您可以转到较低分辨率的矩形以获得隐式聚类。
答案 6 :(得分:0)
如果您最终想要探索 Geohash(它是在您发布此问题的同时发明的),这里是您可能感兴趣的 SQL Server 的 TSQL 的 Geohash 相关函数的更加充实的实现。>
我广泛使用了 Geohash 的整数版本来对结果进行聚类,以减少发送到客户端的有限视口的数据。