Determine/create 一个 geofence/bounding 即时框
Determine/create a geofence/bounding box on the fly
我有 MySQL table 个 lat/lon(想想学校校园或购物中心)。
每个位置 (school/mall) 可以在 table 中存储数十个 GPS 位置。所有位置都是使用移动应用程序捕获的,这些位置可以代表从入口到特定房间(会议)到易于识别的位置(例如电梯)的所有内容。
用户提交了一个请求(即 6 号岛上的看门人清理),我需要确保提交的请求(清理)在通过找到该位置彼此最远的 4 个点建立的地理围栏内。
目前我们正在使用 Haversine 搜索,但我们想将其转换为围栏系统。我们不能做的是建立一个单独的地理围栏 table.
我用谷歌搜索了一下,但没有找到任何东西(我可能没有使用正确的术语)。我如何构建该查询?
在第一级近似中,您可以扫描边界框。
假设您有一个包含 loc_id
、lat
、lng
列的 loc
table。
并假设您的候选点的位置为 @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 之外。
我有 MySQL table 个 lat/lon(想想学校校园或购物中心)。
每个位置 (school/mall) 可以在 table 中存储数十个 GPS 位置。所有位置都是使用移动应用程序捕获的,这些位置可以代表从入口到特定房间(会议)到易于识别的位置(例如电梯)的所有内容。
用户提交了一个请求(即 6 号岛上的看门人清理),我需要确保提交的请求(清理)在通过找到该位置彼此最远的 4 个点建立的地理围栏内。
目前我们正在使用 Haversine 搜索,但我们想将其转换为围栏系统。我们不能做的是建立一个单独的地理围栏 table.
我用谷歌搜索了一下,但没有找到任何东西(我可能没有使用正确的术语)。我如何构建该查询?
在第一级近似中,您可以扫描边界框。
假设您有一个包含 loc_id
、lat
、lng
列的 loc
table。
并假设您的候选点的位置为 @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 之外。