繁体   English   中英

如何从 Firestore 中对 Flutter 中的位置列表进行排序?

[英]How to sort list of locations in flutter from Firestore?

我的 firebase firestore 数据库中有一个名为“bakeries”的集合,该集合中有一系列文档,每个文档都有一个地理点字段,我在其中输入了它们的纬度和经度。 为了访问它们并查看离用户最近的面包店,我创建了一个 ListView.builder。 但是,我正在尝试根据与用户当前位置相关的地理点对 BakeryList 进行排序,但它不起作用。 我试过这个:

bakeryList.sort((a, b){
  return a['geopoint'].compareTo(myLocation);
});

但它不会返回最近的面包店。 任何想法将不胜感激!

  final userLocation = Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);

StreamSubscription<QuerySnapshot> subscription;
  List <DocumentSnapshot> bakeryList;

  final Query collectionReference = Firestore.instance.collection(('bakeries'));

  @override
  void initState() {
    super.initState();

    final myLocation = Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);

    subscription = collectionReference.snapshots().listen((data) {
      setState(() {
        bakeryList = data.documents;

      });
    });

  }



  @override
  Widget build(BuildContext context) {


    return bakeryList != null ?

    ListView.builder(

            itemCount: bakeryList.length,
            itemBuilder: (context, index){

          String imgPath = bakeryList[index].data['image'];
          String bakeryTextPath = bakeryList[index].data['name'];
          String locationNamePath = bakeryList[index].data['location name'];
          GeoPoint geoPointPath = bakeryList[index].data['geopoint'];
          final geolocation = Text('${geoPointPath.latitude}, ${geoPointPath.longitude}');

          return BakeryCard(
            etaText: '${geoPointPath.latitude}, ${geoPointPath.longitude}',
            locationText: locationNamePath,
            merchantText: bakeryTextPath,
            assetImage: Image.network(imgPath),

            function: (){});
        })
        : Center(child: CircularProgressIndicator(),
    );

  }

我认为您的问题在于您的排序功能:

bakeryList.sort((a, b){
  return a['geocode'].compareTo(myLocation);
});

在这里,您只是将第一家面包店的位置与用户的位置进行比较。 我认为你真正想要的是:

bakeryList.sort((a, b){
  return distance(a['geocode'], myLocation).compareTo(distance(b['geocode'], myLocation));
});

其中函数distance为您提供两点之间的距离。

除了Diviloper 的回答,请使用以下功能按距离对项目进行排序:

    double calculateDistance(lat1, lon1, lat2, lon2) {
    var p = 0.017453292519943295;
    var c = cos;
    var a = 0.5 -
        c((lat2 - lat1) * p) / 2 +
        c(lat1 * p) * c(lat2 * p) * (1 - c((lon2 - lon1) * p)) / 2;
    return 12742 * asin(sqrt(a));
  }

这将确保准确的结果。

注意:导入以下

import 'dart:math' show cos, sqrt, asin;

抱歉,这不是您问题的直接答案,但您可能想尝试使用 GeoFlutterFire。 它针对此类数据进行了超级优化,获取最近位置的列表非常简单。 链接到包GeoFlutterFire

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM