كيفية تنفيذ الميزات الجغرافية المكانية MongoDB

Kyfyt Tnfydh Almyzat Aljghrafyt Almkanyt Mongodb



توفر الميزة الجغرافية المكانية لـ MongoDB طريقة مباشرة لتخزين البيانات الجغرافية في قاعدة البيانات. بشكل أساسي، يمكننا تخزين البيانات الجغرافية المكانية في MongoDB ككائنات GeoJSON. GeoJSON هو تنسيق مجاني ومفتوح المصدر يعتمد على JavaScript Object Notation مع بيانات جغرافية بسيطة. تعتبر هذه الوظيفة مهمة للتطبيقات التي تتطلب خدمات تعتمد على الموقع مثل عملية رسم الخرائط، بناءً على البحث عن الموقع، وغيرها. تتناول هذه المقالة الميزة الجغرافية المكانية مع تطبيق المثال.

إضافة المستندات إلى مجموعة الميزات الجغرافية المكانية

لتوضيح وظيفة ميزة MongoDB Geospatial، نحتاج إلى المستندات الخاصة بالمجموعة المحددة. نقوم بإدراج بعض المستندات في مجموعة 'المنطقة' كما هو موضح في ما يلي:

db.area.insertMany( [
{
اسم: 'حديقة الأطفال' ,
نوع الموقع: 'نقطة' الإحداثيات: [ - 60.97 , 30.77 ] },
فئة: 'حديقة'
},
{
اسم: 'منطقة الطلاب' ,
نوع الموقع: 'نقطة' الإحداثيات: [ - 60.9928 , 30.7193 ] },
فئة: 'حديقة'
},
{
اسم: 'ملعب كرة القدم' ,
نوع الموقع: 'نقطة' الإحداثيات: [ - 60.9375 , 30.8303 ] },
فئة: 'ملعب'
}
] )

لدينا وثائق تحتوي على بيانات الموقع مثل الإحداثيات. بالإضافة إلى ذلك، نقوم بإنشاء فهرس جغرافي مكاني في الميدان لتحسين أداء الاستعلامات الجغرافية المكانية.









المثال 1: استخدام عامل الاستعلام $geoIntersects

أولاً، لدينا عامل التشغيل $geoIntersects للميزة الجغرافية المكانية والذي يتقاطع مع الكائن المقدم. خذ بعين الاعتبار التنفيذ التالي لمشغل $geoIntersects:



db.area.find({ الموقع: { $geoIntersects: { $geometry: { النوع: 'نقطة' ,

الإحداثيات: [ - 60.97 , 30.77 ] } } } })

في المثال، نسمي المجموعة 'المنطقة' جنبًا إلى جنب مع عملية 'البحث'. بالنسبة إلى طريقة البحث ()، نقوم بتمرير مجموعات حقول 'الموقع' إلى مشغل الاستعلام $geoIntersects الخاص بالميزة الجغرافية المكانية. يُستخدم هذا للتحقق مما إذا كانت النقطة المحددة تتقاطع مع الشكل الهندسي المخزن في حقل الشكل الهندسي.





بعد ذلك، يأخذ عامل التشغيل $geoIntesects عامل تشغيل الهندسة $ حيث يتم تعيين حقل النوع بقيمة 'النقطة' ويتم إعطاء حقل الإحداثيات بقيم 'الإحداثيات'. هنا، يتم تعريف الهندسة $ للمقارنة الجغرافية المكانية.

الإخراج التالي هو المكان الذي يتم فيه استرداد المستند المتوقع وحيث يحتوي حقل الهندسة على كائن هندسي يتقاطع مع النقطة المحددة:



المثال 2: استخدام عامل الاستعلام $near

عامل التشغيل $near هو أيضًا الميزة الجغرافية المكانية المستخدمة لإجراء الاستعلامات الجغرافية المكانية لتحديد المستندات القريبة جغرافيًا من مكان معين. يقوم باسترجاع المستندات مرتبة حسب قربها من الموقع المحدد. هنا، نقدم تنفيذ عامل التشغيل $near:

منطقة ديسيبل.العثور على(
{
موقع:
{ $ بالقرب :
{
هندسة $: { النوع: 'نقطة' ,  الإحداثيات: [ - 60.9667 , 30.78 ] },
المسافة الدقيقة $: 1000 ,
$المسافة القصوى: 5000
}
}
}
)

في المثال، نحدد حقل 'الموقع' لمجموعة 'المنطقة' داخل عملية 'البحث'. بعد ذلك، قمنا بتعيين عامل الاستعلام $near للميزة الجغرافية المكانية على حقل 'الموقع' هذا. يبحث عامل التشغيل $near عن النقطة القريبة ذات الإحداثيات المحددة. بعد ذلك، نستخدم المعلمات $minDistance و$maxDistance في عامل التشغيل $near والتي يتم توفيرها بقيم معينة لاسترداد المستندات ضمن نطاق المسافة المحدد من النقطة المحددة.

يتم استرداد المستند في المخرجات القريبة من المواقع المحددة أو نقاط الاهتمام في مجموعة 'المنطقة' الجغرافية المكانية:

المثال 3: استخدام عامل الاستعلام ‎$nearsphere

وبدلاً من ذلك، لدينا عامل التشغيل ‎$nearsphere الذي يشبه عامل التشغيل ‎$near، ولكن ‎$nearSphere يأخذ في الاعتبار الشكل الكروي للأرض عند حساب المسافات.

