2017-07-25 27 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

没问题。乐意效劳。 –