Результаты GeoFire возвращаются неупорядоченными по расстоянию - PullRequest
0 голосов
/ 25 мая 2018

Я использую:

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

Я написал эту функцию, чтобы получить список ориентиров на основе близости пользователя:

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
    }

Однако список не возвращается, упорядоченныйрасстояние.Я нахожу это особенно странным, так как результаты возвращались упорядоченными по расстоянию.Вещи, которые я сделал с тех пор:

  • Добавлен Swagger
  • Изменена структура проекта для соответствия спецификации OpenAPI.
  • Добавлена ​​беседка
  • Переустановлен geofire и firebase

Итак, я знаю, что этот код "работал" в прошлом.

Вот мойСтруктура RTDB Firebase:

enter image description here

Для входов:

user_latitude = 40.769841

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
  }
]

Ваш отзыввысоко ценится.

1 Ответ

0 голосов
/ 25 мая 2018

GeoFire фильтрует результаты по расстоянию, но не возвращает их в порядке увеличения расстояния.Если вам это нужно, вам нужно захватить событие в коде приложения и отсортировать их там.

Обратите внимание, что это не недавнее изменение: GeoFire никогда не возвращал результаты в порядке расстояния.Учитывая базовую базу данных и модель запросов, это не будет хорошо масштабироваться.

...