注:このモジュールはすべてのデータをメモリに保存します。覚えておいてください。
Uber は座標によって近くの場所を高速に検索します。
入力データとしてArray
、 Object
、 JSON
およびGeoJSON
サポートします。
$ 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
g
には、52 ビット精度の geohash が保存されます。
プロパティ名を変更したい場合は、オプションを使用して変更できます。
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 ) ;
最高のパフォーマンスを得るには、デフォルトのデータセット構文を使用することをお勧めします。
const dataSet = [
...
{ i : < id > , g: < geo hash > } ,
{ i : < id > , g : < geo hash > } ,
...
];
createCompactSet
メソッドを使用して、データの推奨構文でデータ セットを作成できます。
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
、 Array
、解析済みおよび未解析のJSON
、解析済みおよび未解析のGeoJSON
入力データとしてサポートします。
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 ) ;
データが異なる場合は、 createCompactSet
メソッドのデフォルト値を変更することもできます。
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 ) ;
コンストラクターoptions
でsetOptions
プロパティを指定すると、データ セットが自動的に作成されますが、大きなデータの場合は時間がかかる場合があります。
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 ) ;
巨大なデータがある場合は、ファイルに保存する方が賢明かもしれません。
const data = require ( './huge.data.set.file.json' ) ;
Geo . createCompactSet ( { id : '_id' , lat : 'lat' , lon : 'lon' , file : './compact.set.json' } ) ;
そして、変数をロードします。
const dataSet = require ( './compact.set.json' ) ;
const geo = new Geo ( dataSet , { sorted : true } ) ;
geo . nearBy ( 64.54 , 40.54 , 5000 ) ;
結果を制限するには、次の 2 つの方法があります。
1.オプションで制限を定義します。これにより、結果に対する永続的な制限を定義できます。
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 ) ;
これらすべての場合、結果は 1 に限定されます。
2.limit limit()
メソッドで制限を定義します。これにより、結果に対する一時的な制限を定義できます。
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
より正確に定義するには、距離の範囲を使用できます。少し遅くなりますが、より正確です。
const geo = new Geo ( dataSet ) ;
geo . limit ( 2 ) . nearBy ( 64.54 , 40.54 , [ 250 , 30000 ] ) ;
注:開始値に小さすぎる距離を使用しないでください。値の場合、ソートされていないデータ セットの場合、スクリプトの実行が 250 未満の場合、時間がかかりすぎる可能性があります。通常は 250 ~ 500 で十分です。
createCompactSet
メソッドでデータ セットを作成した場合、または独自のデータ セットがgeohash
プロパティによって昇順で並べ替えられている場合は、非常に高速なバイナリ検索をアクティブにすることができます。
コンストラクターoptions
でsorted
プロパティをtrue
に設定するだけです。
二分探索は通常の 20 倍高速です。
const geo = new Geo ( dataSet , { sorted : true } ) ;
geo . limit ( 1 ) . nearBy ( 64.54 , 40.54 , [ 250 , 30000 ] ) ;
ソートされていないデータ セット (推奨構文を使用) がある場合は、コンストラクターoptions
でsort
プロパティをtrue
に設定するだけで簡単にソートできます。
データセットは、高速イントロソートアルゴリズムを使用して自動的にソートされます。ただし、並べ替えには時間がかかることに注意してください。
場合によっては、ソートされていないデータセットでの検索の方が、ソートと検索よりも高速になります。
const geo = new Geo ( dataSet , { sort : true } ) ;
geo . limit ( 1 ) . nearBy ( 64.54 , 40.54 , [ 250 , 30000 ] ) ;
コンストラクタ。
sorted
true
に設定すると、バイナリ検索 (超高速モード) が有効になります。hash
を継承します) const geo = new Geo ( dataSet , { hash : 'geo' , limit : 1 , sorted : true } ) ;
近くの場所の検索方法。
const geo = new Geo ( dataSet ) ;
geo . nearBy ( 64.54 , 40.54 , [ 500 , 300000 ] ) ;
結果の一時的な制限。
const geo = new Geo ( dataSet ) ;
geo . limit ( 1 ) . nearBy ( 64.54 , 40.54 , [ 500 , 300000 ] ) ;
メソッドはデータセットを作成します。
静的メソッド。
const dataSet = Geo . createCompactSet ( data , { id : [ 'names' , 'name' , 'id' ] } ) ;
MIT ライセンス (MIT)
著作権 (c) 2015-2016 アレクセイ・ビストロフ