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

时间:2018-09-21 19:36:52

标签: mysql geospatial geofencing

我有一个经纬度的MySQL表(想想学校校园或购物中心)。

每个位置(学校/购物中心)可以在表格中存储数十个GPS位置。所有位置都是使用移动应用捕获的,这些位置可以代表从入口到特定房间(会议)到易于识别的位置(例如电梯)的所有内容。

用户提交了一个请求(即,对第6小岛的看门人清理),我需要通过找到该位置彼此最远的4个点来确保所提交的请求(清理)位于地理围栏内。 >

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

我在Google周围搜索,没有找到任何东西(我可能未使用正确的术语)。如何建立该查询?

1 个答案:

答案 0 :(得分:0)

在第一个近似级别,您可以扫描边界框。

假设您有一个包含locloc_idlat列的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)上有索引,这将很快。这也很快,因为您可以避免在Great Circle计算中使用所有的trig函数。

一旦有了边界框,就可以确定候选点是否在其中。

那你就可以做

 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值与您的候选点相匹配。

如果您的经纬度数据比较杂乱-如果有很多离群点-这将不能很好地工作。它对错误很敏感。例如,如果冰岛的某个位置附近有很多点,但格陵兰岛的一个点编码错误,则边界框将非常大。

如果它对您来说不够准确,则应该研究凸包算法。但这很可能会使您脱离纯SQL。