وظائف OData الجغرافية المكانية في Azure الذكاء الاصطناعي Search - geo.distance و geo.intersects

يدعم Azure الذكاء الاصطناعي Search الاستعلامات الجغرافية المكانية في تعبيرات عامل تصفية OData عبر geo.distance الدالتين و geo.intersects . geo.distance ترجع الدالة المسافة بالكيلومترات بين نقطتين، واحدة هي متغير حقل أو نطاق، والأخرى ثابتة تم تمريرها كجزء من عامل التصفية. geo.intersects ترجع true الدالة إذا كانت نقطة معينة داخل مضلع معين، حيث تكون النقطة عبارة عن متغير حقل أو نطاق ويتم تحديد المضلع كثابت تم تمريره كجزء من عامل التصفية.

geo.distance يمكن أيضا استخدام الدالة في المعلمة $orderby لفرز نتائج البحث حسب المسافة من نقطة معينة. بناء الجملة ل geo.distance في $orderby هو نفسه كما هو في $filter. عند استخدام geo.distance في $orderby، يجب أن يكون الحقل الذي ينطبق عليه من النوع Edm.GeographyPoint ويجب أن يكون أيضا قابلا للفرز.

إشعار

عند استخدام geo.distance في المعلمة $orderby ، يجب أن يحتوي الحقل الذي تمرره إلى الدالة على نقطة جغرافية واحدة فقط. بمعنى آخر، يجب أن يكون من النوع Edm.GeographyPoint وليس Collection(Edm.GeographyPoint). لا يمكن الفرز على حقول المجموعة في Azure الذكاء الاصطناعي Search.

بناء الجملة

يحدد EBNF التالي (نموذج Backus-Naur الموسع) التدقيق النحوي للدالتين geo.distance و geo.intersects ، بالإضافة إلى القيم الجغرافية المكانية التي تعمل عليها:

geo_distance_call ::=
    'geo.distance(' variable ',' geo_point ')'
    | 'geo.distance(' geo_point ',' variable ')'

geo_point ::= "geography'POINT(" lon_lat ")'"

lon_lat ::= float_literal ' ' float_literal

geo_intersects_call ::=
    'geo.intersects(' variable ',' geo_polygon ')'

/* You need at least four points to form a polygon, where the first and
last points are the same. */
geo_polygon ::=
    "geography'POLYGON((" lon_lat ',' lon_lat ',' lon_lat ',' lon_lat_list "))'"

lon_lat_list ::= lon_lat(',' lon_lat)*

يتوفر أيضا رسم تخطيطي تفاعلي لبناء الجملة:

مسافة جغرافية

geo.distance تأخذ الدالة معلمتين من النوع Edm.GeographyPoint وترجع Edm.Double قيمة هي المسافة بينهما بالكيلومترات. يختلف هذا عن الخدمات الأخرى التي تدعم عمليات OData الجغرافية المكانية، والتي عادة ما ترجع المسافات بالعدادات.

يجب أن تكون إحدى المعلمات التي يجب أن geo.distance تكون ثابت نقطة جغرافية، والأخرى يجب أن تكون مسار حقل (أو متغير نطاق في حالة تكرار عامل تصفية عبر حقل من النوع Collection(Edm.GeographyPoint)). لا يهم ترتيب هذه المعلمات.

ثابت النقطة الجغرافية هو من الشكل geography'POINT(<longitude> <latitude>)'، حيث خط الطول وخط العرض هما ثوابت رقمية.

إشعار

عند استخدام geo.distance في عامل تصفية، يجب مقارنة المسافة التي تم إرجاعها بواسطة الدالة مع ثابت باستخدام ltأو legtأو أو ge. عوامل التشغيل eq و ne غير مدعومة عند مقارنة المسافات. على سبيل المثال، هذا هو الاستخدام الصحيح ل geo.distance: $filter=geo.distance(location, geography'POINT(-122.131577 47.678581)') le 5.

geo.intersects

geo.intersects تأخذ الدالة متغيرا من النوع Edm.GeographyPoint والثابت Edm.GeographyPolygon وترجعtrueEdm.Boolean -- إذا كانت النقطة ضمن حدود المضلع، false وإلا.

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

الاستعلامات الجغرافية المكانية والمضلعات التي تمتد عبر خط الطول 180

بالنسبة للعديد من مكتبات الاستعلام الجغرافية المكانية التي تقوم بصياغة استعلام يتضمن خط الطول 180 (بالقرب من خط التاريخ) إما خارج الحدود أو يتطلب حلا، مثل تقسيم المضلع إلى اثنين، أحدهما على جانبي خط الطول.

في Azure الذكاء الاصطناعي Search، ستعمل الاستعلامات الجغرافية المكانية التي تتضمن خط طول 180 درجة كما هو متوقع إذا كان شكل الاستعلام مستطيلا ومحاذاة الإحداثيات الخاصة بك إلى تخطيط شبكة على طول خط الطول وخط العرض (على سبيل المثال، geo.intersects(location, geography'POLYGON((179 65, 179 66, -179 66, -179 65, 179 65))'). بخلاف ذلك، بالنسبة للأشكال غير المستطيلة أو غير المنسدلة، ضع في اعتبارك نهج المضلع المنقسم.

وظائف جغرافية مكانية و null

مثل جميع الحقول الأخرى غير المجمعة في Azure الذكاء الاصطناعي Search، يمكن أن تحتوي الحقول من النوع Edm.GeographyPoint على null قيم. عندما يتم تقييم geo.intersects Azure الذكاء الاصطناعي Search لحقل هو null، ستكون النتيجة دائما false. يعتمد سلوك geo.distance في هذه الحالة على السياق:

  • في عوامل التصفية، geo.distancenull ينتج عن nullحقل . وهذا يعني أن المستند لن يتطابق لأنه null مقارنة بأي قيمة غير خالية يتم تقييمها إلى false.
  • عند فرز النتائج باستخدام $orderby، geo.distancenull ينتج عن حقل أقصى مسافة ممكنة. سيتم فرز المستندات التي تتضمن مثل هذا الحقل بشكل أقل من كافة الحقول الأخرى عند استخدام اتجاه asc الفرز (الافتراضي)، وأعلى من كافة الحقول الأخرى عندما يكون descالاتجاه .

الأمثلة

أمثلة التصفية

البحث عن جميع الفنادق في غضون 10 كيلومترات من نقطة مرجعية معينة (حيث الموقع هو حقل من نوع Edm.GeographyPoint):

    geo.distance(location, geography'POINT(-122.131577 47.678581)') le 10

ابحث عن جميع الفنادق داخل منفذ عرض معين موصوف على أنه مضلع (حيث الموقع هو حقل من النوع Edm.GeographyPoint). لاحظ أن المضلع مغلق (يجب أن تكون مجموعتي النقطة الأولى والأخيرة هي نفسها) ويجب إدراج النقاط بترتيب عكس اتجاه عقارب الساعة.

    geo.intersects(location, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))')

أمثلة حسب الطلب

فرز الفنادق تنازليا حسب rating، ثم تصاعديا حسب المسافة عن الإحداثيات المحددة:

    rating desc,geo.distance(location, geography'POINT(-122.131577 47.678581)') asc

فرز الفنادق بترتيب تنازلي حسب search.score و rating، ثم بترتيب تصاعدي حسب المسافة عن الإحداثيات المحددة بحيث يتم إدراج أقرب فندق بين فندقين بتصنيفات متطابقة أولا:

    search.score() desc,rating desc,geo.distance(location, geography'POINT(-122.131577 47.678581)') asc

الخطوات التالية