開發(fā)APP時對于地理位置查詢是怎樣制作的?
基于LBS的App,必不可少的一個功能是根據(jù)當(dāng)前用戶的位置查找附近范圍內(nèi)的人或物。這些App的數(shù)據(jù)中部包含了地理位置信息,而如何處理、分析、存儲這些地理位置信息,則是LBS技術(shù)的個關(guān)鍵點(diǎn)。關(guān)于LBS技術(shù)的詳細(xì)分析,可查看深圳APP開發(fā)公司本站LBSApp后臺架構(gòu)”這一篇文章。因?yàn)镸ongoDB封裝了LBS常用的操作全球流行的LBS應(yīng)用foursquare,國內(nèi)的快的打車和滴滴打車(現(xiàn)在這兩家公司己合并)都曾經(jīng)選擇TMongoDB處理LBS。APP開發(fā)公司程序員將在本節(jié)中將演示如何使用MongoDB處理LBS。首先在MongoDB中插入地理位置的數(shù)據(jù)示例如下:
本文演示的LBS功能使用的數(shù)據(jù)是上面location集合中的數(shù)據(jù),其中name表示用戶的名稱coordlnate表示用戶的坐標(biāo)MongoDB原生支持地理位置索引,可以直接用于位置距離計算和查詢,常用的地理位置索引有兩種。
·2d:平面坐標(biāo)索引,適用于基于平面的距離計算。
·2dsphere:幾何球體索引,適用于球面上的距離計算。
在地理位置數(shù)據(jù)上建立地理位置索引:
>db.location.ensurelndex({'coordinate':'/d'})
或者
>db.location.ensurelndex({'coordinate':'/dsphere'})
如果要追求最準(zhǔn)確的精度,應(yīng)該選擇2dsphere,在坐標(biāo)跨度不大的情況下(例如幾百、幾千千米).這兩者的計算結(jié)果相差無幾MongoDB官方推薦使用2dsphere。
下面演示了LBS應(yīng)用中最常用的“查找附近的人(物)”的操作,同時也演示了如何查找個特定區(qū)域內(nèi)的坐標(biāo)
1.使用llougoDH查找附近的人
在LBS中,應(yīng)該會遇到如圖8-11所示的需求,把當(dāng)前用戶附近的人(物)在地圖中顯示出來。
APP開發(fā)地理位置定位制作經(jīng)驗(yàn)示意圖8-11顯示當(dāng)前用戶附近的人(物)
查找附近的人(物)的功能,可以等同于在MongoDB中,查找有哪些坐標(biāo)和用戶當(dāng)前坐標(biāo)直線距離為某個固定值以內(nèi)(例如1000米范圍內(nèi))。MongoDB使用“$nearSphere”操作符條查詢語句就能把這個功能實(shí)現(xiàn)。
下面的語句表示查找集合location中,和坐標(biāo)[113.392237,23062429]的間距在l千米范圍內(nèi)的坐標(biāo)。
上面“spherical”為true表示計算距離,distanceMultiplier指定地球半徑來得到實(shí)際的千米或者米的距離,“1000/6378137”就是把距離轉(zhuǎn)化為弧度。
查找500米范圍,可使用如下的命令:
還有一種報常見的需求,把查找到的坐標(biāo)按照距離排序,并標(biāo)明和當(dāng)前用戶坐標(biāo)的距離,如圖8-12所示。
APP開發(fā)定位處理示意圖8-12標(biāo)注距離的附近的人
這個需求和前面的查找附近的人很相近,但是返回結(jié)果需要包含距離,MongoDB提供了geoNearmm命令來解決這個需求。geoNear的返回結(jié)果中包含了距離的信息。geoNear命令是基于db的command,而不是基于collection的find,也就是需要通過runcommand執(zhí)行。在查找集合location中,和坐標(biāo)113.392237,23.062429]的間距在500米范圍內(nèi)的坐標(biāo),同時顯示和目標(biāo)坐標(biāo)的距離,整個命令如下:
在上面的命令中.geoNear指定了要操作的集合,之所以在命令中沒出coordinate這個存儲了坐標(biāo)的Kev,是因?yàn)樵趥€集合中只能在一個key上建立地理坐標(biāo)索引,所以MougoDB會自動查找到這個索引。返回的結(jié)果是有序的,包含了類似下面的信息:
返回值中dis為20.表示用戶tom“113.392354,23062582”和當(dāng)前用戶jeff“113.392237,23062429’距離20米。
APP制作時怎樣進(jìn)行查找某個范圍內(nèi)的坐標(biāo)的開發(fā)?
MongoDB除了支持附近的搜索外,還支持使用$geoWithin操作符搜索某個范圍內(nèi)的坐標(biāo),這個操作符支持下面的3種類型
·$box矩形
·$center圓(平面)、$centerSphere圓(球面)
·$polygon多邊形
其中搜索$center圓(平面)、$centerSphere圓(球面)區(qū)域內(nèi)的坐標(biāo),和查找某個用戶附近的人(物)的坐標(biāo)是相似的,都是指定圓心的坐標(biāo),通過指定半徑得到圓的范圍。區(qū)別是前者返回的結(jié)果是無序的,后者返回的結(jié)果是有序的。
下面以$box矩形為側(cè)說明,假設(shè)如圖8-13所示,要在MongoDB集合中查找黑色矩形區(qū)域內(nèi)的坐標(biāo)。
APP開發(fā)定位示意圖8-13查找矩形區(qū)域內(nèi)的坐標(biāo)
定義一個矩形范圍的范圍,根據(jù)圖8-13指定矩形個對角的坐標(biāo)“113.39168,23062726”、“113.392848,23061973”,使用如下的查詢語句就能查找location集合中矩形區(qū)域內(nèi)的坐標(biāo):
好了,APP開發(fā)公司關(guān)于我們在項(xiàng)目制作時怎樣處理定位設(shè)置的經(jīng)驗(yàn)本文就分享到這里,博納網(wǎng)絡(luò)希望這類型的文章對您的工作有所幫助,如有需要,您也可以聯(lián)系我們在線客服,為您提供更完善的解答。謝謝關(guān)注。