动态确定/创建地理围栏/边界框

00jrzges  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(452)

我有一个mysql表lat/lon(想想学校校园或购物中心)。
每个位置(学校/商场)都可以在表中存储几十个gps位置。所有的位置都是通过移动应用程序捕捉到的,这些位置可以代表从入口到特定房间(会议)到电梯等易于识别的位置的一切。
用户提交一个请求(即6号岛上的看门人清理),我需要确保提交的请求(清理)在通过查找该位置彼此最远的4个点而建立的地理围栏内。
目前,我们正在使用哈弗森搜索,但我们想把它转换成一个封闭的系统。我们不能做的是建立一个单独的地理围栏表。
我搜索了一下,没有发现任何东西(我可能没有使用正确的术语)。如何构建该查询?

bt1cpqcv

bt1cpqcv1#

在第一级近似中,可以扫描边界框。
假设你有一个 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,lng数据是混乱的——如果它有很多离群点——这将不会很好地工作。它对错误很敏感。例如,如果冰岛的一个位置附近有很多点,但格陵兰岛的一个点编码错误,那么边界框将非常大。
如果它不够精确,你应该研究凸包算法。但这很可能会使您脱离纯sql。

相关问题