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:
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.
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.