我有一个mysql表lat/lon(想想学校校园或购物中心)。
每个位置(学校/商场)都可以在表中存储几十个gps位置。所有的位置都是通过移动应用程序捕捉到的,这些位置可以代表从入口到特定房间(会议)到电梯等易于识别的位置的一切。
用户提交一个请求(即6号岛上的看门人清理),我需要确保提交的请求(清理)在通过查找该位置彼此最远的4个点而建立的地理围栏内。
目前,我们正在使用哈弗森搜索,但我们想把它转换成一个封闭的系统。我们不能做的是建立一个单独的地理围栏表。
我搜索了一下,没有发现任何东西(我可能没有使用正确的术语)。如何构建该查询?
1条答案
按热度按时间bt1cpqcv1#
在第一级近似中,可以扫描边界框。
假设你有一个
loc
带的表格loc_id
,lat
,lng
柱。并说你的候选人观点@ptLat
,@ptLng
.计算每个位置的边界框。这在纬度和经度上都适用,除非你在北极或南极几度以内或接近180度° 经度。
这是快速的,如果你有一个索引上
(loc_id, lat, lng)
. 它也很快,因为你可以避免所有的三角函数在大圆计算。一旦有了边界框,就可以确定候选点是否在其内部。
那你就可以了
这将获得一个结果集,其中locïid值与候选点匹配。
如果你的lat,lng数据是混乱的——如果它有很多离群点——这将不会很好地工作。它对错误很敏感。例如,如果冰岛的一个位置附近有很多点,但格陵兰岛的一个点编码错误,那么边界框将非常大。
如果它不够精确,你应该研究凸包算法。但这很可能会使您脱离纯sql。