Unleash awesomeness. Private packages, team management tools, and powerful integrations. Get started with npm Orgs »

geofirestore

3.2.2 • Public • Published

geofirestore

npm version Build Status Coverage Status dependencies Status star this repo fork this repo

Full documentation is available at https://geofirestore.com.

GeoFirestore is an open-source library that allows extend the Firestore library in order to store and query documents based on their geographic location. At its heart, GeoFirestore is just a wrapper for the Firestore library, exposing many of the same functions and features of Firestore. Its main benefit, however, is the possibility of retrieving only those documents within a given geographic area - all in realtime.

GeoFirestore uses the Firebase Cloud Firestore for data storage, allowing query results to be updated in realtime as they change. GeoFirestore selectively loads only the data near certain locations, keeping your applications light and responsive, even with extremely large datasets.

GeoFirestore is designed as a lightweight add-on to Firebase. To keep things simple, GeoFirestore stores data in its own format and its own location within your Firestore database.

Table of Contents

Downloading GeoFirestore

You can install GeoFirestore via npm:

npm install geofirestore

Or you can use GeoFirestore via CDN:

<script src="https://unpkg.com/geofirestore@3.2.0/dist/geofirestore.js"></script>

Example Usage

Assume you are building an app to rate bars and you store all information for a bar, e.g. name, business hours and price range, and you want to add the possibility for users to search for bars in their vicinity. This is where GeoFirestore comes in. You can store each bar using GeoFirestore, using the location to build an easily queryable document. GeoFirestore then allows you to easily query which bars are nearby in a simalar fashion as geofire but will also return the bar information (not just the key or location).

Examples

You can find a full list of our demos and view the code for each of them in the examples directory of this repository. The examples cover some of the common use cases for GeoFirestore.

Documentation

Full documentation is available at https://geofirestore.com. It mostly provides the same functionality as the Firestore library, in almost the same way as the Firestore library. Many questions can be addressed by looking at the Firestore docs. However there are a few differences, and below is a little example of how to make a location based query.

import * as firebase from 'firebase/app';
import 'firebase/firestore';
import { GeoCollectionReference, GeoFirestore, GeoQuery, GeoQuerySnapshot } from 'geofirestore';
 
// Initialize the Firebase SDK
firebase.initializeApp({
  // ...
});
 
// Create a Firestore reference
const firestore = firebase.firestore();
 
// Create a GeoFirestore reference
const geofirestore: GeoFirestore = new GeoFirestore(firestore);
 
// Create a GeoCollection reference
const geocollection: GeoCollectionReference = geofirestore.collection('restaurants');
 
// Create a GeoQuery based on a location
const query: GeoQuery = geocollection.near({ center: new firebase.firestore.GeoPoint(40.7589, -73.9851), radius: 1000 });
 
// Get query (as Promise)
query.get().then((value: GeoQuerySnapshot) => {
  console.log(value.docs); // All docs returned by GeoQuery
});

Simple. Easy. And very similar with how Firestore handles a get from a Firestore Query. The difference being the added ability to say query near a center point, with a set radius in kilometers.

Limitations & Considerations

Internally GeoFirestore creates multiple geohases around a requested area. It queries them and furter calculations on the seperate results are done within the libary. Because of this the additional filtering methods such as orderBy, startAt and endAt can not be passed though GeoFirestore to Cloud Firestore at this time.

Data Structure

GeoFirestore is based off of the geofire JavaScript library. Documents generated and stored in your Firestore collection by GeoFirestore are typed/structured as:

interface GeoDocument {
    g: string;
    l: GeoPoint;
    d: DocumentData;
  }
  • g is field is the geohash generated by the library, and is required in order to make the geoqery.
  • l is the GeoPoint used to generate the g field.
  • d is a sub-object which is where your data is stored.

Data must be structured this was in order to work, and is why you should use the GeoFirestore library to insert data in order to be able to query it.

limit()

The limit filtering method is exposed through GeoFirestore, however there are some unique considerations when using it. Limits on geoqueries are applied based on the distance from the center. Geoqueries require an aggregation of queries. When performing a geoquery the library applies the limit on the client. This may mean you are loading to the client more documents then you intended. Use with this performance limitation in mind.

Contributing

All code should pass tests, as well as be well documented. Please open PRs into the dev branch. Please also see the Commit Message Guidelines for how commit messages should be structured.

install

npm i geofirestore

Downloadsweekly downloads

2,252

version

3.2.2

license

MIT

repository

Gitgithub

last publish

collaborators

  • avatar
Report a vulnerability