使用当前用户位置按距离对 Firebase 位置进行排序

问题描述 投票:0回答:2

我有一组带有纬度和经度字段的 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,因为文档中没有距离字段,并且由于每个用户的位置不同,排序的列表对于每个用户来说都是唯一的。

flutter firebase google-cloud-platform google-cloud-firestore
2个回答
0
投票

为此,您可以使用 距离矩阵API


0
投票

您可以使用 GeoFlutterFire 库

GeoFlutterFire 是一个开源库,允许您存储和 根据地理位置查询一组键...

GeoFlutterFire 在您的应用程序中以自己的格式存储数据 Firestore 数据库。这允许您现有的数据格式和安全性 规则保持不变,同时仍为您提供简单的 地理查询的解决方案。”

请注意,在当前版本中,您无法使用

orderBy()
(请参阅文档末尾的“限制”部分),但您可以在前端对结果进行排序。

© www.soinside.com 2019 - 2024. All rights reserved.