GeoFire结果按距离无序返回 [英] GeoFire Results Coming Back Unordered By Distance

查看:61
本文介绍了GeoFire结果按距离无序返回的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用:

geofire#4.1.2 bower_components\geofire
└── firebase#3.9.0

我编写了此函数以根据用户的接近程度返回地标列表:

I wrote this function to return a list of landmarks based on user proximity:

GetAllLandmarksByUserLocation(ref, ref_locations, properties, user_latitude, user_longitude, 
        user_radius)
    {  
        const landmarkGeoFire = new GeoFire(ref_locations);

        var geoQuery = landmarkGeoFire.query({
            center: [user_latitude, user_longitude], 
            radius: user_radius
        });

        return new Promise(function(resolve,reject)
        {
            var locations = [];
            var onKeyEnteredRegistration = geoQuery.on("key_entered", 
            function (key, coordinates, distance) {
                    var location = {}; 
                    location.key = key;
                    location.latitude = coordinates[0];
                    location.longitude = coordinates[1];
                    location.distance = distance;
                    locations.push(location);       
            });
            var attributes = [];
            var onReadyRegistration = geoQuery.on("ready", function() {
                ref.on('value', function (refsSnap) {
                       refsSnap.forEach((refSnap) => {
                            var list = refSnap;
                            locations.forEach(function(locationSnap) 
                            {
                                //console.log(refSnap.key, '==', locationSnap.key);
                                // brute force approach, rework this later
                                if (refSnap.key == locationSnap.key) 
                                {
                                    var attribute = {};
                                    for(var i=0; i<=properties.length-1; i++)
                                    {
                                        if(properties[i] == 'key') {
                                            attribute[properties[i]] = refSnap.key;
                                            continue;
                                        }
                                        attribute[properties[i]] = list.child(properties[i]).val();
                                    }
                                    attribute['latitude'] = locationSnap.latitude;
                                    attribute['longitude'] = locationSnap.longitude;
                                    attribute['distance'] =  locationSnap.distance;
                                    attributes.push(attribute);    
                                } // refSnap.key == locationSnap.key
                            }); // locations.forEach
                        }); // refsSnap.forEach
                        resolve(attributes);
                    }); // ref.on
            }); // onreadyregistration
        }); // Promise
    }

但是,列表不会按距离顺序返回.我发现这特别奇怪,因为过去的结果是按距离排序的.从那以后我所做的事情:

However, the list does not come back ordered by distance. I am finding this particularly odd as the results used to come back ordered by distance. Things I have done since:

  • 添加了Swagger
  • 更改了项目结构以符合OpenAPI规范.
  • 添加了凉亭
  • 重新安装了geofire和firebase

所以,我知道这段代码过去已经起作用".

So, I know this code "has worked" in the past.

这是我的Firebase RTDB结构:

Here is my Firebase RTDB structure:

对于输入:

user_latitude = 40.769841

user_latitude = 40.769841

user_longitude = -73.964306

user_longitude = -73.964306

user_radius = 225

我现在得到以下结果:

