在進行雲開發的數據更新的時候,我們可以進行不同條件的查詢,從而提升我們更新的效率。在雲開發支持了 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()
我們通過 Polygon
和 LineString
構建出了一個正方形,從而實現了查詢一個特定的正方形區域內的數據。
如果你希望查詢一個其他形狀的範圍內的數據,只需要傳入多個 Point
的數據就可以完成,比如如果你要查詢一個五邊形內部的數據,也只需在構建 LineString 時,傳入 6 個 Point的數據即可。
爲什麼五邊形卻是 6 個 Point 呢?因爲在雲開發中,如果你要構建一個多邊形,則需要使得整個多邊形是閉合的,也就是說,你的起始點是一樣的,因此,如果你想要構建一個四邊形,則需要五個點。如果是構建五邊形,則是六個點。
geoIntersects:查詢與特定區域相交的數據
geoIntersects
是用於查詢所有數據中和給定數據相交的數據,我們可以將其用作判斷某一些特定的點、線、面是否在一個特定區域內。舉個例子,假設你已經有了用戶當前的活動範圍,比如某一條街道,那麼你可以基於 geoIntersects
來構建一條線,並基於這條線查詢,所有數據中,是否有數據與這個線相交,如果相交,則說明對應的數據點是在用戶所在的街道上。你就可以將這個數據告訴用戶,讓用戶去找這些點。
相比於 geoWithin
,geoIntersects
對於當前用戶的位置數據更爲隨意,支持 Point
、LineString
、MultiPoint
、 MultiLineString
、 Polygon
、 MultiPolygon
等多種不同的數據結構,在進行查詢的時候,更加的方便。
數據結構需求
如果你想要使用 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()
我們通過 Polygon
和 LineString
構建出了一個正方形,從而實現了查詢一個特定的正方形區域內的數據。
如果你希望查詢一個其他形狀的範圍內的數據,只需要傳入多個 Point
的數據就可以完成,比如如果你要查詢一個五邊形內部的數據,也只需在構建 LineString 時,傳入 6 個 Point的數據即可。
當然,在使用時,你可以根據自己的實際情況,設定不同的圖形類型,作爲數據庫查詢的對象,完成自己的數據查詢需求。
總結
這節課,我們介紹了 geoNear
、geoWithin
、geoIntersects
三個 API,幫助大家理解其各自在什麼樣的場景下使用,下一節課,我們將介紹 eq、neq、lt、lte、gt、gte 幾個命令。