وظائف 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)*
يتوفر أيضا رسم تخطيطي تفاعلي لبناء الجملة:
إشعار
راجع مرجع بناء جملة تعبير OData ل Azure الذكاء الاصطناعي البحث عن EBNF الكامل.
مسافة جغرافية
geo.distance
تأخذ الدالة معلمتين من النوع Edm.GeographyPoint
وترجع Edm.Double
قيمة هي المسافة بينهما بالكيلومترات. يختلف هذا عن الخدمات الأخرى التي تدعم عمليات OData الجغرافية المكانية، والتي عادة ما ترجع المسافات بالعدادات.
يجب أن تكون إحدى المعلمات التي يجب أن geo.distance
تكون ثابت نقطة جغرافية، والأخرى يجب أن تكون مسار حقل (أو متغير نطاق في حالة تكرار عامل تصفية عبر حقل من النوع Collection(Edm.GeographyPoint)
). لا يهم ترتيب هذه المعلمات.
ثابت النقطة الجغرافية هو من الشكل geography'POINT(<longitude> <latitude>)'
، حيث خط الطول وخط العرض هما ثوابت رقمية.
إشعار
عند استخدام geo.distance
في عامل تصفية، يجب مقارنة المسافة التي تم إرجاعها بواسطة الدالة مع ثابت باستخدام lt
أو le
gt
أو أو 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
وترجعtrue
Edm.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.distance
null
ينتج عنnull
حقل . وهذا يعني أن المستند لن يتطابق لأنهnull
مقارنة بأي قيمة غير خالية يتم تقييمها إلىfalse
. - عند فرز النتائج باستخدام $orderby،
geo.distance
null
ينتج عن حقل أقصى مسافة ممكنة. سيتم فرز المستندات التي تتضمن مثل هذا الحقل بشكل أقل من كافة الحقول الأخرى عند استخدام اتجاه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