Flutter地理范围或区域选择插件georange的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter地理范围或区域选择插件georange的使用

简介

georange 是一个用于编码和解码 geohashes、计算两点之间的距离以及生成 geohashes 范围的 Flutter 插件。它主要用于帮助查询数据库(目前仅测试了 Firestore)。

特性

  • 编码和解码 geohashes
  • 计算两点之间的距离
  • 生成经纬度范围的 geohashes
  • GeoFlutterFire 影响

许可证

版本

  • 最新版本可以在 Pub 上查看

开始使用

添加依赖

在你的 pubspec.yaml 文件中添加 georange 依赖:

dependencies:
  georange: ^<latest-version>

然后运行以下命令来获取依赖包:

flutter packages get

初始化

在 Dart 文件中导入 georange 并初始化:

import 'package:georange/georange.dart';

GeoRange georange = GeoRange();

示例

编码经纬度

将经纬度编码为 geohash:

var encoded = georange.encode(-1.2862368, 36.8195783);
print(encoded); // 输出: kzf0tvg5n

解码 geohash

将 geohash 解码为经纬度:

Point decoded = georange.decode("kzf0tvg5n");
print(decoded.latitude); // 输出: -1.2862372398376465
print(decoded.longitude); // 输出: 36.819584369659424

生成范围

生成指定距离内的 geohash 范围:

Range range = georange.geohashRange(-1.2921, 36.8219, distance: 10);
print(range.lower); // 输出: kzf05k6hh
print(range.upper); // 输出: 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 的结合使用

添加文档

在 Firestore 中添加包含 geohash 字段的文档:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:georange/georange.dart';

final FirebaseFirestore _db = FirebaseFirestore.instance;
GeoRange georange = GeoRange();

void main() async {
  String myhash = georange.encode(-1.2862368, 36.8195783);
  await _db.collection("locations").add({
    "geohash": myhash,
  });
}

查询 Firestore

查询 Firestore 中的文档:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:georange/georange.dart';

final FirebaseFirestore _db = FirebaseFirestore.instance;
GeoRange georange = GeoRange();

void main() async {
  // 假设 currentLocation 是当前的位置
  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();

  for (var doc in snapshot.docs) {
    print(doc.data());
  }
}

完整示例

以下是一个完整的示例代码,展示了如何使用 georange 插件进行编码、解码、生成范围和计算距离:

import 'package:georange/georange.dart';

void main() {
  GeoRange georange = GeoRange();

  // 编码经纬度
  var encoded = georange.encode(-1.2862368, 36.8195783);
  print('Encoded geohash: $encoded'); // 输出: kzf0tvg5n

  // 解码 geohash
  Point decoded = georange.decode("kzf0tvg5n");
  print('Decoded latitude: ${decoded.latitude}'); // 输出: -1.2862372398376465
  print('Decoded longitude: ${decoded.longitude}'); // 输出: 36.819584369659424

  // 计算两点之间的距离
  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 between two points: $distance km'); // 输出: 439.716

  // 生成范围
  Range range = georange.geohashRange(-1.2921, 36.8219, distance: 10);
  print('Lower bound of range: ${range.lower}'); // 输出: kzf05k6hh
  print('Upper bound of range: ${range.upper}'); // 输出: kzf30mptu
}

希望这些内容能帮助你更好地理解和使用 georange 插件!如果有任何问题,欢迎随时提问。


更多关于Flutter地理范围或区域选择插件georange的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter地理范围或区域选择插件georange的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用georange插件来选择地理范围或区域的代码示例。georange插件允许用户在地图上选择一个区域,并返回该区域的边界坐标。

首先,确保你已经在pubspec.yaml文件中添加了georange依赖:

dependencies:
  flutter:
    sdk: flutter
  georange: ^最新版本号  # 请替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来,你可以按照以下步骤在你的Flutter应用中使用georange插件:

1. 导入必要的包

在你的Dart文件中导入georange包:

import 'package:flutter/material.dart';
import 'package:georange/georange.dart';

2. 创建一个地图页面来选择地理范围

class MapScreen extends StatefulWidget {
  @override
  _MapScreenState createState() => _MapScreenState();
}

class _MapScreenState extends State<MapScreen> {
  late GeoRangeController _geoRangeController;

  @override
  void initState() {
    super.initState();
    _geoRangeController = GeoRangeController();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Geo Range Selector'),
      ),
      body: GeoRangePicker(
        controller: _geoRangeController,
        apiKey: 'YOUR_GOOGLE_MAPS_API_KEY',  // 请替换为你的Google Maps API Key
        onPolygonCreated: (List<LatLng> polygon) {
          // 用户完成多边形创建后的回调
          print('Selected polygon: $polygon');
          // 这里可以保存或使用多边形数据
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 重置多边形选择
          _geoRangeController.reset();
        },
        tooltip: 'Reset',
        child: Icon(Icons.clear),
      ),
    );
  }
}

3. 在你的应用中导航到地图页面

假设你有一个主页面,可以在其中添加一个按钮来导航到地图页面:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Geo Range Selector Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Demo App'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => MapScreen()),
              );
            },
            child: Text('Select Geo Range'),
          ),
        ),
      ),
    );
  }
}

4. 运行应用

确保你已经正确配置了Google Maps API,并且API Key是有效的。然后运行你的Flutter应用,点击按钮导航到地图页面,你就可以在地图上选择一个地理范围了。

注意事项

  • 确保你的Google Maps API Key已经启用了相关的API服务,比如Google Maps JavaScript API和Places API(如果需要的话)。
  • 在实际发布应用时,不要将API Key硬编码在代码中,而是使用更安全的方式来管理你的API Key,比如使用环境变量或Flutter的配置文件。

这样,你就可以在你的Flutter应用中使用georange插件来选择地理范围或区域了。

回到顶部