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

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

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

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

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

數據結構需求

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

數據查詢實例

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

如果我們希望查詢距離當前位置,1000米 ~ 2000米的數據,則可以執行這樣的命令

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 方法獲取當前的地址信息,並將其作爲參數設置在這裏。

minDistance 則是距離中心點的最小距離,單位是米,所以這裏將其設置爲 1000。類似的,maxDistance 則是距離中心點的最大距離,單位也是米,所以這裏將其設置爲 2000。

通過這樣的方法,我們就可以查詢出數據了。

在我們去做一些基於地理位置的應用的時候,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 幾個命令。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章