ملاحظة: تقوم هذه الوحدة بتخزين كافة البيانات في الذاكرة - تذكر ذلك.
أوبر المواقع القريبة سريعة البحث عن طريق الإحداثيات.
يدعم 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
في 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
وسيعمل على تمكين البحث الثنائي (الوضع السريع للغاية)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)
حقوق الطبع والنشر (ج) 2015-2016 أليكسي بيستروف