[
  {
    "key": "-L8AURBnFy01EZVekPnR",
    "building": "753",
    "street": "York Avenue",
    "category": 0,
    "closing": "6 PM",
    "email": "cornell@somewhere.com",
    "name": "Weill Cornell",
    "opening": "8 AM",
    "phone": "212-555-1212",
    "postal": 10021,
    "timestamp": "Wed Mar 21 2018 22:15:55 GMT-0400 (Eastern Daylight Time)",
    "type": 4,
    "web": "http://www.weillcornell.com",
    "latitude": 40.765982,
    "longitude": -73.956045,
    "distance": 0.817387865219758
  },
  {
    "key": "-L8AUdrIysiTYr0RUDV_",
    "building": "753",
    "street": null,
    "category": 0,
    "closing": "6 PM",
    "email": "cornell@somewhere.com",
    "name": "Weill Cornell",
    "opening": "8 AM",
    "phone": "212-555-1212",
    "postal": 10021,
    "timestamp": "Wed Mar 21 2018 22:16:51 GMT-0400 (Eastern Daylight Time)",
    "type": 4,
    "web": "http://www.weillcornell.com",
    "latitude": 40.765982,
    "longitude": -73.956045,
    "distance": 0.817387865219758
  },
  {
    "key": "-L8AUeEayBJKU3y6Hd4e",
    "building": "753",
    "street": null,
    "category": 0,
    "closing": "6 PM",
    "email": "cornell@somewhere.com",
    "name": "Weill Cornell",
    "opening": "8 AM",
    "phone": "212-555-1212",
    "postal": 10021,
    "timestamp": "Wed Mar 21 2018 22:16:53 GMT-0400 (Eastern Daylight Time)",
    "type": 4,
    "web": "http://www.weillcornell.com",
    "latitude": 40.765982,
    "longitude": -73.956045,
    "distance": 0.817387865219758
  },
  {
    "key": "-L8AVW50fx3cTwn-DrIQ",
    "building": "753",
    "street": "Minetta Lane",
    "category": 0,
    "closing": "6 PM",
    "email": "support@southebys.com",
    "name": "Southebys",
    "opening": "8 AM",
    "phone": "212-555-1212",
    "postal": 10021,
    "timestamp": "Wed Mar 21 2018 22:20:38 GMT-0400 (Eastern Daylight Time)",
    "type": 4,
    "web": "http://www.southebys.com",
    "latitude": 40.766372,
    "longitude": -73.953803,
    "distance": 0.9649556738877696
  },
  {
    "key": "-L8AV_nVSAzMxdAXJb-L",
    "building": "753",
    "street": null,
    "category": 0,
    "closing": "6 PM",
    "email": "support@southebys.com",
    "name": "Southebys",
    "opening": "8 AM",
    "phone": "212-555-1212",
    "postal": 10021,
    "timestamp": "Wed Mar 21 2018 22:20:57 GMT-0400 (Eastern Daylight Time)",
    "type": 4,
    "web": "http://www.southebys.com",
    "latitude": 40.766372,
    "longitude": -73.953803,
    "distance": 0.9649556738877696
  },
  {
    "key": "-L8AWqfH3q4dZcrFMc6F",
    "building": "753",
    "street": null,
    "category": 0,
    "closing": "6 PM",
    "email": "support@helmsley.com",
    "name": "helmsley",
    "opening": "8 AM",
    "phone": "212-555-1212",
    "postal": 10021,
    "timestamp": "Wed Mar 21 2018 22:26:28 GMT-0400 (Eastern Daylight Time)",
    "type": 4,
    "web": "http://www.helmsley.com",
    "latitude": 40.76573,
    "longitude": -73.954242,
    "distance": 0.9629547665546629
  },
  {
    "key": "-L8AX3omgzPs87WMYTq6",
    "building": "753",
    "street": null,
    "category": 0,
    "closing": "6 PM",
    "email": "support@tanoshisushi.com",
    "name": "tanoshisushi",
    "opening": "8 AM",
    "phone": "212-555-1212",
    "postal": 10021,
    "timestamp": "Wed Mar 21 2018 22:27:26 GMT-0400 (Eastern Daylight Time)",
    "type": 4,
    "web": "http://www.tanoshisushi.com",
    "latitude": 40.76759,
    "longitude": -73.952848,
    "distance": 0.9968555619790017
  },
  {
    "key": "-L8AXK4nyV64H7iI0Amf",
    "building": "753",
    "street": null,
    "category": 0,
    "closing": "6 PM",
    "email": "support@tanoshisushi.com",
    "name": "tanoshisushi",
    "opening": "8 AM",
    "phone": "212-555-1212",
    "postal": 10021,
    "timestamp": "Wed Mar 21 2018 22:28:33 GMT-0400 (Eastern Daylight Time)",
    "type": 4,
    "web": "http://www.tanoshisushi.com",
    "latitude": 40.768509,
    "longitude": -73.955197,
    "distance": 0.7812649215069556
  },
  {
    "key": "-L8AXOgp3hN8QylH7LO9",
    "building": "753",
    "street": null,
    "category": 0,
    "closing": "6 PM",
    "email": "support@bearburger.com",
    "name": "bearburger",
    "opening": "8 AM",
    "phone": "212-555-1212",
    "postal": 10021,
    "timestamp": "Wed Mar 21 2018 22:28:52 GMT-0400 (Eastern Daylight Time)",
    "type": 4,
    "web": "http://www.bearburger.com",
    "latitude": 40.768509,
    "longitude": -73.955197,
    "distance": 0.7812649215069556
  },
  {
    "key": "-L8AXcbWrfZhEUR3y8uo",
    "building": "753",
    "street": null,
    "category": 0,
    "closing": "6 PM",
    "email": "support@townschool.com",
    "name": "townschool",
    "opening": "8 AM",
    "phone": "212-555-1212",
    "postal": 10021,
    "timestamp": "Wed Mar 21 2018 22:29:53 GMT-0400 (Eastern Daylight Time)",
    "type": 4,
    "web": "http://www.townschool.com",
    "latitude": 40.768435,
    "longitude": -73.949715,
    "distance": 1.2386598393876396
  },
  {
    "key": "-L8AY5SWt184Xk2IUl2B",
    "building": "753",
    "street": null,
    "category": 0,
    "closing": "6 PM",
    "email": "support@asiasociety.com",
    "name": "asiasociety",
    "opening": "8 AM",
    "phone": "212-555-1212",
    "postal": 10021,
    "timestamp": "Wed Mar 21 2018 22:31:55 GMT-0400 (Eastern Daylight Time)",
    "type": 4,
    "web": "http://www.asiasociety.com",
    "latitude": 40.769841,
    "longitude": -73.964306,
    "distance": 0
  },
  {
    "key": "-L8AYbyXQIbriYHk5PbC",
    "building": "753",
    "street": null,
    "category": 0,
    "closing": "6 PM",
    "email": "support@jgmellon.com",
    "name": "jgmellon",
    "opening": "8 AM",
    "phone": "212-555-1212",
    "postal": 10021,
    "timestamp": "Wed Mar 21 2018 22:34:12 GMT-0400 (Eastern Daylight Time)",
    "type": 4,
    "web": "http://www.jgmellon.com",
    "latitude": 40.77106,
    "longitude": -73.959339,
    "distance": 0.4396927136586955
  },
  {
    "key": "-L8AZaR3uQ6Q5k_ZIC80",
    "building": "753",
    "street": null,
    "category": 0,
    "closing": "6 PM",
    "email": "support@jgmellon.com",
    "name": "jgmellon",
    "opening": "8 AM",
    "phone": "212-555-1212",
    "postal": 10021,
    "timestamp": "Wed Mar 21 2018 22:38:28 GMT-0400 (Eastern Daylight Time)",
    "type": 4,
    "web": "http://www.jgmellon.com",
    "latitude": 40.77106,
    "longitude": -73.959339,
    "distance": 0.4396927136586955
  },
  {
    "key": "-L8D5oZsmcoMLdLR9ird",
    "building": "753",
    "street": null,
    "category": 0,
    "closing": "6 PM",
    "email": "support@sojourn.com",
    "name": "sojourn",
    "opening": "8 AM",
    "phone": "212-555-1212",
    "postal": 10021,
    "timestamp": "Thu Mar 22 2018 10:27:13 GMT-0400 (Eastern Daylight Time)",
    "type": 4,
    "web": "http://www.sojourn.com",
    "latitude": 40.773449,
    "longitude": -73.955691,
    "distance": 0.8290110965288692
  },
  {
    "key": "-L8TSMb95TLDZJv78CGY",
    "building": "19",
    "street": "Park Avenue",
    "category": 0,
    "closing": "6 PM",
    "email": "support@williams.com",
    "name": "williams",
    "opening": "8 AM",
    "phone": "203-453-4737",
    "postal": 10932,
    "timestamp": "Sun Mar 25 2018 14:39:39 GMT-0400 (Eastern Daylight Time)",
    "type": 4,
    "web": "http://www.williams.com",
    "latitude": 41.288906,
    "longitude": -72.674364,
    "distance": 122.63288097507322
  }
]

非常感谢您的反馈.

推荐答案

GeoFire过滤器按距离过滤结果,但不会按距离增加的顺序返回它们.如果需要的话,您需要在应用程序代码中捕获事件,然后在其中对它们进行排序.

GeoFire filters results by distance, but it does not return them in order of increasing distance. If you need that, you'll need to capture the event in your application code, and sort them there.

请注意,这不是最近的更改:GeoFire从未按距离顺序返回结果.如果使用基础数据库和查询模型,那么扩展性就不会很好.

Note that this is not a recent change: GeoFire has never returned results in order of distance. Given the underlying database and query model, that would not scale well.

这篇关于GeoFire结果按距离无序返回的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