หมายเหตุ: โมดูลนี้จะจัดเก็บข้อมูลทั้งหมดไว้ในหน่วยความจำ - โปรดจำไว้ว่า
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
geohash ที่เก็บไว้ด้วยความแม่นยำ 52 บิต
หากคุณต้องการเปลี่ยนชื่อคุณสมบัติ คุณสามารถทำได้โดยใช้ตัวเลือก:
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 ) ;
คุณสามารถระบุคุณสมบัติ setOptions
ใน Constructor options
ได้ โดยจะสร้างชุดข้อมูลโดยอัตโนมัติ แต่อาจใช้เวลานานสำหรับข้อมูลขนาดใหญ่:
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
จากน้อยไปมาก คุณสามารถเปิดใช้งานการค้นหาไบนารี่ที่รวดเร็วมากได้
เพียงตั้งค่าคุณสมบัติ sorted
ให้เป็น true
ใน options
ตัวสร้าง
การค้นหาแบบไบนารี่เร็วกว่าปกติถึง 20 เท่า
const geo = new Geo ( dataSet , { sorted : true } ) ;
geo . limit ( 1 ) . nearBy ( 64.54 , 40.54 , [ 250 , 30000 ] ) ;
หากคุณมีชุดข้อมูล (พร้อมไวยากรณ์ที่แนะนำ) ซึ่งไม่ได้เรียงลำดับ คุณสามารถเรียงลำดับได้อย่างง่ายดาย เพียงตั้งค่าคุณสมบัติ sort
เป็น true
ใน options
ตัวสร้าง
ชุดข้อมูลจะถูกจัดเรียงโดยอัตโนมัติโดยใช้อัลกอริธึมการจัดเรียงที่รวดเร็ว แต่โปรดจำไว้ว่าการเรียงลำดับจะใช้เวลาสักระยะหนึ่ง
ในบางกรณี การค้นหาในชุดข้อมูลที่ไม่ได้เรียงลำดับจะเร็วกว่าการเรียงลำดับและค้นหา
const geo = new Geo ( dataSet , { sort : true } ) ;
geo . limit ( 1 ) . nearBy ( 64.54 , 40.54 , [ 250 , 30000 ] ) ;
ตัวสร้าง
sorted
เป็น true
จะเป็นการเปิดใช้งานการค้นหาแบบไบนารี (โหมด uber fast)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