这是我一整天都在努力解决的一个非常有趣的问题.我有一张表,其中包含位置的ID,纬度和经度.这是来自更大位置的位置的子集.
我想要做的是使用这个位置子集,并且对于每个位置,使用空中距离返回距离较大集合20英里内的位置.我的问题不是计算空中距离,这是有效的,我的问题是如何像For循环一样操作每一行,但使用基于集合的方法.
所以我们假设这是我的子集表LocationSubset
+----+---------+----------+
| ID | Lat | Lon |
+----+---------+----------+
| 1 | 41.0575 | -92.1364 |
+----+---------+----------+
| 2 | 47.0254 | -92.5723 |
+----+---------+----------+
| 3 | 38.9897 | -88.7623 |
+----+---------+----------+
Run Code Online (Sandbox Code Playgroud)
我正在寻找更大的桌子,地点
+----+---------+-----------+
| ID | Lat | Lon |
+----+---------+-----------+
| 1 | 41.0575 | -92.1364 |
+----+---------+-----------+
| 2 | 47.0254 | -92.5723 |
+----+---------+-----------+
| 2 | 38.9897 | -88.7623 |
+----+---------+-----------+
| 4 | 36.2137 | -91.6528 |
+----+---------+-----------+
| 5 | 39.2643 | -123.0073 |
+----+---------+-----------+
| 6 | 39.941 | -123.0073 |
+----+---------+-----------+
| 7 | 35.7683 | -91.6528 |
+----+---------+-----------+
| 8 | 45.8406 | -91.6528 |
+----+---------+-----------+
Run Code Online (Sandbox Code Playgroud)
让我们假设,使用Haversine公式,位置5和6位于位置1的20英里内,位置4和8位于位置2的20英里范围内.
我希望返回这样的东西:
+----+------------+----------+
| ID | LocationID | Distance |
+----+------------+----------+
| 1 | 5 | 15.4 |
+----+------------+----------+
| 1 | 6 | 16 |
+----+------------+----------+
| 2 | 4 | 17.4 |
+----+------------+----------+
| 2 | 8 | 2.5 |
+----+------------+----------+
Run Code Online (Sandbox Code Playgroud)
每个位置可能在20英里内有零到多个位置,我试图在另一个表中捕获它.
如有必要,我可以加上澄清.感谢您的时间.
SELECT
LS.ID,
L.ID as LocationID,
MS_DISTANCE (LS.Lat , LS.Lon, L.Lat , L.Lon) as Distance
FROM LocationSubset LS
JOIN Locations L
ON MS_DISTANCE (LS.Lat , LS.Lon, L.Lat , L.Lon) < 20
AND LS.ID <> L.ID -- if you want remove comparasion with same object
Run Code Online (Sandbox Code Playgroud)
但是你可以更好地使用sql server空间函数,因为那些允许使用空间索引.空间数据
| 归档时间: |
|
| 查看次数: |
139 次 |
| 最近记录: |