我是SQL Server的新手。我试图找出如何完成下面的工作:
我有数以千计的纬度/长仓位指向同一个或非常接近的位置。它全部存储在SQL Server表中,如LAT&龙柱。
现在对lat / long进行聚类并为每个簇选择一个表示,我必须做什么?
我读了一个名为" STCentroid" : https://msdn.microsoft.com/en-us/library/bb933847.aspx
但是,让服务器执行所有这些百万行的多边形并找到中心点是否值得?这隐含地表示所有近似重复的单个表示。可能是有效/错误的方式吗?
只有几米左右的点必须被视为重复条目。 我正在考虑如何选择合适的代表。
更好的话:
如果有一组点G1 {}(GPS位置)试图指向位置L1。 (物理位置)。 &安培;有一组点G2 {},试图指向位置L2。如何从G1 {}中导出中心点CP1。 &安培;来自G2 {}的CP2,使得CP1非常接近L1& CP2非常接近L2。
事实是,L1& L2可能非常接近,比如10英尺。
考虑如何解决这个问题。有什么帮助吗?
答案 0 :(得分:2)
聚类点会有问题。如果您有两个潜在的集群,如果您需要精确或优化,那么您将遇到问题,那么您需要对您的实施进行一些研究。尝试:Wiki-Cluster Analysis
但是,如果点数相距很远,那么你可以尝试一个相当简单的聚类,然后找到信封。
这样的事情可能有用,虽然你可以很好地制作空间列并添加空间索引。
ALTER TABLE Recordset ADD (ClusterID INT) -- Add a grouping ID
GO
DECLARE @i INT --Group Counter
DECLARE @g GEOGRAPHY --Point from which the cluster will be made
DECLARE @Limit INT --Distance limitation
SET @Limit = 10
SET @i = 0
WHILE (SELECT COUNT(*) FROM Recordset R WHERE ClusterID IS NULL) > 0 --Loop until all points are clustered
BEGIN
SET @g = (SELECT TOP 1 GEOGRAPHY::STPointFromText('POINT(' + CAST(LAT AS VARCHAR(20)) + ' ' + CAST(LONG AS VARCHAR(20)) + ')', 4326) WHERE ClusterID IS NULL) --Point to cluster on
UPDATE Recordset SET ClusterID = @i WHERE GEOGRAPHY::STPointFromText('POINT(' + CAST(LAT AS VARCHAR(20)) + ' ' + CAST(LONG AS VARCHAR(20)) + ')', 4326).STDistance(@g) < @Limit AND ClusterID IS NULL--update all points within the limit circle
SET @i = @i + 1
END
SELECT --Clustered centers
ClusterID,
GEOGRAPHY::ConvexHullAggregate(GEOGRAPHY::STPointFromText('POINT(' + CAST(LAT AS VARCHAR(20)) + ' ' + CAST(LONG AS VARCHAR(20)) + ')', 4326)).EnvelopeCenter().Lat AS 'LatCenter',
GEOGRAPHY::ConvexHullAggregate(GEOGRAPHY::STPointFromText('POINT(' + CAST(LAT AS VARCHAR(20)) + ' ' + CAST(LONG AS VARCHAR(20)) + ')', 4326)).EnvelopeCenter().Long AS 'LatCenter',
FROM
RecordSet
GROUP BY
ClusterID