GEO Point 的使用

GEO Point 是什么

在 APP 开发的过程中, 我们经常会遇到在针对于地理坐标的一些问题. 而现实的地理坐标在我们的 AVOS Cloud 上提供一个对应, 我们把它称之为 GEO Point. 每一个 GEO Point 只包含 2 个信息, 就是它的经度 (longtitude) 与纬度 (latitude).

下面我们建立一个北纬 40 度, 东经 30 度的点:

JavaScript:

var point = new AV.GeoPoint({latitude: 40.0, longitude: -30.0});

(JavaScript 的 SDK 下载到 这里 。)

这只是一个代表这坐标信息的点而已, 而我们需要把这个点关联到对象上去, 这样才构成了一个有地理位置信息的对象

JavaScript:

placeObject.set("location", point);

这样我们就为 placeObject 这个对象加入了地理位置信息了. 在之后我们可以用 SDK 提供的功能进行查找.

做一个” 查找附近的人” 的功能

有了 AVOS Cloud 以后, 您可以轻松地实现类似于微信中:” 查找附近的人” 这种功能. 而这并不需要您做太多的工作, 大部分事情都可以交给 AVOS Cloud 来做.

为每个用户加入地理位置信息

为了提供这项功能, 当然确定用户的地理位置是一定需要的, 获取用户当前的地理位置需要根据用户所用的设备来调用相应设备的 API, 以获取当前用户的地理位置信息. 然后如果需要的话应该将其转换为经度和纬度, 我们这里假设用户在东经 40 度北纬 50 度的地方, 然后设定当前用户的地理位置, 同时为了让其他用户能得到当前用户的地址, 我们应该更新当前用户的地理信息:

var point = new AV.GeoPoint({latitude: 40.0, longitude: -30.0});
var currentUser = AV.User.current();
if (currentUser) {
    currentUser.set("location", point);
    currentUser.save();
} else {
    // user signup or login
}

查找当前用户附近的用户

有了用户的地理信息之后, 我们就可以提供一个搜索了, 这一点可以用 AVOS Cloud 带有的地理查询功能来做:

var query = new AV.Query(Parse.User);
query.near("location", point);
query.limit(10);
query.find({
  success: function(users) {
  }
});

AVOS Cloud 对于 near 类型的查询会按距离由近到远进行排序, 这样我们非常轻松地就找到了离我们的当前用户距离最近的十个用户了.

GEO Point 还有哪些查询方式?

上面的例子中我们限定了返回 10 个结果, 但是如果我们只想查找同城的用户的话怎么办呢?

可以用 withinKilometers 方式来限定我们的查询, 或者说是用 withinGeoBox 这个方法把结果限定在一个矩形之内.
withinKilometers 接受一个距离参数, 可以限定 query 的距离范围. 而 withinGeoBox 接受 2 个 GEO Point, 这两个点代表了矩形的对角的两个点, 这样就可以把查询限定在一个矩形范围内了.