Catatan: Modul ini menyimpan semua data dalam memori - ingat itu.
Uber dengan cepat mencari lokasi terdekat berdasarkan koordinat.
Mendukung Array
, Object
, JSON
dan GeoJSON
sebagai input data.
$ npm install geo-nearby --save
const Geo = require ( 'geo-nearby' ) ;
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 = new Geo ( dataSet ) ;
geo . nearBy ( - 33.87 , 151.2 , 5000 ) ; // 5000 - 5km
Di g
disimpan geohash dengan presisi 52-bit.
Jika Anda ingin mengubah nama properti, Anda dapat melakukannya dengan opsi:
const Geo = require ( 'geo-nearby' ) ;
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 = new Geo ( dataSet , { hash : 'geoHash' } ) ;
geo . nearBy ( - 33.87 , 151.2 , 5000 ) ;
Untuk performa terbaik, disarankan untuk menggunakan sintaks kumpulan data default:
const dataSet = [
...
{ i : < id > , g: < geo hash > } ,
{ i : < id > , g : < geo hash > } ,
...
];
Anda dapat menggunakan metode createCompactSet
untuk membuat kumpulan data dengan sintaks yang direkomendasikan untuk data Anda:
const data = [
[ - 35.30278 , 149.14167 , 'Canberra' ] ,
[ - 33.86944 , 151.20833 , 'Sydney' ] ,
[ - 37.82056 , 144.96139 , 'Melbourne' ] ,
[ - 34.93333 , 138.58333 , 'Adelaide' ] ,
[ - 27.46778 , 153.02778 , 'Brisbane' ] ,
[ - 31.95306 , 115.85889 , 'Perth' ]
] ;
const dataSet = Geo . createCompactSet ( data ) ;
const geo = new Geo ( dataSet , { sorted : true } ) ;
geo . nearBy ( - 33.87 , 151.2 , 5000 ) ;
createCompactSet
mendukung Array
, JSON
yang diurai dan tidak diurai, GeoJSON
yang diurai dan tidak diurai sebagai data masukan:
const data = {
type : 'FeatureCollection' ,
features : [
{ type : 'Feature' , geometry : { type : 'Point' , coordinates : [ 44 , 64 ] } , properties : { name : 'Arkhangelskaya Oblast' } } ,
{ type : 'Feature' , geometry : { type : 'Point' , coordinates : [ 40.5433 , 64.5401 ] } , properties : { name : 'Arkhangelsk' } } ,
{ type : 'Feature' , geometry : { type : 'Point' , coordinates : [ 39.8302 , 64.5635 ] } , properties : { name : 'Severodvinsk' } } ,
{ type : 'Feature' , geometry : { type : 'Point' , coordinates : [ 40.8122 , 64.4165 ] } , properties : { name : 'Novodvinsk' } } ,
{ type : 'Feature' , geometry : { type : 'Point' , coordinates : [ 46.64963 , 61.25745 ] } , properties : { name : 'Kotlas' } }
]
} ;
const dataSet = Geo . createCompactSet ( data , { id : 'name' } ) ;
const geo = new Geo ( dataSet , { sorted : true } ) ;
geo . nearBy ( 64.54 , 40.54 , 5000 ) ;
Anda juga dapat mengubah nilai default untuk metode createCompactSet
jika data Anda terlihat berbeda:
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 : 40.5433 , lat : 64.5401 } , admin1 : 'Arkhangelskaya' } ,
{ _id : 1002 , name : 'Severodvinsk' , country : 'RU' , coord : { lon : 39.8302 , lat : 64.5635 } , admin1 : 'Arkhangelskaya' } ,
{ _id : 1003 , name : 'Novodvinsk' , country : 'RU' , coord : { lon : 40.8122 , lat : 64.4165 } , admin1 : 'Arkhangelskaya' } ,
{ _id : 1004 , name : 'Kotlas' , country : 'RU' , coord : { lon : 46.64963 , lat : 61.25745 } , admin1 : 'Arkhangelskaya' }
] ;
const dataSet = Geo . createCompactSet ( data , { id : '_id' , lat : [ 'coord' , 'lat' ] , lon : [ 'coord' , 'lon' ] } ) ;
const geo = new Geo ( dataSet , { sorted : true } ) ;
geo . nearBy ( 64.54 , 40.54 , 5000 ) ;
Anda dapat menentukan properti setOptions
di options
konstruktor, ini akan membuat kumpulan data secara otomatis, tetapi mungkin memerlukan banyak waktu untuk data besar:
const data = [
{ lat : - 35.30278 , lon : 149.14167 , name : 'Canberra' } ,
{ lat : - 33.86944 , lon : 151.20833 , name : 'Sydney' } ,
{ lat : - 37.82056 , lon : 144.96139 , name : 'Melbourne' } ,
{ lat : - 34.93333 , lon : 138.58333 , name : 'Adelaide' } ,
{ lat : - 27.46778 , lon : 153.02778 , name : 'Brisbane' } ,
{ lat : - 31.95306 , lon : 115.85889 , name : 'Perth' }
] ;
const geo = new Geo ( data , { setOptions : { id : 'name' , lat : 'lat' , lon : 'lon' } } ) ;
geo . nearBy ( - 33.87 , 151.2 , 5000 ) ;
Jika Anda memiliki data yang sangat besar, mungkin lebih bijaksana menyimpannya ke file:
const data = require ( './huge.data.set.file.json' ) ;
Geo . createCompactSet ( { id : '_id' , lat : 'lat' , lon : 'lon' , file : './compact.set.json' } ) ;
Dan kemudian memuat variabel:
const dataSet = require ( './compact.set.json' ) ;
const geo = new Geo ( dataSet , { sorted : true } ) ;
geo . nearBy ( 64.54 , 40.54 , 5000 ) ;
Untuk membatasi hasil, Anda memiliki dua cara:
1. Tentukan batas dalam opsi. Itu memungkinkan Anda menentukan batas permanen untuk hasil.
const geo = new Geo ( dataSet , { limit : 1 } ) ;
geo . nearBy ( 64.54 , 40.54 , 3000 ) ;
new Geo ( dataSet , { limit : 1 } ) . nearBy ( 64.54 , 40.54 , 3000 ) ;
geo . nearBy ( - 33.87 , 151.2 , 5000 ) ;
Dalam semua kasus ini, hasilnya akan dibatasi pada 1.
2. Tentukan batas dengan metode limit()
. Itu memungkinkan Anda menentukan batas sementara untuk hasil.
const foo = new Geo ( dataSet ) . limit ( 1 ) ;
foo . nearBy ( 64.54 , 40.54 , 5000 ) ; //up to 1
foo . nearBy ( 64.54 , 40.54 , 5000 ) ; //no limits
const bar = new Geo ( dataSet , { limit : 1 } ) . limit ( 10 ) ;
bar . nearBy ( 64.54 , 40.54 , 5000 ) ; //up to 10
bar . nearBy ( 64.54 , 40.54 , 5000 ) ; //up to 1. Options limit - permanent limit.
bar . limit ( 2 ) . nearBy ( 64.54 , 40.54 , 5000 ) ; //up to 2
Untuk definisi yang lebih tepat, Anda dapat menggunakan rentang jarak. Ini sedikit lebih lambat tetapi lebih akurat.
const geo = new Geo ( dataSet ) ;
geo . limit ( 2 ) . nearBy ( 64.54 , 40.54 , [ 250 , 30000 ] ) ;
Catatan: Jangan gunakan jarak yang terlalu kecil untuk nilai awal. Untuk nilai, eksekusi skrip kurang dari 250 mungkin memerlukan terlalu banyak waktu untuk kumpulan data yang tidak diurutkan. 250 - 500 biasanya cukup.
Jika Anda membuat kumpulan data dengan metode createCompactSet
atau kumpulan data Anda sendiri diurutkan berdasarkan properti geohash
dalam urutan menaik, Anda dapat mengaktifkan pencarian biner yang sangat cepat.
Cukup setel properti sorted
sebagai true
di options
konstruktor.
Pencarian biner 20 kali lebih cepat dari biasanya.
const geo = new Geo ( dataSet , { sorted : true } ) ;
geo . limit ( 1 ) . nearBy ( 64.54 , 40.54 , [ 250 , 30000 ] ) ;
Jika Anda memiliki kumpulan data (dengan sintaks yang disarankan) yang tidak disortir, Anda dapat dengan mudah mengurutkannya, cukup setel properti sort
sebagai true
di options
konstruktor.
Kumpulan data akan diurutkan secara otomatis menggunakan algoritma introsort cepat. Namun perlu diingat, penyortiran akan memakan waktu.
Dalam beberapa kasus, pencarian dalam kumpulan data yang tidak disortir akan lebih cepat daripada pengurutan dan pencarian.
const geo = new Geo ( dataSet , { sort : true } ) ;
geo . limit ( 1 ) . nearBy ( 64.54 , 40.54 , [ 250 , 30000 ] ) ;
Konstruktor.
sorted
sebagai true
ini akan mengaktifkan pencarian biner (mode cepat uber)hash
dari atas) const geo = new Geo ( dataSet , { hash : 'geo' , limit : 1 , sorted : true } ) ;
Metode pencarian tempat terdekat.
const geo = new Geo ( dataSet ) ;
geo . nearBy ( 64.54 , 40.54 , [ 500 , 300000 ] ) ;
Batas sementara untuk hasil.
const geo = new Geo ( dataSet ) ;
geo . limit ( 1 ) . nearBy ( 64.54 , 40.54 , [ 500 , 300000 ] ) ;
Metode membuat kumpulan data.
Metode statis.
const dataSet = Geo . createCompactSet ( data , { id : [ 'names' , 'name' , 'id' ] } ) ;
Lisensi MIT (MIT)
Hak Cipta (c) 2015-2016 Alexei Bystrov