地理区域的维度或数据仓库中的纬度和经度
Dimension for geozones or Lat & Long in data warehouse
我有一个 DimPlace 维度,其中包含地点名称(由用户手动输入)和地点的经纬度(自动捕获)。由于地点是手动输入的,因此同一个地点可能会以不同的名称出现多次,此外,两个不同的地点可能彼此非常接近。
我们希望能够分析两个 "places" 之间的 MPG,但我们希望将它们分组以形成更大的区域 - 即使用纬度和经度放置一个位置的所有各种拼写,以及不同但非常接近的位置,在一个记录中。
我正计划为此创建一个新维度 - 类似于 DimPlaceGeozone。我正在寻找一种资源来帮助加载映射到...某物的所有纬度和经度值?也许是邮政编码或城市名称?有时您可以找到一个脚本来加载通用维度(如 DimTime)——我会喜欢北美的经纬度值类似的东西吗?
我过去做过类似的事情...我前面遇到的一个绊脚石是,跨越边界的 2 个位置在物理上可能比位于同一区域的 2 个位置更靠近。
我通过创建一个 "double grid" 系统来绕过它,该系统使每个位置都分为 4 个区域。这样 2 个位置至少共享 1 个 "area" 你知道它们在彼此的范围内。
这是一个例子,覆盖了美国大部分地区...
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,
杰森
我有一个 DimPlace 维度,其中包含地点名称(由用户手动输入)和地点的经纬度(自动捕获)。由于地点是手动输入的,因此同一个地点可能会以不同的名称出现多次,此外,两个不同的地点可能彼此非常接近。
我们希望能够分析两个 "places" 之间的 MPG,但我们希望将它们分组以形成更大的区域 - 即使用纬度和经度放置一个位置的所有各种拼写,以及不同但非常接近的位置,在一个记录中。
我正计划为此创建一个新维度 - 类似于 DimPlaceGeozone。我正在寻找一种资源来帮助加载映射到...某物的所有纬度和经度值?也许是邮政编码或城市名称?有时您可以找到一个脚本来加载通用维度(如 DimTime)——我会喜欢北美的经纬度值类似的东西吗?
我过去做过类似的事情...我前面遇到的一个绊脚石是,跨越边界的 2 个位置在物理上可能比位于同一区域的 2 个位置更靠近。
我通过创建一个 "double grid" 系统来绕过它,该系统使每个位置都分为 4 个区域。这样 2 个位置至少共享 1 个 "area" 你知道它们在彼此的范围内。
这是一个例子,覆盖了美国大部分地区...
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, 杰森