GISarabia.org
PostGIS › الدليل الرسمي › 7. مرجع PostGIS › 7.14. معالجة الأشكال الهندسية
PostGIS 3.6 · Official Manual · ترجمة عربية

ST_Buffer

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

الاسم

ST_Buffer — تحسب شكلاً هندسياً يغطي جميع النقاط الواقعة ضمن مسافة معيّنة من شكل هندسي.

المختصر

geometry ST_Buffer(geometry g1, float radius_of_buffer, text buffer_style_parameters = '');

geometry ST_Buffer(geometry g1, float radius_of_buffer, integer num_seg_quarter_circle);

geography ST_Buffer(geography g1, float radius_of_buffer, text buffer_style_parameters);

geography ST_Buffer(geography g1, float radius_of_buffer, integer num_seg_quarter_circle);

الوصف

تحسب POLYGON أو MULTIPOLYGON يمثّل جميع النقاط التي تكون مسافتها من شكل geometry/geography أقل من مسافة معيّنة أو مساوية لها. المسافة السالبة تُقلّص الشكل بدلاً من توسيعه. وقد تُقلّص المسافة السالبة المضلع بالكامل، وفي هذه الحالة يُعاد POLYGON EMPTY. أما بالنسبة إلى النقاط والخطوط فإن المسافات السالبة تُعيد دائماً نتائج فارغة.

بالنسبة إلى geometry، تُحدَّد المسافة بوحدات النظام المرجعي المكاني للشكل الهندسي. وبالنسبة إلى geography، تُحدَّد المسافة بالأمتار.

يتحكم المعامل الثالث الاختياري في دقة النطاق العازل ونمطه. تُحدَّد دقة الأقواس الدائرية في النطاق العازل بعدد القطع المستقيمة المستخدمة لتقريب ربع دائرة (القيمة الافتراضية 8). ويمكن تحديد نمط النطاق العازل بتمرير قائمة من أزواج key=value مفصولة بمسافات كما يلي:

  • 'quad_segs=#' : عدد القطع المستقيمة المستخدمة لتقريب ربع دائرة (القيمة الافتراضية 8).

  • 'endcap=round|flat|square' : نمط الأطراف (القيمة الافتراضية "round"). تُقبل 'butt' مرادفاً لـ 'flat'.

  • 'join=round|mitre|bevel' : نمط الوصلات (القيمة الافتراضية "round"). تُقبل 'miter' مرادفاً لـ 'mitre'.

  • 'mitre_limit=#.#' : حد نسبة الوصلة المشطوفة الحادة (يؤثر فقط في نمط الوصلات mitre). تُقبل 'miter_limit' مرادفاً لـ 'mitre_limit'.

  • 'side=both|left|right' : تُنشئ 'left' أو 'right' نطاقاً عازلاً أحادي الجانب للشكل الهندسي، ويُحدَّد الجانب بالنسبة إلى اتجاه الخط. ينطبق هذا فقط على الأشكال من نوع LINESTRING ولا يؤثر في الأشكال من نوع POINT أو POLYGON. وتكون الأطراف افتراضياً مربّعة.

[ملاحظة]

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

[ملاحظة]

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

[ملاحظة]

يُستخدم النطاق العازل أحياناً لإجراء بحث ضمن مسافة معيّنة. وفي هذه الحالة يكون استخدام ST_DWithin أكفأ.

[ملاحظة]

تتجاهل هذه الدالة البعد Z. وتُعطي دائماً نتيجة ثنائية الأبعاد حتى عند استخدامها على شكل ثلاثي الأبعاد.

حُسّنت في: 2.5.0 - حُسّن دعم ST_Buffer لنوع geometry ليتيح تحديد جانب النطاق العازل side=both|left|right.

متاحة منذ: 1.5 - حُسّنت ST_Buffer لدعم أنماط مختلفة للأطراف والوصلات. وهذه مفيدة مثلاً لتحويل خطوط الطرق إلى طرق مضلّعة بحواف مسطّحة أو مربّعة بدلاً من الحواف المستديرة. وأُضيف غلاف رقيق لنوع geography.

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

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

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

أمثلة

quad_segs=8 (افتراضي)

SELECT ST_Buffer(
 ST_GeomFromText('POINT(100 90)'),
 50, 'quad_segs=8');
                

quad_segs=2 (رديء)

SELECT ST_Buffer(
 ST_GeomFromText('POINT(100 90)'),
 50, 'quad_segs=2');
                

endcap=round join=round (افتراضي)

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'endcap=round join=round');
                

endcap=square

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'endcap=square join=round');
                

endcap=flat

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'endcap=flat join=round');
                

join=bevel

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'join=bevel');
                

join=mitre mitre_limit=5.0 (حد mitre الافتراضي)

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'join=mitre mitre_limit=5.0');
                

join=mitre mitre_limit=1

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'join=mitre mitre_limit=1.0');
                

side=left

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'side=left');
                

side=right

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'side=right');
                

side=left join=mitre

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'side=left join=mitre');
                

اتجاه دوران يميني، حدود المضلع side=left

SELECT ST_Buffer(
ST_ForceRHR(
ST_Boundary(
 ST_GeomFromText(
'POLYGON ((50 50, 50 150, 150 150, 150 50, 50 50))'))),
 ), 20, 'side=left');
                

اتجاه دوران يميني، حدود المضلع side=right

SELECT ST_Buffer(
ST_ForceRHR(
ST_Boundary(
 ST_GeomFromText(
'POLYGON ((50 50, 50 150, 150 150, 150 50, 50 50))'))
), 20,'side=right')
                

--A buffered point approximates a circle
-- A buffered point forcing approximation of (see diagram)
-- 2 points per quarter circle is poly with 8 sides (see diagram)
SELECT ST_NPoints(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50)) As promisingcircle_pcount,
ST_NPoints(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 2)) As lamecircle_pcount;

promisingcircle_pcount | lamecircle_pcount
------------------------+-------------------
             33 |                9

--A lighter but lamer circle
-- only 2 points per quarter circle is an octagon
--Below is a 100 meter octagon
-- Note coordinates are in NAD 83 long lat which we transform
to Mass state plane meter and then buffer to get measurements in meters;
SELECT ST_AsText(ST_Buffer(
ST_Transform(
ST_SetSRID(ST_Point(-71.063526, 42.35785),4269), 26986)
,100,2)) As octagon;
----------------------
POLYGON((236057.59057465 900908.759918696,236028.301252769 900838.049240578,235
957.59057465 900808.759918696,235886.879896532 900838.049240578,235857.59057465
900908.759918696,235886.879896532 900979.470596815,235957.59057465 901008.759918
696,236028.301252769 900979.470596815,236057.59057465 900908.759918696))