我在过去做过类似的事情......我碰到的一个绊脚石是,跨越边界的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, 杰森
不知道为什么,这是downvoted,这是一个有趣的问题。考虑使用像ISO-3166和ISO-3166-2这样的结构(https://en.wikipedia.org/wiki/ISO_3166-2)进行分组,并为地名使用地理编码API。 –
你能推荐任何API吗?所以我会写一个脚本(不是在我假设的SQL中)通过API查找lat和long以获取地名返回? – tember
下面是一个:https://developers.google.com/maps/documentation/javascript/examples/geocoding-reverse –