2017-07-25 27 views
6

Mam wymiar DimPlace, który ma nazwę miejsca (ręcznie wprowadzonego przez użytkownika) oraz szerokość i długość geograficzną miejsca (automatycznie przechwycone). Ponieważ Miejsca są wprowadzane ręcznie, to samo miejsce może znajdować się w tym samym czasie wiele razy pod różnymi nazwami, dodatkowo dwa odrębne miejsca mogą znajdować się bardzo blisko siebie.Wymiar dla geozonów lub Lat i Long w hurtowni danych

Chcemy być w stanie przeanalizować MPG między dwoma "miejscami", ale chcemy je pogrupować w celu utworzenia większego obszaru - tj. Używając lat & długo umieścić wszystkie pisownię w jednym miejscu, a także wyraźne ale bardzo blisko miejsca w jednym zapisie.

Mam zamiar nadać temu nowy wymiar - coś jak DimPlaceGeozone. Szukam zasobu, aby pomóc w ładowaniu wszystkich lat & długich wartości mapowane na ... coś? Może kod pocztowy, czy nazwa miasta? Czasami możesz znaleźć skrypt do załadowania wspólnych wymiarów (np. DimTime) - chciałbym coś podobnego dla lat & długich wartości w Ameryce Północnej?

+0

Nie wiem, dlaczego to było downvoted, to ciekawe pytanie. Pomyśl o używaniu struktury takiej jak ISO-3166 i ISO-3166-2 (https://pl.wikipedia.org/wiki/ISO_3166-2) do grupowania i użyj geokodowania API dla swoich nazw miejsc. –

+0

Czy możesz polecić jakieś interfejsy API? Napisałbym więc skrypt (nie w SQL, który zakładam), aby wyszukiwać długie i długie za pośrednictwem interfejsu API, aby uzyskać nazwę miejsca zwróconą? – tember

+1

Oto jedna: https://developers.google.com/maps/documentation/javascript/examples/geocoding-reverse –

Odpowiedz

2

Zrobiłem coś podobnego w przeszłości ... Jedną przeszkodą, którą uderzyłem z przodu, było to, że 2 lokalizacje, leżące na granicy, mogą być fizycznie bliższe niż dwie lokalizacje znajdujące się w tym samym obszarze.

Obejrzałem go, tworząc system "podwójnej siatki", który powoduje, że każda lokalizacja mieści się w 4 obszarach. W ten sposób 2 lokalizacje, które dzielą co najmniej 1 "obszar", wiesz, że znajdują się w swoim zasięgu.

Oto przykład, obejmujące większość Stanów Zjednoczonych ...

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, Jason

+0

Wygląda na to, że zadziała - lub jest bardzo dobrym początkiem. Dziękuję Ci! – tember

+0

Nie ma problemu. Miło, że mogłem pomóc. –