2015-08-23 24 views
3

我是SQL Server的新手。我試圖弄清楚如何完成下面的工作:在SQL Server數據庫中平均出lat/longs

我有成千上萬的緯度/長度位置指向相同的或非常接近的位置。它們全部作爲LAT & LONG列存儲在SQL Server表中。

現在要對經緯度進行聚類併爲每個羣集選擇一個表示,我必須做什麼?

我通過一個名爲「STCentroid」的方法如下: https://msdn.microsoft.com/en-us/library/bb933847.aspx

但它是值得讓服務器做這些所有百萬行的多邊形,並找到中心點?這隱含地表示所有附近的重複項都有一個單一的表示。可能是一種有效/錯誤的方式?

只有幾米的點才能被視爲重複條目。 我在想如何選擇正確的表示。

在更好的話:

如果有試圖指向位置L1一組點G1 {}(GPS位置)。 (物理loc)。 &有一組點G2 {},試圖指向一個位置L2。我如何從G1 {}派生中心點CP1? &來自G2 {}的CP2,使得CP1非常接近於L1 & CP2非常接近於L2。

而事實是,L1可以非常接近彼此說的10英尺。

只是想我該如何解決這個問題。請幫忙嗎?

+0

爲什麼這個問題被拒絕投票? -1? – user1534863

+0

爲什麼不僅僅是平均所有的緯度來獲得平均緯度和平均所有的經度來獲得平均經度?因爲所有的點都應該給出合理的結果。 –

+0

@Martin。謝謝回覆。如果我必須得到一個最終的經緯度,那麼建議的答案將起作用。但是在這裏,我需要從每個段中派生出最後一組Lat/long(S)。因此,在成千上萬的記錄中,最終輸出將是CP1,CP2,CP3,CP4 ... CPn。 – user1534863

回答

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)).EvelopeCenter().Lat AS 'LatCenter', 
    GEOGRAPHY::ConvexHullAggregate(GEOGRAPHY::STPointFromText('POINT(' + CAST(LAT AS VARCHAR(20)) + ' ' + CAST(LONG AS VARCHAR(20)) + ')', 4326)).EvelopeCenter().Long AS 'LatCenter', 
FROM 
    RecordSet 
GROUP BY 
    ClusterID 
+0

感謝您的整潔回覆hcaelxxam。讓我試試這個,然後回來。 – user1534863

+0

沒問題。嘿,我剛剛意識到我在更新部分省略了一個條件,即AND CluserID IS NULL。 對不起。 – hcaelxxam