2017-07-25 30 views
6

我有一個DimPlace維度,其中包含地點名稱(由用戶手動輸入)以及該地點的緯度和經度(自動捕獲)。由於地點是手動輸入的,因此同一地點可能會有多次不同的名稱,另外,兩個不同的地點可能彼此非常接近。數據倉庫中的geozones或Lat&Long的維數

我們希望能夠分析兩個「地點」之間的MPG,但我們希望將它們分組以製作更大的區域 - 即使用長整型拼寫的一個位置,以及不同但非常關閉的地點,在一個記錄。

我打算爲此做一個新的維度 - 就像DimPlaceGeozone。我正在尋找一個資源,以幫助加載所有的經緯度&長值映射到...東西??也許郵政編碼,或城市名稱?有時你可以找到一個腳本來加載常見的維度(如DimTime) - 我會喜歡類似的東西在北美的長期價值?

+0

不知道爲什麼,這是downvoted,這是一個有趣的問題。考慮使用像ISO-3166和ISO-3166-2這樣的結構(https://en.wikipedia.org/wiki/ISO_3166-2)進行分組,併爲地名使用地理編碼API。 –

+0

你能推薦任何API嗎?所以我會寫一個腳本(不是在我假設的SQL中)通過API查找lat和long以獲取地名返回? – tember

+1

下面是一個:https://developers.google.com/maps/documentation/javascript/examples/geocoding-reverse –

回答

2

我在過去做過類似的事情......我碰到的一個絆腳石是,跨越邊界的2個位置可能比兩個位於同一區域的位置靠得更近。

我通過創建一個「雙重網格」系統來解決這個問題,該系統導致每個位置都落入4個區域。這樣,至少分享1個「區域」的2個位置,你知道他們在彼此的範圍內。

下面是一個例子,覆蓋美國大部分地區的...

IF OBJECT_ID('tempdb..#LatLngAreas', 'U') IS NOT NULL 
DROP TABLE #LatLngAreas; 
GO 

WITH 
    cte_Lat AS (
     SELECT 
      t.n, 
      BegLatRange = -37.9 + (t.n/10.0), 
      EndLatRange = -37.7 + (t.n/10.0) 
     FROM 
      dbo.tfn_Tally(1030, 0) t 
     ), 
    cte_Lng AS (
     SELECT 
      t.n, 
      BegLngRange = -159.7 + (t.n/10.0), 
      EndLngRange = -159.5 + (t.n/10.0) 
     FROM 
      dbo.tfn_Tally(3050, 0) t 
     ) 
SELECT 
    Area_ID = ROW_NUMBER() OVER (ORDER BY lat.n, lng.n), 
    lat.BegLatRange, 
    lat.EndLatRange, 
    lng.BegLngRange, 
    lng.EndLngRange 
    INTO #LatLngAreas 
FROM 
    cte_Lat lat 
    CROSS JOIN cte_Lng lng; 


SELECT 
    b3.Branch_ID, 
    b3.Name, 
    b3.Lat, 
    b3.Lng, 
    lla.Area_ID 
FROM 
    dbo.ContactBranch b3 -- replace with DimPlace 
    JOIN #LatLngAreas lla 
     ON b3.Lat BETWEEN lla.BegLatRange AND lla.EndLatRange 
     AND b3.lng BETWEEN lla.BegLngRange AND lla.EndLngRange; 

HTH, 傑森

+0

這看起來好像會起作用 - 或者是一個非常好的開始。謝謝! – tember

+0

沒問題。樂意效勞。 –