平均SQL Server数据库中的Lat / long

时间:2015-08-23 06:46:42

标签: sql sql-server spatial

我是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英尺。

考虑如何解决这个问题。有什么帮助吗?

1 个答案:

答案 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