Flutter近距离哈希值检测插件proximity_hash的使用

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

Flutter近距离哈希值检测插件proximity_hash的使用

Dart Proximity Hash

Pub Version

Proximity Hash 生成一组geohashes,这些geohashes覆盖一个给定中心坐标和半径的圆形区域。Geohash是一种公开领域的地理编码系统,它将地理位置编码成简短的字母和数字字符串,并用作唯一标识符,用于在数据库中表示点数据。

例如,点 25.6953° S, 54.4367° W 将转换为 6g3mc626

Geohash

Proximity hash 还包含了一个从 dart_geohash 分支出来的geohash库,因为原来的库没有积极维护。

import 'package:proximity_hash/geohash.dart';

安装

要获取此插件,请在 pubspec.yaml 文件中添加 proximity_hash 作为依赖项。例如:

dependencies:
  proximity_hash: ^1.1.0

使用方法

要获取距离点 25.6953° S, 54.4367° W 半径为 5000 米内的所有geohashes,并且精度为 3,只需导入库并调用 createGeohashes()。精度决定了返回的geohashes长度和数量。例如,精度为 3 返回长度为 3 的geohashes。

import 'package:proximity_hash/proximity_hash.dart';

List<String> proximityGeohashes = createGeohashes(48.864716, 2.349014, 5000, 3);

// proximityGeohashes == ["u0d","u09"]

性能

以下是 createGeohashes 在不同精度下的性能基准测试,半径为 1000 米。从精度 9 开始,性能可能会成为限制因素。请注意,较大的半径也会降低性能。

精度 时间
1 .0068 sec
2 .0068 sec
3 .0070 sec
4 .0070 sec
5 .0070 sec
6 .0079 sec
7 .0232 sec
8 .1664 sec
9 4.996 sec
10 153.5 sec

示例代码

以下是一个完整的示例代码,展示了如何使用 proximity_hash 插件来检测近距离的geohashes。

import 'package:proximity_hash/proximity_hash.dart';

void main() {
  // 定义一些点
  List<List<double>> points = [
    [48.864716, 2.349014],
    [48.864716, 3.349014],
    [58.864716, 2.349014]
  ];

  // 获取距离48.864716, 2.349014半径为5000米内的geohashes,精度为3
  List<String> proximityGeohashes = createGeohashes(48.864716, 2.349014, 5000, 3);
  
  // 检查哪些点在5000米范围内
  for (var g in points) {
    if (proximityGeohashes.contains(convertToGeohash(0.0, 0.0, g[0], g[1], 3))) {
      print('The coordinates ${g[0].toString()},${g[1].toString()} are within 5000 meters of 48.864716, 2.349014');
    }
  }

  // 获取在一个矩形范围内的geohashes,精度为3
  List<String> proximityGeohashesBox = createGeohashesBoundingBox(47.864716, 1.349014, 49.864716, 3.349014, 3);
  for (var g in proximityGeohashesBox) {
    print('Geohash $g is in box 48.864716, 49.864716, 2.349014, 3.349014 with precision 3');
  }
}

注意事项

  • 性能问题:当精度较高或半径较大时,计算时间会显著增加。
  • 贡献和支持:如果您发现任何问题、错误或有新的功能需求,可以在 GitHub 上提交issue。如果您想为插件做贡献,可以提交pull request。

希望这个帖子能帮助您更好地理解和使用 proximity_hash 插件!


更多关于Flutter近距离哈希值检测插件proximity_hash的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter近距离哈希值检测插件proximity_hash的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,我可以为你提供一个关于如何使用 proximity_hash 插件的示例代码。proximity_hash 插件可以用于生成和比较设备间的近距离哈希值,这在需要检测设备接近度时非常有用。

首先,确保你的 Flutter 项目已经添加了对 proximity_hash 插件的依赖。在你的 pubspec.yaml 文件中添加以下依赖:

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

然后,运行 flutter pub get 来获取依赖。

接下来是一个简单的示例代码,展示了如何使用 proximity_hash 插件来生成和比较哈希值:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Proximity Hash Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ProximityHashScreen(),
    );
  }
}

class ProximityHashScreen extends StatefulWidget {
  @override
  _ProximityHashScreenState createState() => _ProximityHashScreenState();
}

class _ProximityHashScreenState extends State<ProximityHashScreen> {
  String? deviceHash;
  String? comparedHash;
  bool isHashMatch = false;

  @override
  void initState() {
    super.initState();
    // Generate device hash
    _generateDeviceHash();
  }

  Future<void> _generateDeviceHash() async {
    try {
      String hash = await ProximityHash.generateHash();
      setState(() {
        deviceHash = hash;
      });
      print("Generated Hash: $hash");
    } catch (e) {
      print("Error generating hash: $e");
    }
  }

  Future<void> _compareHashes(String otherHash) async {
    try {
      bool match = await ProximityHash.compareHashes(deviceHash!, otherHash);
      setState(() {
        comparedHash = otherHash;
        isHashMatch = match;
      });
      print("Hashes match: $match");
    } catch (e) {
      print("Error comparing hashes: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Proximity Hash Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text('Device Hash:'),
            Text(deviceHash ?? 'Generating...'),
            SizedBox(height: 20),
            Text('Compare Hash:'),
            TextField(
              decoration: InputDecoration(border: OutlineInputBorder()),
              onSubmitted: (value) {
                _compareHashes(value);
              },
            ),
            SizedBox(height: 20),
            Text('Hashes match: ${isHashMatch ? 'Yes' : 'No'}'),
            if (comparedHash != null)
              Text('Compared Hash: $comparedHash'),
          ],
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们创建了一个 Flutter 应用,并在首页上展示了如何使用 proximity_hash 插件。
  2. initState 方法中,我们调用 _generateDeviceHash 来生成设备的哈希值。
  3. 用户可以在 TextField 中输入另一个哈希值,点击提交后,会调用 _compareHashes 方法来比较两个哈希值。
  4. 比较结果会显示在页面上。

请注意,由于 proximity_hash 插件的工作原理依赖于设备的硬件特性(如蓝牙和 Ultra Wideband),因此在实际使用中,可能需要在设备上启用相应的硬件功能,并且结果可能会受到环境因素的影响。

回到顶部