Измерение геозон или широты и долготы в хранилище данных

У меня есть измерение DimPlace, в котором есть название места (вручную введенное пользователем), а также широта и долгота места (автоматически фиксируются). Поскольку места вводятся вручную, одно и то же место может находиться там несколько раз с разными именами, кроме того, два разных места могут находиться очень близко друг к другу.

Мы хотим иметь возможность анализировать MPG между двумя «местами», но мы хотим сгруппировать их, чтобы сделать большую область - то есть, используя широту и долготу, поместите все различные варианты написания одного места, а также отдельные, но очень близкие места в одна запись.

Я планирую создать для этого новое измерение - что-то вроде DimPlaceGeozone. Я ищу ресурс, который поможет с загрузкой всех значений lat и long, сопоставленных с ... чем-то ?? Может быть, почтовый индекс или название города? Иногда вы можете найти скрипт для загрузки общих размеров (например, DimTime) - мне бы хотелось что-то подобное для значений широты и долготы в Северной Америке?


person tember    schedule 25.07.2017    source источник
comment
Не уверен, почему это было отклонено, это интересный вопрос. Подумайте об использовании такой структуры, как ISO-3166 и ISO-3166-2 (en.wikipedia.org/ wiki / ISO_3166-2) для группировки и используйте API геокодирования для названий мест.   -  person Ron Dunn    schedule 26.07.2017
comment
Можете ли вы порекомендовать какие-либо API? Итак, я бы написал сценарий (не в SQL, как я предполагаю) для поиска lat и long через API, чтобы получить возвращенное название места?   -  person tember    schedule 27.07.2017
comment
Вот один: developers.google.com/maps/documentation/javascript/examples /   -  person Ron Dunn    schedule 29.07.2017


Ответы (1)


Я делал нечто подобное в прошлом ... Единственный камень преткновения, с которым я столкнулся, заключался в том, что 2 места, расположенные по обе стороны границы, могут быть физически ближе друг к другу, чем 2 места, которые оба находятся в одной области.

Я обошел это, создав систему «двойной сетки», в которой каждая локация делится на 4 области. Таким образом, 2 местоположения, которые разделяют по крайней мере 1 "область", вы знаете, что они находятся в пределах досягаемости друг друга.

Вот пример, охватывающий большую часть Соединенных Штатов ...

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, Джейсон

person Jason A. Long    schedule 01.08.2017
comment
Похоже, это сработает - или в любом случае это очень хорошее начало. Спасибо! - person tember; 02.08.2017
comment
Без проблем. Рад помочь. - person Jason A. Long; 02.08.2017
comment
Что делает ваша функция tfn_Tally ()? - person tember; 14.05.2018
comment
Это просто функциональная версия традиционной таблицы подсчета (другие тоже называют ее таблицами номеров). Эта идея позаимствована у Ицика Бег-Гана. itprotoday.com/microsoft-sql-server/ - person Jason A. Long; 15.05.2018