use*_*863 5 sql sql-server spatial
我是SQL Server的新手。我试图弄清楚如何完成以下一项工作:
我有成千上万的经/纬度位置指向同一位置,或者位置非常接近。它们全部以LAT&LONG列的形式存储在SQL Server表中。
现在要对纬度/经度进行聚类并为每个聚类选择一个表示,我必须做什么?
我通读了一种称为“ STCentroid”的方法:https ://msdn.microsoft.com/zh-cn/library/bb933847.aspx
但是,值得让服务器使用所有这百万行创建一个多边形并找到中心点吗?这将隐含地表示所有近邻均由重复表示。可能是有效/错误的方式吗?
仅几米附近的点必须被视为重复项。我在考虑如何挑选正确的代表。
用更好的话说:
如果有一组点G1 {}(GPS位置)试图指向位置L1。(物理位置)。&有一组点G2 {},试图指向位置L2。如何从G1 {}导出中心点CP1。和来自G2 {}的CP2,这样CP1非常接近L1,而CP2非常接近L2。
事实是,L1和L2可能彼此非常接近,例如10英尺。
只是在思考如何解决这个问题。有什么帮助吗?
聚类点将会出现问题。如果您有两个潜在的集群靠近,那么您将会遇到问题,并且如果您需要精度或优化,那么您将需要对您的实现进行一些研究。尝试:Wiki 聚类分析
但是,如果点簇相距相当远,那么您可以尝试一个相当简单的簇,然后找到包络线。
类似这样的东西可能会起作用,尽管您实际上可以创建一个空间列并添加一个空间索引。
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
646 次 |
| 最近记录: |