참고: 이 모듈은 모든 데이터를 메모리에 저장합니다. 이를 기억하세요.
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 ) ;
결과를 제한하려면 다음 두 가지 방법이 있습니다.
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()
메소드로 제한을 정의합니다. 이를 통해 결과에 대한 임시 제한을 정의할 수 있습니다.
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 Alexey Bystrov