منطقة ديسيبل.العثور على(
{
موقع: {
$nearSphere: {
هندسة $: {
يكتب : 'نقطة' ,
الإحداثيات : [ - 60.9667 , 30.78 ]
},
المسافة الدقيقة $: 1000 ,
$المسافة القصوى: 5000
}
}
}
)

في المثال، نستخدم عامل التشغيل nearsphere $ للاستعلام الجغرافي المكاني. يبحث عامل التشغيل $nearspehere هنا عن المستند الذي تكون أقرب نقاطه قريبة من النقاط المحددة في الاستعلام، ويتم تعيين النقاط على صفيف حقل الإحداثيات.

بعد ذلك، نقوم بتحسين النتائج من خلال إنشاء المعلمات $minDistance و$maxDistance. تضمن المعلمة $minDistance أن تكون المستندات التي يتم إرجاعها على بعد 1000 متر على الأقل من النقطة المحددة، بينما تحدد المعلمة $maxDistance النتائج بالمواقع التي لا تبعد أكثر من 5000 متر.

يتم عرض المستند في الإخراج مع موقع ضمن متر محدد من النقطة ذات الإحداثيات المحددة:

المثال 4: استخدام عامل الاستعلام $geoWithin

بعد ذلك، لدينا عامل التشغيل $geoWithin في MongoDB والذي يُستخدم للاستعلامات الجغرافية المكانية للعثور على المستندات الموجودة بالكامل داخل شكل محدد مثل الدائرة. لنحصل على العرض التوضيحي التالي لاستعلام $geoWithin:

db.area.find({ الموقع:

{ $جيوداخل:

{ $centerSphere: [ [ - 60.93414657 , 30.82302903 3 / 3963.2 ] } } })

في المثال، نستخدم عامل التشغيل $geoWithin للعثور على مستندات مجموعة 'المنطقة' داخل منطقة دائرية معينة على كرة ثنائية الأبعاد. لهذا، نحدد عامل التشغيل $centerSphere داخل عامل التشغيل $geoWithin الذي يأخذ الوسيطتين كنقطة مركزية، والتي من المحتمل أن تمثل نقطة الإحداثيات هنا، ونصف قطر الدائرة الذي يمثل قيمة المسافة بالأميال.

يتم استرداد الوثيقة الناتجة فيما يلي والتي تمثل نقطة جغرافية مكانية تقع ضمن الدائرة المحددة بنقطة المركز المحددة ونصف القطر حوالي 3 أميال:

المثال 5: استخدام عامل الاستعلام $geoNear

علاوة على ذلك، فإن مشغل $geoNear هو أيضًا مشغل جغرافي مكاني يُستخدم لخط أنابيب التجميع. يقوم بإجراء استعلام جغرافي مكاني وإرجاع المستندات التي تم فرزها حسب قربها من نقطة محددة. لقد قدمنا ​​هنا عامل التشغيل $geoNear والذي يتم استدعاؤه داخل مسار التجميع.

db.area.aggregate([
{
$جيونير: {
قريب: {نوع: 'نقطة' الإحداثيات: [ - 60.99279 , 30.719296 ] },
المسافة: 'المحسوبة' ,
أقصى مسافة: 2 ,
استعلام: {الفئة: 'حديقة' },
تشمل لوكس: 'موقع المنطقة' ,
كروية: صحيح
}
}
])

في المثال، نستدعي الطريقة التجميعية لـ MongoDB ونحدد عامل التشغيل $geoNear بداخلها. يتم تعيين عامل التشغيل $geoNear مع عدة معلمات لتحديد سلوك الاستعلام. أولاً، قمنا بتعيين المعلمة 'near' التي توفر قيم 'الإحداثيات' كنقطة مرجعية للبحث.

بعد ذلك، نستخدم معلمة 'distanceField' لتحديد الحقل المقدم كحقل النتيجة. يقوم حقل النتائج المحدد هذا بتخزين المسافة بين كل مستند والنقطة المرجعية. بعد ذلك، نحدد معلمة 'maxDistance' بقيمة '2' والتي تمثل الحد الأقصى للمسافة بالأمتار.

بعد ذلك، لدينا معلمة 'الاستعلام' التي تقوم بتصفية المستندات حسب حقل 'الفئة' وتأخذ في الاعتبار فقط المستندات التي تكون 'الفئة' فيها هي 'المتنزهات'. نقوم بعد ذلك باستدعاء المعلمة 'includeLocs' لاحتواء معلومات الموقع. قمنا أخيرًا بتحديد المعلمة 'الكروية' بالقيمة 'الحقيقية' التي تحسب المسافات باستخدام نظام إحداثيات كروي ثنائي الأبعاد.

يمثل خط أنابيب التجميع المستند الموجود في المخرجات والذي يعرض المعلومات مقابل المعلمة وفقًا لذلك. يعرض الحقل 'dist.calculated' التالي مسافة كل مستند من النقطة المرجعية:

خاتمة

لقد أدركنا أن القدرات الجغرافية المكانية لـ MongoDB تساعدنا على التعامل مع المعلومات المستندة إلى الموقع والاستعلام عنها بكفاءة. تعلمنا تنفيذ الخاصية الجيومكانية باستخدام عواملها المختلفة مع البرنامج المثالى. لدينا العديد من الوظائف والأساليب التي تعد مفيدة أيضًا لمجموعة واسعة من التطبيقات.