雲開發數據庫命令之地理位置查詢

在進行雲開發的數據更新的時候,咱們能夠進行不一樣條件的查詢,從而提高咱們更新的效率。在雲開發支持了 Geo Point 等相關數據類型之後,咱們能夠用雲開發實現多種不一樣地理位置的數據存儲和利用,對於咱們開發基於地理位置的小程序來講,有很大的幫助。數據庫

今天的課程中,咱們來介紹小程序數據更新命令中的「地理位置查詢」命令。小程序

geoNear:查詢特定點附近的數據

查詢特定點附近的數據能夠說是咱們在進行應用開發時,最爲經常使用的功能,它能夠應用於諸如查詢當前用戶座標周圍的店鋪查詢距離我最近的公交站等場景,這個時候,咱們須要使用 geoNear 來進行數據庫查詢。數據結構

數據結構需求

若是你想要使用 geoNear,則要求你在數據庫中存儲的數據對於地理位置的存儲是基於 db.Geo.Point 進行的,這樣你就能夠完成使用 geoNear 進行查詢。spa

數據查詢實例

假設咱們當前數據庫內數據的結構是這樣的,每個數據下有一個 point 屬性,這個屬性是經過 db.Geo.Point 添加的。3d

若是咱們但願查詢距離當前位置,1000米 ~ 2000米的數據,則能夠執行這樣的命令code

const db = wx.cloud.database()
const _ = db.command
db.collection('items').where({
  location: _.geoNear({
    geometry: db.Geo.Point(113.323809, 23.097732),
    minDistance: 1000,
    maxDistance: 2000,
  })
}).get()
複製代碼

這裏的 geometry 中的 Point 的數據是獲取到的當前地理位置信息,它必須是 db.Geo.Point 類型的,你能夠經過小程序的 wx.getLocation 方法獲取當前的地址信息,並將其做爲參數設置在這裏。cdn

minDistance 則是距離中心點的最小距離,單位是米,因此這裏將其設置爲 1000。相似的,maxDistance 則是距離中心點的最大距離,單位也是米,因此這裏將其設置爲 2000。對象

經過這樣的方法,咱們就能夠查詢出數據了。blog

在咱們去作一些基於地理位置的應用的時候,db.command.geoNear 能夠很大程度上簡化咱們的開發。開發

geoWithin:查詢特定區域內的數據

在開發地理位置應用時,除了基於某一個點的位置進行查詢之外,咱們還會查詢某一個區域內的數據,好比查詢北京市昌平區內的全部的酒吧查詢深圳南山區內全部的博物館,這樣的需求也是切實存在,而且十分常見的需求。這個時候,咱們能夠考慮,使用 geoWithin 來進行數據查詢。

數據結構需求

若是你想要使用 geoWithin,則要求你在數據庫中存儲的數據對於地理位置的存儲是基於 db.Geo.Point 進行的,這樣你就能夠完成使用 geoWithin 進行查詢。

數據查詢實例

假設咱們當前數據庫內數據的結構是這樣的,每個數據下有一個 point 屬性,這個屬性是經過 db.Geo.Point 添加的。

若是咱們但願查詢在東經 112 度 ~ 東經 114 度,北緯 22 度 到 北緯 24 度範圍內的數據,則能夠執行這樣的數據查詢

const db = wx.cloud.database()
const _ = db.command
const { Point, LineString, Polygon } = db.Geo
db.collection('items').where({
  location: _.geoWithin({
    geometry: Polygon([
      LineString([
        Point(112, 22),
        Point(112, 24),
        Point(114, 24),
        Point(114, 22),
        Point(112,22)
      ])
    ]),
  })
}).get()
複製代碼

咱們經過 PolygonLineString 構建出了一個正方形,從而實現了查詢一個特定的正方形區域內的數據。

若是你但願查詢一個其餘形狀的範圍內的數據,只須要傳入多個 Point 的數據就能夠完成,好比若是你要查詢一個五邊形內部的數據,也只需在構建 LineString 時,傳入 6 個 Point的數據便可。

爲何五邊形倒是 6 個 Point 呢?

由於在雲開發中,若是你要構建一個多邊形,則須要使得整個多邊形是閉合的,也就是說,你的起始點是同樣的,所以,若是你想要構建一個四邊形,則須要五個點。若是是構建五邊形,則是六個點。

geoIntersects:查詢與特定區域相交的數據

geoIntersects 是用於查詢全部數據中和給定數據相交的數據,咱們能夠將其用做判斷某一些特定的點、線、面是否在一個特定區域內。舉個例子,假設你已經有了用戶當前的活動範圍,好比某一條街道,那麼你能夠基於 geoIntersects 來構建一條線,並基於這條線查詢,全部數據中,是否有數據與這個線相交,若是相交,則說明對應的數據點是在用戶所在的街道上。你就能夠將這個數據告訴用戶,讓用戶去找這些點。

相比於 geoWithingeoIntersects 對於當前用戶的位置數據更爲隨意,支持 PointLineStringMultiPointMultiLineStringPolygonMultiPolygon 等多種不一樣的數據結構,在進行查詢的時候,更加的方便。

數據結構需求

若是你想要使用 geoIntersects,則要求你在數據庫中存儲的數據對於地理位置的存儲是基於 db.Geo.Point 進行的,這樣你就能夠完成使用 geoIntersects 進行查詢。

數據查詢實例

假設咱們當前數據庫內數據的結構是這樣的,每個數據下有一個 point 屬性,這個屬性是經過 db.Geo.Point 添加的。

若是咱們但願查詢在東經 112 度 ~ 東經 114 度,北緯 22 度 到 北緯 24 度範圍內的數據,則能夠執行這樣的數據查詢

const db = wx.cloud.database()
const _ = db.command
const { Point, LineString, Polygon } = db.Geo
db.collection('items').where({
  location: _.geoIntersects({
    geometry: Polygon([
      LineString([
        Point(112, 22),
        Point(112, 24),
        Point(114, 24),
        Point(114, 22),
        Point(112,22)
      ])
    ]),
  })
}).get()
複製代碼

咱們經過 PolygonLineString 構建出了一個正方形,從而實現了查詢一個特定的正方形區域內的數據。

若是你但願查詢一個其餘形狀的範圍內的數據,只須要傳入多個 Point 的數據就能夠完成,好比若是你要查詢一個五邊形內部的數據,也只需在構建 LineString 時,傳入 6 個 Point的數據便可。

固然,在使用時,你能夠根據本身的實際狀況,設定不一樣的圖形類型,做爲數據庫查詢的對象,完成本身的數據查詢需求。

總結

這節課,咱們介紹了 geoNeargeoWithingeoIntersects 三個 API,幫助你們理解其各自在什麼樣的場景下使用,下一節課,咱們將介紹 eq、neq、lt、lte、gt、gte 幾個命令。

相關文章
相關標籤/搜索