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

问题描述 投票:4回答:1

我是SQL Server的新手。我想知道如何完成下面的工作:

我有数以千计的纬度/长仓位指向相同或非常接近的位置。它全部存储在SQL Server表中作为LAT和LONG列。

现在集群lat / longs并为每个集群选择一个表示,我必须做什么?

我读了一个名为“STCentroid”的方法:https://msdn.microsoft.com/en-us/library/bb933847.aspx

但值得让服务器做一个包含所有这些百万行的多边形并找到中心点吗?这隐含地表示所有近似重复的单个表示。可能是有效/错误的方式?

只有几米左右的点必须被视为重复条目。我在想我怎么能选择正确的代表。

换句话说:

如果有一组点{} {}(GPS位置)试图指向位置L1。 (物理位置)。 &有一组点{}},试图指向一个位置L2。如何从G1 {}中导出中心点CP1。来自G2 {}的&CP2,使得CP1非常接近L1并且CP2非常接近L2。

而事实是,L1和L2可能非常接近,比如10英尺。

只是想着如何解决这个问题。有什么帮助吗?

sql sql-server spatial
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.