مشاركة عبر


دعم الاستعلامات الجغرافية المكانية

يمكن الآن تخزين البيانات الجغرافية المكانية والاستعلامات باستخدام Azure DocumentDB. يوفر هذا التحسين أدوات قوية لإدارة البيانات المكانية وتحليلها، ما يتيح مجموعة واسعة من التطبيقات مثل تتبع الموقع في الوقت الحقيقي، وتحسين المسار، والتحليلات المكانية.

فيما يلي نظرة عامة سريعة على الأوامر الجغرافية المكانية وعوامل التشغيل المدعومة الآن:

عوامل تشغيل الاستعلام الجيوفضائي

$geoIntersects

تحديد المستندات التي تتقاطع فيها هندسة محددة مع هندسة المستندات. مفيدة للعثور على المستندات التي تشترك في أي جزء من المساحة مع هندسة معينة.

   db.collection.find({
       location: {
           $geoIntersects: {
               $geometry: {
                   type: "<GeoJSON object type>",
                   coordinates: [[[...], [...], [...], [...]]]
               }
           }
       }
   })

$geoWithin

تحديد المستندات التي تتضمن بيانات جغرافية مكانية موجودة بالكامل داخل شكل محدد. يتم استخدام عامل التشغيل هذا للبحث عن المستندات داخل منطقة محددة.

   db.collection.find({
       location: {
           $geoWithin: {
               $geometry: {
                   type: "Polygon",
                   coordinates: [[[...], [...], [...], [...]]]
               }
           }
       }
   })

$box

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

  db.collection.find({
      location: {
          $geoWithin: {
              $box: [[lowerLeftLong, lowerLeftLat], [upperRightLong, upperRightLat]]
          }
      }
  })

$center

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

  db.collection.find({
      location: {
          $geoWithin: {
              $center: [[longitude, latitude], radius]
          }
      }
  })

$centerSphere

على $centerغرار ، ولكنه يحدد منطقة كروية باستخدام نقطة مركزية ونصف قطر بالتقدير الدائري. مفيد لحسابات الهندسة الكروية.

  db.collection.find({
      location: {
          $geoWithin: {
              $centerSphere: [[longitude, latitude], radius]
          }
      }
  })

$geometry

تحديد كائن GeoJSON لتعريف هندسة. يستخدم مع عوامل التشغيل الجغرافية المكانية لتنفيذ الاستعلامات استنادا إلى الأشكال المعقدة.

  db.collection.find({
      location: {
          $geoIntersects: {
              $geometry: {
                  type: "<GeoJSON object type>",
                  coordinates: [longitude, latitude]
              }
          }
      }
  })

$maxDistance

تحديد أقصى مسافة من نقطة لاستعلام جيوفضائي. يستخدم مع $near و $nearSphere عوامل التشغيل. على سبيل المثال، العثور على جميع المواقع ضمن 2 كم من نقطة معينة.

  db.collection.find({
      location: {
          $near: {
              $geometry: {
                  type: "Point",
                  coordinates: [longitude, latitude]
              },
              $maxDistance: distance
          }
      }
  })

$minDistance

تحديد الحد الأدنى للمسافة من نقطة لاستعلام جيوفضائي. يستخدم مع $near و $nearSphere عوامل التشغيل.

  db.collection.find({
      location: {
          $near: {
              $geometry: {
                  type: "Point",
                  coordinates: [longitude, latitude]
              },
              $minDistance: distance
          }
      }
  })

$polygon

تعريف مضلع باستخدام صفيف من أزواج الإحداثيات. يستخدم مع $geoWithin عامل التشغيل للعثور على المستندات داخل هذا المضلع.

  db.collection.find({
      location: {
          $geoWithin: {
              $geometry: {
                  type: "Polygon",
                  coordinates: [[[...], [...], [...], [...]]]
              }
          }
      }
  })

$near

البحث عن المستندات القريبة من نقطة محددة. إرجاع المستندات التي تم فرزها حسب المسافة من النقطة. على سبيل المثال، العثور على أقرب المطاعم إلى موقع المستخدم.

    db.collection.find({
        location: {
            $near: {
                $geometry: {
                    type: "Point",
                    coordinates: [longitude, latitude]
                },
                $maxDistance: distance
            }
        }
    })

$nearSphere

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

    db.collection.find({
        location: {
            $nearSphere: {
                $geometry: {
                    type: "Point",
                    coordinates: [longitude, latitude]
                },
                $maxDistance: distance
            }
        }
    })

مرحلة التجميع الجيوفضائي

$geoNear

تنفيذ استعلام جيوفضائي لإرجاع المستندات التي تم فرزها حسب المسافة من نقطة محددة. يمكن أن تتضمن معايير استعلام إضافية وإرجاع معلومات المسافة.

  db.collection.aggregate([
      {
          $geoNear: {
              near: {
                  type: "Point",
                  coordinates: [longitude, latitude]
              },
              distanceField: "distance",
              spherical: true
          }
      }
  ])

الاعتبارات والقدرات غير المدعومة

  • حاليا، الاستعلام باستخدام مضلع GeoJSON ذو حلقة واحدة تتجاوز مساحته نصف الكرة الواحد غير مدعوم. في مثل هذه الحالات، يقوم Azure DocumentDB بإرجاع رسالة الخطأ التالية:

    Error: Custom CRS for big polygon is not supported yet.
    
  • لا يسمح بفهرس مركب يستخدم فهرسا عاديا ومؤشرا جغرافيا مكانيا. على سبيل المثال:

    db.collection.createIndex({a: "2d", b: 1});
    Error: Compound 2d indexes are not supported yet
    
  • المضلعات ذات الثقوب غير مدعومة حاليا للاستخدام مع استعلامات $geoWithin. على الرغم من أن إدراج مضلع به ثقوب غير مقيد، فإنه يفشل في النهاية مع رسالة الخطأ التالية:

    Error: $geoWithin currently doesn't support polygons with holes
    
  • حقل المفتاح مطلوب دائما في مرحلة التجميع $geoNear. إذا كان حقل المفتاح مفقودا، يحدث الخطأ التالي:

    Error: $geoNear requires a 'key' option as a String
    
  • $geoNear $nearلا تحتوي المراحل و و $nearSphere على متطلبات فهرس صارمة، لذلك لن تفشل هذه الاستعلامات إذا كان الفهرس مفقودا.