GeoFire Results Coming Back Unordered By Distance

久未见 提交于 2019-12-11 09:03:52

问题


I am using:

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:

  • Added Swagger
  • Changed the project structure to comply with the OpenAPI spec.
  • Added bower
  • Reinstalled geofire and firebase

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

Here is my Firebase RTDB structure:

For the inputs:

user_latitude = 40.769841

user_longitude = -73.964306

user_radius = 225

I now get the following results:

[
  {
    "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
  }
]

Your feedback is much appreciated.


回答1:


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.

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.



来源:https://stackoverflow.com/questions/50535460/geofire-results-coming-back-unordered-by-distance

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!