我有一张MySQL桌子,上面写着lat/lon (想想学校、校园或购物中心)。
每个位置(学校/购物中心)都可以在表中存储数十个GPS位置。所有位置都是使用移动应用程序捕获的,这些位置可以代表从入口到特定房间(会议)到电梯等容易识别的位置的所有内容。
用户提交一个请求(即在isle 6上清理看门人),我需要确保提交的请求(清理)在地理位置范围内,为该位置找到彼此最遥远的4个点。
目前,我们正在使用Haversine搜索,但我们希望将其转换为有围栏的系统。我们不能做的是建立一个单独的地理位置表。
我在谷歌上搜索过,没有发现任何东西(我可能没有使用正确的术语)。如何构建该查询?
发布于 2018-09-21 21:53:38
在近似的第一级,你可以扫描一个包围框。
假设您有一个loc表,其中包含loc_id、lat、lng列。然后说你的候选人点有@ptLat,@ptLng的位置。
计算每个位置的边框。这对纬度和经度都很好,除非你离北极或南极几度以内,或者接近180°经度。
SELECT loc_id, MAX(lat) north, MAX(lng) east, MIN(lat) south, MIN(lng) west
FROM loc
GROUP BY loc_id如果您在(loc_id, lat, lng)上有一个索引,这是快速的。这也是快速的,因为你可以避免所有的三角函数在大圆圈的计算。
一旦你有了包围框,你就可以决定你的候选点是否在里面。
那你就可以
SELECT loc_id
FROM (
SELECT loc_id, MAX(lat) north, MAX(lng) east, MIN(lat) south, MIN(lng) west
FROM loc
GROUP BY loc_id
) box
JOIN ( SELECT @ptLat ptLat, @ptLon, ptLon ) pt
ON ptLat <= north
AND ptLat >= south
AND ptLon <= east
AHD ptLon >= west这将获得与候选点匹配的loc_id值的结果集。
如果你的lat,液化天然气数据是混乱的--如果它有很多离群点--这不会很好的工作。它对错误很敏感。例如,如果冰岛的一个位置附近有很多点,但格陵兰的一个点编码错误,那么包围框就会大得离谱。
如果它不够精确,你应该研究凸包算法。但是,这很可能会将您带到纯SQL之外。
https://stackoverflow.com/questions/52450120
复制相似问题