الاسم
ST_Distance — تُعيد المسافة بين قيمتين من نوع geometry أو geography.
المختصر
float ST_Distance(geometry g1, geometry g2);
float ST_Distance(geography geog1, geography geog2, boolean use_spheroid = true);
الوصف
بالنسبة لأنواع geometry تُعيد أقل مسافة ديكارتية (مستوية) ثنائية الأبعاد بين شكلين، بوحدات الإسقاط (وحدات النظام المرجعي المكاني).
بالنسبة لأنواع geography تُعيد افتراضيًا أقل مسافة جيوديسية بين قيمتين جغرافيتين بالمتر، محسوبةً على الشكل الإهليلجي الذي يحدده SRID. وإذا كانت use_spheroid بقيمة false، يُستخدم حساب كروي أسرع.
تطبّق هذه الدالة مواصفة OGC Simple Features Implementation Specification for SQL 1.1.
تطبّق هذه الدالة مواصفة SQL/MM. SQL-MM 3: 5.1.23
تدعم هذه الدالة الأقواس الدائرية (Circular Strings) والمنحنيات.
متاحة منذ: 1.5.0 أُضيف دعم geography في 1.5. وتحسينات في السرعة للحساب المستوي للتعامل بشكل أفضل مع الأشكال الكبيرة أو ذات الرؤوس الكثيرة
حُسّنت في: 2.1.0 تحسين سرعة geography. انظر جعل geography أسرع للتفاصيل.
حُسّنت في: 2.1.0 - أُضيف دعم الأشكال المنحنية.
حُسّنت في: 2.2.0 - يُجرى القياس على الشكل الإهليلجي باستخدام GeographicLib لتحسين الدقة والمتانة. يتطلب PROJ >= 4.9.0 للاستفادة من الميزة الجديدة.
تغيّرت في: 3.0.0 - لم تعد تعتمد على SFCGAL.
أمثلة geometry
مثال geometry - الوحدات بالدرجات المستوية؛ 4326 هو WGS 84 خط الطول وخط العرض، والوحدات درجات.
SELECT ST_Distance(
'SRID=4326;POINT(-72.1235 42.3521)'::geometry,
'SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry );
-----------------
0.00150567726382282
مثال geometry - الوحدات بالمتر (SRID: 3857، متناسبة مع البكسلات في خرائط الويب الشائعة). ورغم أن القيمة غير دقيقة، يمكن مقارنة القيم المتقاربة بشكل صحيح، مما يجعلها خيارًا جيدًا لخوارزميات مثل KNN أو KMeans.
SELECT ST_Distance(
ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 3857),
ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry, 3857) );
-----------------
167.441410065196
مثال geometry - الوحدات بالمتر (SRID: 3857 كما سبق، لكن مصحَّحة بـ cos(lat) لمراعاة التشوّه)
SELECT ST_Distance(
ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 3857),
ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry, 3857)
) * cosd(42.3521);
-----------------
123.742351254151
مثال geometry - الوحدات بالمتر (SRID: 26986 Massachusetts state plane بالمتر) (الأدق بالنسبة لماساتشوستس)
SELECT ST_Distance(
ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 26986),
ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry, 26986) );
-----------------
123.797937878454
مثال geometry - الوحدات بالمتر (SRID: 2163 US National Atlas Equal area) (الأقل دقة)
SELECT ST_Distance(
ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 2163),
ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry, 2163) );
------------------
126.664256056812
أمثلة geography
مماثل لمثال geometry لكن لاحظ أن الوحدات بالمتر - استخدم الكرة لحساب أسرع قليلًا وأقل دقة.
SELECT ST_Distance(gg1, gg2) As spheroid_dist, ST_Distance(gg1, gg2, false) As sphere_dist
FROM (SELECT
'SRID=4326;POINT(-72.1235 42.3521)'::geography as gg1,
'SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geography as gg2
) As foo ;
spheroid_dist | sphere_dist
------------------+------------------
123.802076746848 | 123.475736916397