2012-10-04 45 views
2

我試圖找到到最近的自行車架到犯罪地點的距離。我有一個有500萬個犯罪和5000個自行車架的數據庫表。我現在需要做的是爲500萬件犯罪案件中的每一件尋找最近的自行車架。我嘗試使用geopy創建一個python腳本,但它在處理過程中太耗時(至少需要幾周)。我一直在網上廣泛搜索,我發現SQL Server 2012有一個地理數據類型,所以我創建了一個包含經度和緯度點的犯罪和自行車架的地理數據類型的列。SQL Server 2012地理位置 - 查找多個行的最小值

現在我試圖做這樣的事情:

update Crimes set distanceToNearestBikeRack = crimeGeo.STDistance((select geo from bike_racks)) 

不幸的是,這會導致子查詢返回許多行,並且拋出:

消息512,級別16,狀態1 ,第1行子查詢返回的值超過1 。當子查詢遵循=,!=,<,< =,>,> = 或子查詢用作表達式時,這是不允許的。該語句已終止。

如何從多個點中找到最近點?

回答

1

通常你會使用MIN找到最小的一組值的,但它似乎它不與空間法發揮出色。然而,這工作,:

UPDATE 
    Crimes 
SET 
    distanceToNearestBikeRack = 
     (SELECT TOP 1 crimeGeo.STDistance(BR.geo) 
     FROM bike_racks BR 
     ORDER BY crimeGeo.STDistance(BR.geo) ASC) 

當然,有500萬周的罪行五千自行車架,這可能需要......一段時間。所以你可能想看看批量更新。

+0

這是完美的!正是我在找什麼。謝謝!我向更新添加了批處理。 –

0

顯然,你需要爲每一個作案地點,一旦做到這一點計算,子查詢會需要與犯罪的位置信息,以便找到最近的自行車架。

我還沒有看過SQL 2012,但在過去的日子裏,人們會使用Haversine公式,這實際上非常快。 請參閱 Geolocation and Haversine formula的回答,或者我回答幾年前的How to calculate distance from a GPX file?以獲得UDF實現。