الاسم
ST_OffsetCurve — تُعيد خطاً مُزاحاً على مسافة وجانب معيّنين من خط مُدخل.
المختصر
geometry ST_OffsetCurve(geometry line, float signed_distance, text style_parameters='');
الوصف
تُعيد خطاً مُزاحاً على مسافة وجانب معيّنين من خط مُدخل. لا تبعد أي نقطة من نقاط الأشكال المُعادة عن الشكل المُدخل أكثر من المسافة المعطاة. وهي مفيدة لحساب خطوط موازية حول خط مركزي.
عند المسافة الموجبة تكون الإزاحة على الجانب الأيسر للخط المُدخل وتحتفظ بالاتجاه نفسه. وعند المسافة السالبة تكون على الجانب الأيمن وفي الاتجاه المعاكس.
تُقاس وحدات المسافة بوحدات النظام المرجعي المكاني.
لاحظ أن الناتج قد يكون MULTILINESTRING أو EMPTY لبعض الأشكال المُدخلة المتعرّجة.
يتيح المعامل الثالث الاختياري تحديد قائمة من أزواج key=value مفصولة بمسافات لضبط العمليات كما يلي:
-
'quad_segs=#' : عدد القطع المستخدمة لتقريب ربع دائرة (القيمة الافتراضية 8).
-
'join=round|mitre|bevel' : نمط الوصلات (القيمة الافتراضية "round"). تُقبل 'miter' أيضاً مرادفاً لـ 'mitre'.
-
'mitre_limit=#.#' : حد نسبة الوصلة الحادة (يؤثر فقط في نمط الوصلات mitre). تُقبل 'miter_limit' أيضاً مرادفاً لـ 'mitre_limit'.
تُنفَّذ بواسطة وحدة GEOS.
تغيّر السلوك في GEOS 3.11 بحيث أصبحت المنحنيات المُزاحة بالاتجاه نفسه للخط المُدخل، للإزاحات الموجبة والسالبة على حد سواء.
متاحة منذ: 2.0
حُسّنت في: 2.5 - أُضيف دعم GEOMETRYCOLLECTION وMULTILINESTRING
|
|
|
تتجاهل هذه الدالة البعد Z. وتُعطي دائماً نتيجة ثنائية الأبعاد حتى عند استخدامها على شكل ثلاثي الأبعاد. |
أمثلة
حساب نطاق عازل مفتوح حول الطرق
SELECT ST_Union(
ST_OffsetCurve(f.geom, f.width/2, 'quad_segs=4 join=round'),
ST_OffsetCurve(f.geom, -f.width/2, 'quad_segs=4 join=round')
) as track
FROM someroadstable;
15, 'quad_segs=4 join=round' الخط الأصلي وإزاحته بمقدار 15 وحدة.
SELECT ST_AsText(ST_OffsetCurve(ST_GeomFromText(
'LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
44 16,24 16,20 16,18 16,17 17,
16 18,16 20,16 40,16 60,16 80,16 100,
16 120,16 140,16 160,16 180,16 195)'),
15, 'quad_segs=4 join=round'));
output
LINESTRING(164 1,18 1,12.2597485145237 2.1418070123307,
7.39339828220179 5.39339828220179,
5.39339828220179 7.39339828220179,
2.14180701233067 12.2597485145237,1 18,1 195)
|
-15, 'quad_segs=4 join=round' الخط الأصلي وإزاحته بمقدار -15 وحدة
SELECT ST_AsText(ST_OffsetCurve(geom,
-15, 'quad_segs=4 join=round')) As notsocurvy
FROM ST_GeomFromText(
'LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
44 16,24 16,20 16,18 16,17 17,
16 18,16 20,16 40,16 60,16 80,16 100,
16 120,16 140,16 160,16 180,16 195)') As geom;
notsocurvy
LINESTRING(31 195,31 31,164 31)
|
إزاحة مزدوجة للحصول على انحناء أكبر، لاحظ أن الأولى تعكس الاتجاه، لذا -30 + 15 = -15
SELECT ST_AsText(ST_OffsetCurve(ST_OffsetCurve(geom,
-30, 'quad_segs=4 join=round'), -15, 'quad_segs=4 join=round')) As morecurvy
FROM ST_GeomFromText(
'LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
44 16,24 16,20 16,18 16,17 17,
16 18,16 20,16 40,16 60,16 80,16 100,
16 120,16 140,16 160,16 180,16 195)') As geom;
morecurvy
LINESTRING(164 31,46 31,40.2597485145236 32.1418070123307,
35.3933982822018 35.3933982822018,
32.1418070123307 40.2597485145237,31 46,31 195)
|
إزاحة مزدوجة للحصول على انحناء أكبر، مدموجة مع إزاحة عادية بمقدار 15 للحصول على خطوط متوازية. معروضة فوق الخط الأصلي.
SELECT ST_AsText(ST_Collect(
ST_OffsetCurve(geom, 15, 'quad_segs=4 join=round'),
ST_OffsetCurve(ST_OffsetCurve(geom,
-30, 'quad_segs=4 join=round'), -15, 'quad_segs=4 join=round')
)
) As parallel_curves
FROM ST_GeomFromText(
'LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
44 16,24 16,20 16,18 16,17 17,
16 18,16 20,16 40,16 60,16 80,16 100,
16 120,16 140,16 160,16 180,16 195)') As geom;
parallel curves
MULTILINESTRING((164 1,18 1,12.2597485145237 2.1418070123307,
7.39339828220179 5.39339828220179,5.39339828220179 7.39339828220179,
2.14180701233067 12.2597485145237,1 18,1 195),
(164 31,46 31,40.2597485145236 32.1418070123307,35.3933982822018 35.3933982822018,
32.1418070123307 40.2597485145237,31 46,31 195))
|
15, 'quad_segs=4 join=bevel' معروضة مع الخط الأصلي
SELECT ST_AsText(ST_OffsetCurve(ST_GeomFromText(
'LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
44 16,24 16,20 16,18 16,17 17,
16 18,16 20,16 40,16 60,16 80,16 100,
16 120,16 140,16 160,16 180,16 195)'),
15, 'quad_segs=4 join=bevel'));
output
LINESTRING(164 1,18 1,7.39339828220179 5.39339828220179,
5.39339828220179 7.39339828220179,1 18,1 195)
|
15,-15 مجمّعتان، join=mitre mitre_limit=2.1
SELECT ST_AsText(ST_Collect(
ST_OffsetCurve(geom, 15, 'quad_segs=4 join=mitre mitre_limit=2.2'),
ST_OffsetCurve(geom, -15, 'quad_segs=4 join=mitre mitre_limit=2.2')
) )
FROM ST_GeomFromText(
'LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
44 16,24 16,20 16,18 16,17 17,
16 18,16 20,16 40,16 60,16 80,16 100,
16 120,16 140,16 160,16 180,16 195)') As geom;
output
MULTILINESTRING((164 1,11.7867965644036 1,1 11.7867965644036,1 195),
(31 195,31 31,164 31))
|