Note: This module stores all data in memory - remember that.
Uber fast nearby locations search by coordinates.
Supports Array
, Object
, JSON
and GeoJSON
as input data.
Usage
$ npm install geo-nearby --save
const Geo = ; const dataSet = i: 'Perth' g: 3149853951719405 i: 'Adelaide' g: 3243323516150966 i: 'Melbourne' g: 3244523307653507 i: 'Canberra' g: 3251896081369449 i: 'Sydney' g: 3252342838034651 i: 'Brisbane' g: 3270013708086451 i: 'Sydney' g: 3252342838034651 ; const geo = dataSet; geo; // 5000 - 5km
In g
stored geohash with 52-bit precision.
If you want to change property name, you can do that with options:
const Geo = ; const dataSet = id: 1 name: 'Perth' geoHash: 3149853951719405 id: 2 name: 'Adelaide' geoHash: 3243323516150966 id: 3 name: 'Melbourne' geoHash: 3244523307653507 id: 4 name: 'Canberra' geoHash: 3251896081369449 id: 5 name: 'Sydney' geoHash: 3252342838034651 id: 6 name: 'Brisbane' geoHash: 3270013708086451 id: 7 name: 'Sydney' geoHash: 3252342838034651 ; const geo = dataSet hash: 'geoHash' ; geo;
Data set
For best performance it is recommended to use the default data set syntax:
const dataSet = ... i: <id> g: <geo hash> i: <id> g: <geo hash> ...;
You can use a createCompactSet
method for creating a data set with recommended syntax of your data:
const data = -3530278 14914167 'Canberra' -3386944 15120833 'Sydney' -3782056 14496139 'Melbourne' -3493333 13858333 'Adelaide' -2746778 15302778 'Brisbane' -3195306 11585889 'Perth'; const dataSet = Geo;const geo = dataSet sorted: true ; geo;
createCompactSet
supports Array
, parsed and unparsed JSON
, parsed and unparsed GeoJSON
as input data:
const data = type: 'FeatureCollection' features: type: 'Feature' geometry: type: 'Point' coordinates: 44 64 properties: name: 'Arkhangelskaya Oblast' type: 'Feature' geometry: type: 'Point' coordinates: 405433 645401 properties: name: 'Arkhangelsk' type: 'Feature' geometry: type: 'Point' coordinates: 398302 645635 properties: name: 'Severodvinsk' type: 'Feature' geometry: type: 'Point' coordinates: 408122 644165 properties: name: 'Novodvinsk' type: 'Feature' geometry: type: 'Point' coordinates: 4664963 6125745 properties: name: 'Kotlas' ; const dataSet = Geo;const geo = dataSet sorted: true ; geo;
You also can change default values for a createCompactSet
method if your data looks different:
const data = _id: 1000 name: 'Arkhangel’skaya Oblast’' country: 'RU' coord: lon: 44 lat: 64 admin1: 'Arkhangelskaya' _id: 1001 name: 'Arkhangelsk' country: 'RU' coord: lon: 405433 lat: 645401 admin1: 'Arkhangelskaya' _id: 1002 name: 'Severodvinsk' country: 'RU' coord: lon: 398302 lat: 645635 admin1: 'Arkhangelskaya' _id: 1003 name: 'Novodvinsk' country: 'RU' coord: lon: 408122 lat: 644165 admin1: 'Arkhangelskaya' _id: 1004 name: 'Kotlas' country: 'RU' coord: lon: 4664963 lat: 6125745 admin1: 'Arkhangelskaya' ; const dataSet = Geo;const geo = dataSet sorted: true ; geo;
You can specify setOptions
property in constructor options
, it will create data set automatically, but it may take lots of time for large data:
const data = lat: -3530278 lon: 14914167 name: 'Canberra' lat: -3386944 lon: 15120833 name: 'Sydney' lat: -3782056 lon: 14496139 name: 'Melbourne' lat: -3493333 lon: 13858333 name: 'Adelaide' lat: -2746778 lon: 15302778 name: 'Brisbane' lat: -3195306 lon: 11585889 name: 'Perth' ; const geo = data setOptions: id: 'name' lat: 'lat' lon: 'lon' ; geo;
If you have a huge data it may be more wisely save them to file:
const data = ; Geo;
And then load in variable:
const dataSet = ;const geo = dataSet sorted: true ; geo;
Advanced usage
Limiting results
For limiting results, you have two ways:
1. Define limit in the options. That allows you to define a permanent limit for results.
const geo = dataSet limit: 1 ; geo;dataSet limit: 1 ;geo;
In all these cases, the results will be limited to 1.
2. Define limit by limit()
method. That allows you to define a temporary limit for results.
const foo = dataSet;foo; //up to 1foo; //no limits const bar = dataSet limit: 1 ;bar; //up to 10bar; //up to 1. Options limit - permanent limit.bar; //up to 2
A range of distances
For a more precise definition, you can use a range of distances. It's a bit slower but more accurate.
const geo = dataSet;geo;
Note: Don't use too small distance for start value. For values, less than 250 script execution may take too much time for unsorted data set. 250 - 500 is usually sufficient.
Binary search
If you created data set by createCompactSet
method or your own data set is sorted by geohash
property in ascending order, you can activate extremely fast binary search.
Just set sorted
property as true
in constructor options
.
A binary search is 20 times faster than normal.
const geo = dataSet sorted: true ;geo;
Sorting data
If you have data set (with recommended syntax) which is unsorted, you can easily sort it, just set sort
property as true
in constructor options
.
Data set will be automatically sorted using fast introsort algorithm. But keep in mind, sorting will take some time.
In some case, search in unsorted data set will be faster than sort and search.
const geo = dataSet sort: true ;geo;
Methods
new Geo(dataSet, [options])
Constructor.
Params:
- dataSet (String|Array|Object) - Data set (JSON, GeoJSON, etc)
- [options] (Object) - Options:
- hash (String) - Key path (by default = 'g')
- limit (Integer) - Limit results (by default no limits)
- sort (Boolean) - Will sort data set with introsort algorithm
- sorted (Boolean) - If data set is sorted in ascending order, set
sorted
astrue
it will enable binary search (uber fast mode) - setOptions (Object) - Options from createCompactSet:
- hash (String|Array) - Key (name|path) (by default inherits
hash
from above) - id (String|Array) - Key (name|path) (by default = 2)
- lat (String|Array) - Key (name|path) (by default = 0)
- lon (String|Array) - Key (name|path) (by default = 1)
- file (String) - File path to save
- hash (String|Array) - Key (name|path) (by default inherits
const geo = dataSet hash: 'geo' limit: 1 sorted: true ;
.nearBy(lat, lon, distance)
Search method of nearby places.
Params:
- lat (Float) - Latitude
- lon (Float) - Longitude
- distance (Integer|Array) - Distance in meters
const geo = dataSet;geo;
.limit([limit])
Temporary limit for results.
Params:
- [limit] (Integer) - Limit results (by default no limits)
const geo = dataSet;geo;
.createCompactSet(dataSet, [options])
Method creates data set.
Static method.
Params:
- dataSet (String|Array|Object) - Data set (JSON, GeoJSON, etc)
- [options] (Object) - Options:
- hash (String|Array) - Key (name|path)
- id (String|Array) - Key (name|path) (by default = 2)
- lat (String|Array) - Key (name|path) (by default = 0)
- lon (String|Array) - Key (name|path) (by default = 1)
- file (String) - File path to save
const dataSet = Geo;
License
The MIT License (MIT)
Copyright (c) 2015-2016 Alexey Bystrov