Flutter近距离哈希值检测插件proximity_hash的使用
Flutter近距离哈希值检测插件proximity_hash的使用
Dart Proximity Hash
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
更多关于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'),
],
),
),
);
}
}
在这个示例中:
- 我们创建了一个 Flutter 应用,并在首页上展示了如何使用
proximity_hash
插件。 - 在
initState
方法中,我们调用_generateDeviceHash
来生成设备的哈希值。 - 用户可以在
TextField
中输入另一个哈希值,点击提交后,会调用_compareHashes
方法来比较两个哈希值。 - 比较结果会显示在页面上。
请注意,由于 proximity_hash
插件的工作原理依赖于设备的硬件特性(如蓝牙和 Ultra Wideband),因此在实际使用中,可能需要在设备上启用相应的硬件功能,并且结果可能会受到环境因素的影响。