地图的电子围栏功能的技术选型
需求說明
電子圍欄
現(xiàn)有解決方案
- mysql 自定義函數(shù)計算
- mysql geo索引
- mongodb geo索引
- postgresql PostGis索引
- redis geo
- ElasticSearch
- 高德地圖開放接口
最終選型結(jié)果mongodb
技術(shù)選型簡要分析
mysql
搜索資料極少,看來很少有人選用
mysql 8 之前版本
但使用SQL語句進(jìn)行查詢的缺點也顯而易見,每條SQL的計算量都會非常大,有時候要十幾秒才能出結(jié)果,性能將會是嚴(yán)重的問題。
mysql 8
mysql 有專門支持位置的存儲類型 geo 索引,但是檢索依然感覺稍微復(fù)雜,并且效率還是有些問題。
redis
添加 獲取 地理位置的坐標(biāo)。
計算兩個位置之間的距離。
根據(jù)用戶給定的經(jīng)緯度坐標(biāo)來獲取指定范圍內(nèi)的地理位置集合。
根據(jù)儲存在位置集合里面的某個地點獲取指定范圍內(nèi)的地理位置集合。
缺點:不支持多邊形,矩形 相關(guān)的搜索
Elasticsearch
? 我們經(jīng)常使用的滴滴打車,美團(tuán)送餐,美國的 Uber, Lyft 打車,還有一些交友 apps 等等,它們都是使用 Elasticsearch 進(jìn)行位置搜索
1. 找出與指定位置在給定距離內(nèi)的點。 2. 找出與指定點距離在給定最小距離和最大距離之間的點 3. 找出落在指定矩形框中的點 4. 找出落在多邊形中的點但是無法 根據(jù)點搜索 所在的多邊形
mongodb
? 可以滿足需求 查找當(dāng)前的坐標(biāo)落在哪個多邊形內(nèi)
? 網(wǎng)上搜索資料注定還是不夠健全,建議參考詳細(xì)的文檔 ,有些操作是必須加2dsphere索引的,有些非必須。整體功能還是非常強大的。
$geoIntersects 地理空間數(shù)據(jù)與指定GeoJSON對象.
GeoJson對象有 點,線,單環(huán)多邊形,多環(huán)多邊形,點列表,線列表,集合對象體,混合類型。
意思也就是說 可以查詢 多邊形與上述形狀 相交的集合數(shù)據(jù)
除了多邊形。還可以 $box矩形、$center圓、$centerSphere球體內(nèi)的數(shù)據(jù)集合
高德地圖-獵鷹[軌跡服務(wù)]
? 地址鏈接
? 軌跡圍欄:創(chuàng)建 更新 刪除 查詢 電子圍欄。
? 可以創(chuàng)建圍欄形狀,圓形,多邊形,線性,行政區(qū)圍欄
? 可以直接查詢指定坐標(biāo)與圍欄關(guān)系
了解到高德地圖的時候,功能已經(jīng)使用開發(fā)完了,實際上看起來感覺 高德更加方便一些
? 缺點 :需要上傳到云端數(shù)據(jù),和調(diào)用接口限制。
最終技術(shù)方案思路
需求簡介
用戶打開手機app 或者 小程序,獲取用戶當(dāng)前坐標(biāo),推薦附近的店鋪(可以理解為連鎖加盟)。
每一個店鋪,在地圖上劃分自己的經(jīng)營范圍,也就是電子圍欄,有圓形,有多邊形。
疑難1:但是圓形和多邊形又是不一樣的搜索方式。
疑難2:圓形僅支持搜索圓形范圍內(nèi)的點,但是我們現(xiàn)在需求是通過點搜索它在哪個圓內(nèi)。
實現(xiàn)思路:
1 多邊形:根據(jù)坐標(biāo)搜索多邊形
2 圓形:疑難2的解決思路
? 根據(jù)要搜索的當(dāng)前坐標(biāo) + 最大范圍的半徑 搜索 范圍內(nèi)的點,在根據(jù)距離計算,當(dāng)前搜索到的點的半徑大于 兩點間的距離
具體代碼我會上傳到github上去,采用php laravel + mongo 實現(xiàn)
總結(jié)
以上是生活随笔為你收集整理的地图的电子围栏功能的技术选型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于51单片机来开发的智能感应开盖垃圾桶
- 下一篇: 阿里云无影云电脑ubantu中文失败解决