Firestore - возможный обход GeoQuery - PullRequest
0 голосов
/ 04 июня 2018

Поскольку нативные GeoQueries еще не поддерживаются, я подумал о возможном решении, но хотел бы знать о его действительности и эффективности.

Что я хочу: У меня есть коллекцияоколо 2000 документов, каждый из которых содержит Geopoint.Я хотел бы запросить, например, 20 ближайших документов к текущему местоположению пользователя.

Возможное решение: Могу ли я создать другой документ в коллекции и получить его в качестве моего «индекса».Каждое имя поля будет строкой каждого документа ID.Значением каждого поля будет соответствующий Geopoint.Тогда мне понадобится только 1 операция чтения, когда приложение открыто ... Могу ли я затем использовать функцию для работы с полями документа 2000, чтобы вычислить и упорядочить расстояние каждого местоположения от пользователя?Наконец, могу ли я взять 20 ближайших результатов, а затем просто создать прослушиватель и получить только эти результаты?

Редактировать: Попытка моего предложения.Подался после столкновения с постоянными проблемами.Я получил рабочий индексный документ и смог его скачать, упорядочить, чтобы найти ближайшие места и соответствующий идентификатор документа.Однако у меня было много проблем с использованием массива идентификаторов документов для установки слушателей.Я использовал цикл for для циклического прохождения каждого идентификатора в массиве и установки прослушивателя для каждого, но он выполнялся только первым, и случайные сбои продолжали происходить.Кроме того, я заметил, что получение документа заняло немного больше времени ... Итак, я решил отказаться от высокоточного решения и просто запросить гео-точки, чтобы найти местоположения в квадрате вокруг пользователя.

1 Ответ

0 голосов
/ 04 июня 2018

Я думаю, что самым простым способом будет запрос с использованием геопоинтов Firestore, вы можете добиться этого, выполнив следующее:

fun Query.getNearestLocation(latitude: Double, longitude: Double, distance: Double): Query {
    // ~1 mile of lat and lon in degrees
    val lat = 0.0144927536231884
    val lon = 0.0181818181818182

    val lowerLat = latitude - (lat * distance)
    val lowerLon = longitude - (lon * distance)

    val greaterLat = latitude + (lat * distance)
    val greaterLon = longitude + (lon * distance)

    val lesserGeopoint = GeoPoint(lowerLat, lowerLon)
    val greaterGeopoint = GeoPoint(greaterLat, greaterLon)

    val docRef = FirebaseFirestore.getInstance().collection("locations")
    return docRef
            .whereGreaterThan("location", lesserGeopoint)
            .whereLessThan("location", greaterGeopoint)
}

Он также написан на Kotlin, надеюсь, что он вам поможет.Этот код является переводом Kotlin с кода, сделанного Райаном Ли на этом посте

...