我有一组带有纬度和经度字段的 Firebase 位置。一旦在我的 flutter Android 应用程序中按下按钮,它将测量用户与不同位置之间的距离,并将显示在 UI 中。以下是 Streambuilder 的代码。
StreamBuilder(
stream: FirebaseFirestore.instance.collection("New Shop").snapshots(),
builder: (context, snapshot) {
if (snapshot.hasData) {
final List<LatLng> latLen = <LatLng>[];
for (int i = 0; i < snapshot.data!.docs.length; i++) {
latLen.add(LatLng(snapshot.data!.docs[i].get('lat'),
snapshot.data!.docs[i].get('long')));
}
loadData() async {
for (int i = 0; i < snapshot.data!.docs.length; i++) {
markers.add(Marker(
markerId: MarkerId(i.toString()),
position: latLen[i],
infoWindow: InfoWindow(
title: snapshot.data!.docs[i].get('name'),
),
));
}
}
loadData();
下面是更新用户当前位置的代码。
Future<Position> _determinePosition() async {
bool serviceEnabled;
LocationPermission permission;
serviceEnabled = await Geolocator.isLocationServiceEnabled();
if (!serviceEnabled) {
return Future.error('Location services are disabled');
}
permission = await Geolocator.checkPermission();
if (permission == LocationPermission.denied) {
permission = await Geolocator.requestPermission();
if (permission == LocationPermission.denied) {
return Future.error("Location permission denied");
}
}
if (permission == LocationPermission.deniedForever) {
return Future.error('Location permissions are permanently denied');
}
Position position = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high);
userLatLng = LatLng(position.latitude, position.longitude);
return position;
}
下面是显示距离的代码。
Expanded(
child: ListTile(
horizontalTitleGap: 10,
title: Text(
shop['name'],
maxLines: 1,
),
subtitle: Text(
"${calculateDistance(userLatLng.latitude, userLatLng.longitude, shop['lat'].toDouble(), shop['long'].toDouble()).toStringAsFixed(2)}km from you\n${shop['address']}",
maxLines: 2,
),
isThreeLine: true,
contentPadding: const EdgeInsets.all(0),
),
),
我想按当前用户的距离对位置进行排序,但是我无法使用 orderBy,因为文档中没有距离字段,并且由于每个用户的位置不同,排序的列表对于每个用户来说都是唯一的。
为此,您可以使用 距离矩阵API
您可以使用 GeoFlutterFire 库:
GeoFlutterFire 是一个开源库,允许您存储和 根据地理位置查询一组键...
GeoFlutterFire 在您的应用程序中以自己的格式存储数据 Firestore 数据库。这允许您现有的数据格式和安全性 规则保持不变,同时仍为您提供简单的 地理查询的解决方案。”
请注意,在当前版本中,您无法使用
orderBy()
(请参阅文档末尾的“限制”部分),但您可以在前端对结果进行排序。