الاسم
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 في قصّ الأشكال الهندسية، كما في استعلامات المستطيل المحيط أو النطاق العازل أو المنطقة، حين لا تحتاج إلا إلى جزء الشكل الواقع داخل دولة أو منطقة اهتمام.
|
|
|
|
|
|
|
تُسقط هذه الدالة قيم إحداثي 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)
