sql - 在 SQL Server 数据库中平均纬度/经度

标签 sql sql-server spatial

我是 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/

相关文章:

sql - 如何在两个独立的 MySQL 连接之间执行 SQL 语句?

mysql - 两个外键,其中一个不为 NULL : How to solve this in SQL?

sql-server - DB锁需要事务吗?

sql-server - 使用直接与开发服务器同步的 TFS 2010 的 SQL Server 版本控制

google-maps - 谷歌地图空间引用系统

.net - 获取 DataColumn 的原始数据格式

MySQL:带有 JOIN 的 SUM() 返回不正确的值

sql - 两表三列变一表四列

以英里计算的 SQL Server 几何距离?

c# - 通过坐标计算二维形状的最小外接矩形