GISarabia.org
PostGIS › الدليل الرسمي › 7. مرجع PostGIS › 7.10.2. عوامل المسافة
PostGIS 3.6 · Official Manual · ترجمة عربية

<->

الصفحة الأصلية بالإنجليزية postgis.net ↗

الاسم

<-> — تُعيد المسافة ثنائية الأبعاد بين A وB.

المختصر

double precision <->( geometry A , geometry B );

double precision <->( geography A , geography B );

الوصف

يُعيد العامل <-> المسافة ثنائية الأبعاد بين شكلين هندسيين. وعند استخدامه في عبارة "ORDER BY" يوفّر مجموعات نتائج لأقرب الجيران بمساعدة الفهرس. في إصدارات PostgreSQL الأقدم من 9.5 يعطي فقط المسافة بين مراكز المستطيلات المحيطة، أما في PostgreSQL 9.5+ فيُجري بحث KNN حقيقيًا عن المسافة يعطي المسافة الحقيقية بين الأشكال الهندسية، والمسافة الكروية لقيم geography.

[ملاحظة]

يستفيد هذا العامل من فهارس GiST ثنائية الأبعاد التي قد تكون متاحة على الأشكال الهندسية. ويختلف عن العوامل الأخرى التي تستخدم الفهارس المكانية في أن الفهرس المكاني لا يُستخدم إلا عندما يكون العامل في عبارة ORDER BY.

[ملاحظة]

لا يعمل الفهرس إلا إذا كان أحد الشكلين الهندسيين ثابتًا (ليس في استعلام فرعي/cte). مثلًا 'SRID=3005;POINT(1011102 450541)'::geometry بدلًا من a.geom

راجع ورشة عمل PostGIS: البحث عن أقرب الجيران للاطلاع على مثال مفصّل.

حُسّنت في: 2.2.0 -- سلوك KNN («أقرب K جار») الحقيقي لـ geometry وgeography في PostgreSQL 9.5+. لاحظ أن KNN في geography يعتمد على الكرة لا الإهليلج. في PostgreSQL 9.4 وما قبله، دعم geography جديد لكنه يدعم مراكز المستطيلات المحيطة فقط.

تغيّرت في: 2.2.0 -- لمستخدمي PostgreSQL 9.5، قد تكون الصيغة الهجينة القديمة أبطأ، لذا يُستحسن التخلص من هذا الالتفاف إذا كنت تشغّل شيفرتك على PostGIS 2.2+ مع 9.5+ فقط. انظر الأمثلة أدناه.

متاحة منذ: 2.0.0 -- يوفّر KNN الضعيف أقرب الجيران اعتمادًا على المسافات بين مراكز الأشكال الهندسية بدلًا من المسافات الحقيقية. النتائج دقيقة للنقاط وغير دقيقة لكل الأنواع الأخرى. متاح في PostgreSQL 9.1+

أمثلة

SELECT ST_Distance(geom, 'SRID=3005;POINT(1011102 450541)'::geometry) as d,edabbr, vaabbr
FROM va2005
ORDER BY d limit 10;

        d         | edabbr | vaabbr
------------------+--------+--------
                0 | ALQ    | 128
 5541.57712511724 | ALQ    | 129A
 5579.67450712005 | ALQ    | 001
  6083.4207708641 | ALQ    | 131
  7691.2205404848 | ALQ    | 003
 7900.75451037313 | ALQ    | 122
 8694.20710669982 | ALQ    | 129B
 9564.24289057111 | ALQ    | 130
  12089.665931705 | ALQ    | 127
 18472.5531479404 | ALQ    | 002
(10 rows)

ثم إجابة KNN الخام:

SELECT st_distance(geom, 'SRID=3005;POINT(1011102 450541)'::geometry) as d,edabbr, vaabbr
FROM va2005
ORDER BY geom <-> 'SRID=3005;POINT(1011102 450541)'::geometry limit 10;

        d         | edabbr | vaabbr
------------------+--------+--------
                0 | ALQ    | 128
 5541.57712511724 | ALQ    | 129A
 5579.67450712005 | ALQ    | 001
  6083.4207708641 | ALQ    | 131
  7691.2205404848 | ALQ    | 003
 7900.75451037313 | ALQ    | 122
 8694.20710669982 | ALQ    | 129B
 9564.24289057111 | ALQ    | 130
  12089.665931705 | ALQ    | 127
 18472.5531479404 | ALQ    | 002
(10 rows)

إذا نفّذت "EXPLAIN ANALYZE" على الاستعلامين فستلاحظ تحسنًا في الأداء في الاستعلام الثاني.

لمستخدمي PostgreSQL < 9.5، استخدم استعلامًا هجينًا للعثور على أقرب الجيران الحقيقيين. أولًا استعلام CTE يستخدم KNN بمساعدة الفهرس، ثم استعلام دقيق للحصول على الترتيب الصحيح:

WITH index_query AS (
  SELECT ST_Distance(geom, 'SRID=3005;POINT(1011102 450541)'::geometry) as d,edabbr, vaabbr
        FROM va2005
  ORDER BY geom <-> 'SRID=3005;POINT(1011102 450541)'::geometry LIMIT 100)
  SELECT *
        FROM index_query
  ORDER BY d limit 10;

        d         | edabbr | vaabbr
------------------+--------+--------
                0 | ALQ    | 128
 5541.57712511724 | ALQ    | 129A
 5579.67450712005 | ALQ    | 001
  6083.4207708641 | ALQ    | 131
  7691.2205404848 | ALQ    | 003
 7900.75451037313 | ALQ    | 122
 8694.20710669982 | ALQ    | 129B
 9564.24289057111 | ALQ    | 130
  12089.665931705 | ALQ    | 127
 18472.5531479404 | ALQ    | 002
(10 rows)


انظر أيضًا

ST_DWithin, ST_Distance, <#>