我是 SQL Server 新手。我正在尝试弄清楚如何完成以下任务:
我有数千个纬度/经度位置指向相同或非常接近的位置。它全部作为 LAT 和 LONG 列平面存储在 SQL Server 表中。
现在要对纬度/经度进行聚类并为每个聚类选择一个表示,我必须做什么?
我通读了一个名为“STCentroid”的方法: https://msdn.microsoft.com/en-us/library/bb933847.aspx
但是让服务器创建一个包含数百万行的多边形并找到中心点值得吗?这隐含地意味着所有附近的重复项都有一个单一的表示。可能是一种高效/错误的方式?
只有几米左右的点才必须被视为重复条目。 我在想如何才能选择正确的代表。
换句话来说:
如果有一组点 G1{}(GPS 位置)尝试指向位置 L1。 (物理位置)。 & 有一组点 G2{},试图指向位置 L2。如何从 G1{} 导出中心点 CP1。 & CP2 来自 G2{},这样 CP1 非常接近 L1,CP2 非常接近 L2。
事实是,L1 和 L2 可能非常接近,例如 10 英尺。
只是想如何解决这个问题。请问有什么帮助吗?
最佳答案
聚类点将会出现问题。如果您有两个潜在的集群靠近,那么您将会遇到问题,并且如果您需要精度或优化,那么您将需要对您的实现进行一些研究。尝试: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
关于sql - 在 SQL Server 数据库中平均纬度/经度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32163970/