georange

Georange 是一个帮助编码 geohash、解码 geohash、计算两点之间的距离以及生成纬度和經度范围(作为 geohash)的包,以帮助查询数据库(仅在 Firestore 上测试过)。

入门

您应该确保将 Georange 添加到您的 flutter 项目的依赖项中。

dependencies:
  georange: <latest-version>

然后您应该运行 flutter packages get

示例

example 文件夹中有一个详细的示例项目。

初始化

georange 导入您的 dart 文件并进行初始化

import 'package:georange/georange.dart';
GeoRange georange = GeoRange();

编码经纬度

此方法编码纬度和经度

var encoded = georange.encode(-1.2862368,36.8195783);
print(encoded);

打印 kzf0tvg5n

解码 Geohash

将 [geohash] 解码为一对纬度和经度。

Point decoded = georange.decode("kzf0tvg5n");
print(decoded);

打印
-1.2862372398376465
36.819584369659424

生成范围

  Range range = georange.geohashRange(-1.2921, 36.8219, distance: 10);
  print(range.lower);
  print(range.upper);

打印
kzf05k6hh
kzf30mptu

计算两点之间的距离

  Point point1 = Point(latitude: -4.0435, longitude: 39.6682); //Mombasa
  Point point2 = Point(latitude: -1.2921, longitude: 36.8219); // Nairobi

  var distance = georange.distance(point1, point2);
  print(distance);

打印
439.716 公里距离

在 Firestore 中使用

  1. 向 firestore 添加一个带有 geohash 字段或不同名称的文档
  final FirebaseFirestore _db;
  ...
  String myhash = georange.encode(-1.2862368,36.8195783);
  await _db.collection("locations").add({
    "geohash":myhash,
  })
  ...
  1. 查询 Firestore(正常运行的 firestore 查询)
final FirebaseFirestore _db;

GeoRange georange = GeoRange();

Range range = georange.geohashRange(currentLocation.latitude, currentLocation.longitude, distance:10);

QuerySnapshot snapshot = await _db
 .collection("locations")
 .where("geohash", isGreaterThanOrEqualTo: range.lower)
 .where("geohash", isLessThanOrEqualTo: range.upper)
 .limit(10)
 .get();

GitHub

https://github.com/cngeru/georange