我在過去做過類似的事情......我碰到的一個絆腳石是,跨越邊界的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 –