Заказываете Firestore запрос GeoHash от ближайшего к дальнему? - PullRequest
1 голос
/ 20 мая 2019

В настоящее время я использую части библиотеки GeoFirebase вместе с Firestore, чтобы разрешить гео-запросы. Когда я устанавливаю геохэш поста, я делаю это так if let geoHash = GFGeoHash(location: location.coordinate).geoHashValue {

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

 var geoQuerySpecific = GFGeoHashQuery()
        let geoQueryHash =  GFGeoHashQuery.queries(forLocation: (lastLocation?.coordinate)!, radius: (30)) as! Set<GFGeoHashQuery>

        for query in geoQueryHash {
            geoQuerySpecific = query
            print("the key is this um \(geoQuerySpecific)")
        }
        print("the starting value is \(geoQuerySpecific.startValue)  and the end value is \(geoQuerySpecific.endValue)")
        let nearQuery = Firestore.firestore().collection("stuff").order(by: "g").whereField("g", isGreaterThanOrEqualTo: geoQuerySpecific.startValue).whereField("g", isLessThanOrEqualTo: geoQuerySpecific.endValue)

Как видите, это не будет работать правильно, поскольку в geoQueryHash есть несколько элементов. Я думал об урезании последних четырех цифр / букв из геохеша, когда я устанавливаю его в firebase, однако, это не будет достаточно конкретным. Чтобы получить самые близкие сообщения, было бы лучше установить geoHashes в базе данных, как я в настоящее время, затем, при получении материала, сделайте начальное значение самым конкретным геохешем для запроса, а затем сделайте конечное значение усеченная версия геохеша, как начинать с получения ближайших постов и заканчивать самыми широкими?

Я могу ограничить запрос Firestore 50, так что тогда я могу получить 50 постов от ближайшего к дальнему ... верно ли мое понимание гео-хеширования? Это было бы возможно?

Концептуально, если бы был способ сохранить геохеши как целые числа, я мог бы сделать так, чтобы запрос firestore начинался с наибольшего целого числа (т. Е. Наиболее точного геохеша), а затем обрабатывал запрос по убыванию до тех пор, пока он не достигнет наименее точного намертеля ( самый широкий geoHash), а затем ограничить его до 50.

1 Ответ

2 голосов
/ 20 мая 2019

GeoFirestore использует геошашки, чтобы иметь возможность выбирать документы, которые находятся в пределах диапазона геохешей, который примерно совпадает с областью на карте.Невозможно получить эти документы в указанном порядке из той же области, используя только геоквест.Если вы хотите, чтобы документы сортировались по расстоянию, вы должны будете сделать это после гео-запроса в коде вашего приложения.

Если вы хотите узнать больше о том, почему это так, взгляните на доклад, который ядал некоторое время назад: Запрос Firebase и Firestore на основе географического местоположения или расстояния .В ней я объясню, как работают геохэш, как они позволяют вам выбирать документы в определенном географическом диапазоне, и почему вы не можете выполнить более сложный запрос в Firestore (или исходной базе данных Firebase в реальном времени).

...