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

ST_Intersection

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

الاسم

ST_Intersection — تحسب شكلاً هندسياً يمثّل الجزء المشترك بين الشكلين A وB.

المختصر

geometry ST_Intersection( geometry geomA , geometry geomB , float8 gridSize = -1 );

geography ST_Intersection( geography geogA , geography geogB );

الوصف

تُعيد شكلاً هندسياً يمثّل تقاطع مجموعتي النقاط لشكلين هندسيين. بعبارة أخرى، ذلك الجزء من الشكل A والشكل B المشترك بين الشكلين.

إذا لم يكن بين الشكلين أي نقاط مشتركة (أي كانا منفصلين) فتُعاد هندسة ذرّية فارغة من النوع المناسب.

إذا أُعطي المعامل الاختياري gridSize (يتطلب GEOS-3.9.0 أو أحدث)، فمن المضمون أن تقع جميع رؤوس النتيجة على شبكة بالحجم المحدد. ولكي تعطي العملية نتائج متوقعة يجب أن تقع جميع رؤوس المدخلات مسبقًا على الشبكة المحددة، انظر ST_ReducePrecision.

تفيد ST_Intersection مع ST_Intersects في قصّ الأشكال الهندسية، كما في استعلامات المستطيل المحيط أو النطاق العازل أو المنطقة، حين لا تحتاج إلا إلى جزء الشكل الواقع داخل دولة أو منطقة اهتمام.

[ملاحظة]

بالنسبة إلى geography، هذه الدالة غلاف رقيق حول تطبيق geometry. تحدد أولاً أنسب SRID يلائم المستطيل المحيط بكائني geography (إذا كان الكائنان ضمن نصف نطاق UTM لكن ليس في نطاق UTM نفسه فستختار أحدهما) (مع تفضيل UTM أو إسقاط Lambert السمتي متساوي المساحة (LAEA) للقطب الشمالي/الجنوبي، والرجوع إلى مركاتور في أسوأ الحالات)، ثم تُجري التقاطع في ذلك النظام المرجعي المستوي الأنسب وتُعيد التحويل إلى geography بنظام WGS84.

[تنبيه]

تُسقط هذه الدالة قيم إحداثي M إن وُجدت.

[تنبيه]

إذا كنت تعمل بأشكال هندسية ثلاثية الأبعاد، فقد ترغب في استخدام ST_3DIntersection المعتمدة على SFGCAL، والتي تُجري تقاطعاً ثلاثي الأبعاد صحيحاً للأشكال ثلاثية الأبعاد. ومع أن هذه الدالة تعمل مع إحداثي Z، فإنها تأخذ متوسط قيم إحداثي Z.

تُنفَّذ بواسطة وحدة GEOS

حُسّنت في: 3.1.0 أصبحت تقبل المعامل gridSize

تتطلب GEOS >= 3.9.0 لاستخدام المعامل gridSize

تغيّرت في: 3.0.0 لم تعد تعتمد على SFCGAL.

متاحة منذ: 1.5 أُضيف دعم نوع البيانات geography.

تطبّق هذه الدالة مواصفة OGC Simple Features Implementation Specification for SQL 1.1. s2.1.1.3

تطبّق هذه الدالة مواصفة SQL/MM. SQL-MM 3: 5.1.18

تدعم هذه الدالة الأبعاد الثلاثية ولا تُسقط قيمة Z. غير أن النتيجة تُحسب باستخدام XY فقط. وتُنسخ قيم Z في النتيجة أو يُحسب متوسطها أو تُستوفى.

أمثلة

SELECT ST_AsText(ST_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 2 0, 0 2 )'::geometry));
 st_astext
---------------
GEOMETRYCOLLECTION EMPTY

SELECT ST_AsText(ST_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry));
 st_astext
---------------
POINT(0 0)

قصّ جميع الخطوط (المسارات) حسب الدولة. نفترض هنا أن الشكل الهندسي للدول من نوع POLYGON أو MULTIPOLYGON. ملاحظة: نحتفظ فقط بالتقاطعات التي ينتج عنها LINESTRING أو MULTILINESTRING لأننا لا نهتم بالمسارات التي تشترك في نقطة فقط. يلزم التفريغ (dump) لتفكيك مجموعة الأشكال إلى أجزاء MULT* منفردة. المثال أدناه عام إلى حد ما، ويعمل مع المضلعات وغيرها بمجرد تغيير شرط WHERE.

select clipped.gid, clipped.f_name, clipped_geom
from (
         select trails.gid, trails.f_name,
             (ST_Dump(ST_Intersection(country.geom, trails.geom))).geom clipped_geom
         from country
              inner join trails on ST_Intersects(country.geom, trails.geom)
     ) as clipped
where ST_Dimension(clipped.clipped_geom) = 1;

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

select poly.gid,
    ST_Multi(
        ST_Buffer(
            ST_Intersection(country.geom, poly.geom),
            0.0
        )
    ) clipped_geom
from country
     inner join poly on ST_Intersects(country.geom, poly.geom)
where not ST_IsEmpty(ST_Buffer(ST_Intersection(country.geom, poly.geom), 0.0));

أمثلة: شبه 2.5D

لاحظ أن هذا ليس تقاطعاً حقيقياً، قارنه بالمثال نفسه باستخدام ST_3DIntersection.

select ST_AsText(ST_Intersection(linestring, polygon)) As wkt
from  ST_GeomFromText('LINESTRING Z (2 2 6,1.5 1.5 7,1 1 8,0.5 0.5 8,0 0 10)') AS linestring
 CROSS JOIN ST_GeomFromText('POLYGON((0 0 8, 0 1 8, 1 1 8, 1 0 8, 0 0 8))') AS polygon;

               st_astext
---------------------------------------
 LINESTRING Z (1 1 8,0.5 0.5 8,0 0 10)