GeoFire тесно связан с базой данных Realtime, а гео-запросы - это общая функциональная зависимость многих приложений, которые хотят перейти на Firestore. Есть ли способ воспроизвести хеширование/поиск местоположений в среде Firestore?
Есть ли способ использовать GeoFire с Firestore?
Ответ 1
ОТЛИЧНЫЕ НОВОСТИ. Теперь есть библиотека для iOS и Android, которая копирует GeoFire для Firestore. Библиотека называется GeoFirestore. Он имеет полную документацию и хорошо проверен. В настоящее время я использую его в своем приложении, и он работает блестяще. Код очень похож на код GeoFire, поэтому изучение займет всего несколько минут.
Ответ 2
Редактировать (1 июля 2019 г.): Когда я первоначально написал ответ ниже, я с оптимизмом ожидал, что нативные гео-запросы скоро поступят в Cloud Firestore, что явно не произошло. Это все еще в долгосрочных планах, но на данный момент лучший вариант - это использовать созданную сообществом библиотеку или создать свою собственную, используя либо GeoHashes, либо библиотеку S2 Geometry.
Библиотеки GeoFire для базы данных Realtime были построены с использованием GeoHashes, и перенос логики этих библиотек в Cloud Firestore должен быть относительно простым.
Сэм из команды Cloud Firestore здесь. Как сказал SUPERCILEX, Cloud Firestore уже поддерживает тип данных GeoPoint. Мы прилагаем все усилия, чтобы привнести в продукт собственные гео-запросы.
Поскольку исходные гео-запросы поступают, мы не будем переносить GeoFire в Cloud Firestore. Вместо этого мы перенаправим эти инженерные усилия на скорейшее получение собственных запросов.
Если вам нужны гео-запросы сегодня и вы не хотите создавать свою собственную библиотеку, используйте базу данных реального времени!
Ответ 3
Решение, которое приходит на ум, состоит в том, чтобы добавить базу данных реального времени только для гео-запросов и синхронизировать две базы данных с облачными функциями, во многом как Google предлагает с присутствием.
В моем случае даже не нужно много синхронизировать; Я просто веду список идентификаторов пользователей с их местоположением в базе данных реального времени и выполняю там все гео-запросы.
Ответ 4
Новый проект был введен, так как оригинальный постер сначала задает этот вопрос. Проект называется GEOFirestore.
С помощью этой библиотеки вы можете выполнять запросы, такие как документы документов внутри круга:
const geoQuery = geoFirestore.query({
center: new firebase.firestore.GeoPoint(10.38, 2.41),
radius: 10.5
});
Вы можете установить GeoFirestore через npm. Вам придется установить Firebase отдельно (потому что это одноранговая зависимость от GeoFirestore):
$ npm install geofirestore firebase --save
Ответ 5
Cloud Firestore изначально поддерживает гео-точки. Смотрите поддерживаемые типы данных. И вы найдете класс GeoPoint
который вы можете использовать для задания данных, а также для запроса к ним:
query.whereEqualTo("location", GeoPoint(lat, long))
Ответ 6
Решением Javascript для GeoQuery с Firestore является использование GeoFirestore, как сказал Никхил Шридхар. Но это довольно сложно использовать (или это было для меня).
Прежде всего вы должны инициализировать ссылку GeoFirestore.
var firebase = require('firebase-admin');
var GeoFirestore = require('geofirestore');
// Create a Firestore reference
const firestore = firebase.firestore();
// Create a GeoFirestore reference
const geofirestore = new GeoFirestore.GeoFirestore(firestore);
// Create a collection reference but using geofirestore collections
// this is where you save the geofirestore documents with its structure
const geocollection = geofirestore.collection('userPositions');
После инициализации вашей коллекции первым шагом является сохранение документа с указанной структурой.
{
g: string;
l: GeoPoint;
d: DocumentData;
}
geofirestore.collection('userPositions').doc(id).set({ coordinates: new firebase.firestore.GeoPoint(0, 0)}).then(res => {
return res;
}).catch(err => {
console.log(err);
});
Только когда у вас есть коллекция с документами геоинформационного хранилища, вы можете запросить их, как показано в примере.
// Create a GeoQuery based on a location
const query = geocollection.near({ center: new firebase.firestore.GeoPoint(0, 0), radius: 1000 });
// Get query (as Promise)
query.get().then((value) => {
console.log(value.docs); // All docs returned by GeoQuery
});
Надеюсь, что эти шаги помогут вам!