24. التساوي

24.1. التساوي

قد يكون تحديد التساوي عند التعامل مع الأشكال الهندسية أمرًا صعبًا. يدعم PostGIS ثلاث دوال مختلفة يمكن استخدامها لتحديد مستويات مختلفة من التساوي، وإن كنا سنستخدم التعريفات أدناه من أجل الوضوح. ولتوضيح هذه الدوال، سنستخدم المضلعات التالية.

_images/polygon-table.png

تُحمَّل هذه المضلعات باستخدام الأوامر التالية.

CREATE TABLE polygons (id integer, name varchar, poly geometry);

INSERT INTO polygons VALUES
  (1, 'Polygon 1', 'POLYGON((-1 1.732,1 1.732,2 0,1 -1.732,
      -1 -1.732,-2 0,-1 1.732))'),
  (2, 'Polygon 2', 'POLYGON((-1 1.732,-2 0,-1 -1.732,1 -1.732,
      2 0,1 1.732,-1 1.732))'),
  (3, 'Polygon 3', 'POLYGON((1 -1.732,2 0,1 1.732,-1 1.732,
      -2 0,-1 -1.732,1 -1.732))'),
  (4, 'Polygon 4', 'POLYGON((-1 1.732,0 1.732, 1 1.732,1.5 0.866,
      2 0,1.5 -0.866,1 -1.732,0 -1.732,-1 -1.732,-1.5 -0.866,
      -2 0,-1.5 0.866,-1 1.732))'),
  (5, 'Polygon 5', 'POLYGON((-2 -1.732,2 -1.732,2 1.732,
      -2 1.732,-2 -1.732))');
_images/start13.png

24.1.1. التساوي التام

يُحدَّد التساوي التام بمقارنة شكلين هندسيين، رأسًا برأس وبالترتيب، للتأكد من تطابقهما في الموضع. وتُظهر الأمثلة التالية كيف يمكن أن تكون فعالية هذه الطريقة محدودة.

SELECT a.name, b.name,
  CASE WHEN ST_OrderingEquals(a.poly, b.poly)
       THEN 'Exactly Equal'
       ELSE 'Not Exactly Equal' END
  FROM polygons AS a, polygons AS b;
_images/start14.png

في هذا المثال، لا يساوي كل مضلع إلا نفسه، ولا يساوي المضلعات الأخرى التي تبدو مكافئة له (كما في حالة المضلعات من 1 إلى 3). ففي حالة المضلعات 1 و 2 و 3، تقع الرؤوس في مواضع متطابقة لكنها معرّفة بترتيبات مختلفة. أما المضلع 4 فله رؤوس واقعة على استقامة واحدة (وبالتالي زائدة) على أضلاع الشكل السداسي، مما يجعله غير مساوٍ للمضلع 1.

24.1.2. التساوي المكاني

كما رأينا أعلاه، لا يأخذ التساوي التام في الحسبان الطبيعة المكانية للأشكال الهندسية. وتتوفر دالة تحمل اسمًا مناسبًا هو ST_Equals لاختبار التساوي أو التكافؤ المكاني بين الأشكال الهندسية.

SELECT a.name, b.name,
  CASE WHEN ST_Equals(a.poly, b.poly)
       THEN 'Spatially Equal'
       ELSE 'Not Equal' END
  FROM polygons AS a, polygons AS b;
_images/start15.png

هذه النتائج أكثر انسجامًا مع فهمنا البديهي للتساوي. فالمضلعات من 1 إلى 4 تُعدّ متساوية، لأنها تحيط بالمساحة نفسها. لاحظ أنه لا اتجاه رسم المضلع، ولا نقطة البداية لتعريفه، ولا عدد النقاط المستخدمة مهم هنا. المهم هو أن تحتوي المضلعات على الحيز نفسه.

24.1.3. تساوي الحدود

يتطلب التساوي التام، في أسوأ الحالات، مقارنة كل رأس من رؤوس الشكل الهندسي لتحديد التساوي. وقد يكون هذا بطيئًا، وقد لا يكون مناسبًا لمقارنة أعداد ضخمة من الأشكال الهندسية. ولإتاحة مقارنة أسرع، يتوفر عامل تساوي الحدود ~=. ويعمل هذا العامل على المستطيل المحيط فقط، فيتحقق من أن الأشكال الهندسية تشغل الامتداد ثنائي الأبعاد نفسه، وليس بالضرورة الحيز نفسه.

SELECT a.name, b.name,
  CASE WHEN a.poly ~= b.poly
       THEN 'Equal Bounds'
       ELSE 'Non-equal Bounds' END
  FROM polygons AS a, polygons AS b;
_images/start17.png

كما ترى، فإن جميع أشكالنا الهندسية المتساوية مكانيًا لها أيضًا حدود متساوية. لكن للأسف يُعاد المضلع 5 أيضًا على أنه مساوٍ في هذا الاختبار، لأنه يشترك في المستطيل المحيط نفسه مع الأشكال الهندسية الأخرى. فما فائدة ذلك إذن؟ مع أن هذا سيُشرح بالتفصيل لاحقًا، فالإجابة المختصرة هي أن هذا يتيح استخدام الفهرسة المكانية التي يمكنها تقليص مجموعات المقارنة الضخمة بسرعة إلى كتل أسهل في الإدارة عند ربط البيانات أو ترشيحها.