地理位置操作

添加地理位置

为地理位置(geojson)类型字段添加数据和为普通字段添加数据的操作方式是一致的,可参考以下示例。

参数说明

参数类型必填说明
keyString在数据表中的类型必须是 geojson
valueGeoPoint 或 GeoPolygon-

geojson 类型字段支持使用 GeoPoint 或 GeoPolygon 类型数据进行赋值:

  • GeoPoint 表示坐标点,通过 new GeoPoint(longitude, latitude) 创建一个点,其中经度(longitude)在前,纬度(latitude)在后

  • GeoPolygon 表示地理形状,可以通过以下两种方法创建一个地理形状

  1. // 1. 直接使用数字
  2. GeoPolygon polygon = new GeoPolygon(
  3. new float[]{10f, 10f},
  4. new float[]{20f, 20f},
  5. new float[]{30f, 30f}
  6. );
  7. // 2. 借助 GeoPoint
  8. GeoPoint p1 = new GeoPoint(10f, 10f);
  9. GeoPoint p2 = new GeoPoint(10f, 10f);
  10. GeoPoint p3 = new GeoPoint(10f, 10f);
  11. GeoPolygon polygon = new GeoPolygon(p1, p2, p3);

请求示例

  1. Table geoTest = new Table("geo_test");
  2. Record record = geoTest.createRecord
  3. // 保存一个点
  4. record.put("location", new GeoPoint(10f, 20f)).save
  5. // 保存一个多边形
  6. record.put("location", new GeoPolygon(
  7. new GeoPoint(10f, 20f),
  8. new GeoPoint(10f, 20f),
  9. new GeoPoint(10f, 20f)
  10. )).save();

地理位置查询

include 在指定多边形集合中找出包含某一点的多边形

  1. // 查找当前用户所属小区
  2. Table neighbourhood = new Table("neighbourhood");
  3. // geoField 为 neighbourhood 表中定义地理位置的字段名,point 为用户所在位置,为 GeoPoint 类型
  4. Where where = new Where();
  5. where.include("geoField", point);
  6. Query query = new Query();
  7. query.put(where);
  8. neighbourhood.query(query);

withinCircle 在指定点集合中,查找包含在指定圆心和指定半径所构成的圆形区域中的点 (返回结果随机排序)

  1. // 查找在距离用户 radius 千米范围内的饭店
  2. Table restaurant = new Table("restaurant");
  3. // geoField 为 restaurant 表中定义地理位置的字段名
  4. Where where = new Where();
  5. where.withinCircle("geoField", point, radius);
  6. Query query = new Query();
  7. query.put(where);
  8. restaurant.query(query);

withinRegion 在指定点集合中,查找包含在以指定点为圆点,以最大和最小距离为半径,所构成的圆环区域中的点(返回结果按从近到远排序)

  1. // 查找距离用户 minDistance 千米外,maxDistance 千米内的所有饭店
  2. Table restaurant = new Table("restaurant");
  3. // geoField 为 restaurant 表中定义地理位置的字段名,point 为圆点,minDistance 不指定默认为 0
  4. Where where = new Where();
  5. where.withinRegion("geoField", point, maxDistance, minDistance);
  6. Query query = new Query();
  7. query.put(where);
  8. restaurant.query(query);

within 在指定点集合中,查找包含于指定的多边形区域的点

  1. // 查找某个小区内的所有饭店
  2. Table neighbourhood = new Table("neighbourhood");
  3. Table restaurant = new Table("restaurant");
  4. neighbourhood.fetchRecordInBackground(recordId, new BaseCallback<Record>() {
  5. @Override
  6. public void onSuccess(Record record) {
  7. // neighbourhoodGeoField 为 neighbourhood 表中定义地理位置的字段名(代表该小区的范围)
  8. // restaurantGeoField 为 restaurant 表中定义地理位置的字段名(代表该餐厅的坐标)
  9. Where where = new Where();
  10. where.withIn("restaurantGeoField", record.getGeoPolygo("neighbourhoodGeoField"));
  11. Query query = new Query();
  12. query.put(where);
  13. restaurant.query(query);
  14. }
  15. @Override
  16. public void onFailure(Throwable e) {}
  17. });