电子围栏
- 根据坐标筛选处附近的坐标
- 支持多边形数据存储
- 查找当前的坐标落在哪个几何图形内(圆,多边形)
- mysql 自定义函数计算
- mysql geo索引
- mongodb geo索引
- postgresql PostGis索引
- redis geo
- ElasticSearch
- 高德地图开放接口
最终选型结果mongodb
技术选型简要分析 mysql搜索资料极少,看来很少有人选用
mysql 8 之前版本但使用SQL语句进行查询的缺点也显而易见,每条SQL的计算量都会非常大,有时候要十几秒才能出结果,性能将会是严重的问题。
mysql 8mysql 有专门支持位置的存储类型 geo 索引,但是检索依然感觉稍微复杂,并且效率还是有些问题。
redis-
添加 获取 地理位置的坐标。
-
计算两个位置之间的距离。
-
根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
-
根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
缺点:不支持多边形,矩形 相关的搜索
我们经常使用的滴滴打车,美团送餐,美国的 Uber, Lyft 打车,还有一些交友 apps 等等,它们都是使用 Elasticsearch 进行位置搜索
1. 找出与指定位置在给定距离内的点。 2. 找出与指定点距离在给定最小距离和最大距离之间的点 3. 找出落在指定矩形框中的点 4. 找出落在多边形中的点
但是无法 根据点搜索 所在的多边形
mongodb 可以满足需求 查找当前的坐标落在哪个多边形内
网上搜索资料注定还是不够健全,建议参考详细的文档 ,有些操作是必须加2dsphere索引的,有些非必须。整体功能还是非常强大的。
-
$geoIntersects 地理空间数据与指定GeoJSON对象.
GeoJson对象有 点,线,单环多边形,多环多边形,点列表,线列表,集合对象体,混合类型。
意思也就是说 可以查询 多边形与上述形状 相交的集合数据
- $geoWithin 查询在多边形(单环,多环,多边形集)内的 集合数据。
除了多边形。还可以 $box矩形、$center圆、$centerSphere球体内的数据集合
- $near 返回地理空间由远到近的文档的点,可以计算距离。地理空间,就是上面的GeoJson 对象 包含的类型
地址链接
轨迹围栏:创建 更新 删除 查询 电子围栏。
可以创建围栏形状,圆形,多边形,线性,行政区围栏
可以直接查询指定坐标与围栏关系
了解到高德地图的时候,功能已经使用开发完了,实际上看起来感觉 高德更加方便一些
缺点 :需要上传到云端数据,和调用接口限制。
最终技术方案思路 需求简介用户打开手机app 或者 小程序,获取用户当前坐标,推荐附近的店铺(可以理解为连锁加盟)。
每一个店铺,在地图上划分自己的经营范围,也就是电子围栏,有圆形,有多边形。
疑难1:但是圆形和多边形又是不一样的搜索方式。
疑难2:圆形仅支持搜索圆形范围内的点,但是我们现在需求是通过点搜索它在哪个圆内。
实现思路:1 多边形:根据坐标搜索多边形
2 圆形:疑难2的解决思路
根据要搜索的当前坐标 + 最大范围的半径 搜索 范围内的点,在根据距离计算,当前搜索到的点的半径大于 两点间的距离
具体代码我会上传到github上去,采用php laravel + mongo 实现



