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

Mysql 动态确定/创建地理围栏/边界框,mysql,geospatial,geofencing,Mysql,Geospatial,Geofencing,我有一张MySQL的lat/lon表,可以想象是校园还是购物中心 每个位置的学校/商场都可以在表中存储几十个GPS位置。所有位置都是使用移动应用程序捕获的,这些位置可以代表从入口到特定会议室到电梯等易于识别的位置的一切 用户提交了一个请求,即6号岛上的门卫清理,我需要确保提交的清理请求在通过查找该位置彼此最远的4个点而建立的地理围栏内 目前我们正在使用Haversine搜索,但我们希望将其转换为隔离系统。我们不能做的是建立一个单独的地理围栏表 我在谷歌搜索了一下,没有发现任何我可能没有使用正确的

我有一张MySQL的lat/lon表,可以想象是校园还是购物中心

每个位置的学校/商场都可以在表中存储几十个GPS位置。所有位置都是使用移动应用程序捕获的,这些位置可以代表从入口到特定会议室到电梯等易于识别的位置的一切

用户提交了一个请求,即6号岛上的门卫清理,我需要确保提交的清理请求在通过查找该位置彼此最远的4个点而建立的地理围栏内

目前我们正在使用Haversine搜索,但我们希望将其转换为隔离系统。我们不能做的是建立一个单独的地理围栏表


我在谷歌搜索了一下,没有发现任何我可能没有使用正确的术语的东西。如何构建该查询?

在第一级近似中,您可以扫描边界框

假设您有一个带有loc_id、lat、lng列的loc表。 假设您的候选点的位置为@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。

谢谢。我想这会给我一个好的开始!凌乱的尝试10000个位置和近一百万个数据点,这些数据点都是由多人随机输入的。英雄联盟