GISarabia.org
PostGIS › الدليل الرسمي › 7. مرجع PostGIS › 7.19. الإسناد الخطي
PostGIS 3.6 · Official Manual · ترجمة عربية

ST_LineSubstring

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

الاسم

ST_LineSubstring — تُعيد جزء الخط الواقع بين موقعين كسريين.

المختصر

geometry ST_LineSubstring(geometry a_linestring, float8 startfraction, float8 endfraction);

geography ST_LineSubstring(geography a_linestring, float8 startfraction, float8 endfraction);

الوصف

تحسب الخط الذي يمثّل مقطعًا من الخط المُدخل يبدأ وينتهي عند الموقعين الكسريين المعطيين. يجب أن يكون الوسيط الأول LINESTRING. والوسيطان الثاني والثالث قيمتان في النطاق [0, 1] تمثّلان موقعي البداية والنهاية كنسبتين من طول الخط. وتُستكمَل قيم Z وM لنقاط النهاية المضافة إن وُجدت.

إذا كانت startfraction وendfraction بالقيمة نفسها فإن ذلك يكافئ ST_LineInterpolatePoint.

[ملاحظة]

لا يعمل هذا إلا مع LINESTRING. ولاستخدامه على MULTILINESTRING متصلة، ادمجها أولًا باستخدام ST_LineMerge.

[ملاحظة]

منذ الإصدار 1.1.1 تستكمل هذه الدالة قيم M وZ. وكانت الإصدارات السابقة تضبط Z وM على قيم غير محددة.

حُسّنت في: 3.4.0 - أُضيف دعم geography.

تغيّرت في: 2.1.0. حتى الإصدار 2.0.x كانت تُسمّى ST_Line_Substring.

متاحة منذ: 1.1.0، وأُضيف دعم Z وM في 1.1.1

تدعم هذه الدالة الأبعاد الثلاثية ولا تُسقط قيمة Z.

أمثلة

خط (LineString) يظهر فوقه الثلث الأوسط (0.333, 0.666)

SELECT ST_AsText(ST_LineSubstring( 'LINESTRING (20 180, 50 20, 90 80, 120 40, 180 150)', 0.333, 0.666));
------------------------------------------------------------------------------------------------
LINESTRING (45.17311810399485 45.74337011202746, 50 20, 90 80, 112.97593050157862 49.36542599789519)

إذا كان موقعا البداية والنهاية متطابقين، يكون الناتج POINT.

SELECT ST_AsText(ST_LineSubstring( 'LINESTRING(25 50, 100 125, 150 190)', 0.333, 0.333));
------------------------------------------
 POINT(69.2846934853974 94.2846934853974)

استعلام لتقطيع LineString إلى مقاطع طولها 100 أو أقل. يستخدم generate_series() مع CROSS JOIN LATERAL لإنتاج ما يكافئ حلقة FOR.


WITH data(id, geom) AS (VALUES
        ( 'A', 'LINESTRING( 0 0, 200 0)'::geometry ),
        ( 'B', 'LINESTRING( 0 100, 350 100)'::geometry ),
        ( 'C', 'LINESTRING( 0 200, 50 200)'::geometry )
    )
SELECT id, i,
       ST_AsText( ST_LineSubstring( geom, startfrac, LEAST( endfrac, 1 )) ) AS geom
FROM (
    SELECT id, geom, ST_Length(geom) len, 100 sublen FROM data
    ) AS d
CROSS JOIN LATERAL (
    SELECT i, (sublen * i) / len AS startfrac,
              (sublen * (i+1)) / len AS endfrac
    FROM generate_series(0, floor( len / sublen )::integer ) AS t(i)
    -- skip last i if line length is exact multiple of sublen
    WHERE (sublen * i) / len <
> 1.0
    ) AS d2;

 id | i |            geom
----+---+-----------------------------
 A  | 0 | LINESTRING(0 0,100 0)
 A  | 1 | LINESTRING(100 0,200 0)
 B  | 0 | LINESTRING(0 100,100 100)
 B  | 1 | LINESTRING(100 100,200 100)
 B  | 2 | LINESTRING(200 100,300 100)
 B  | 3 | LINESTRING(300 100,350 100)
 C  | 0 | LINESTRING(0 200,50 200)

تقيس صيغة geography على امتداد شكل إهليلجي (spheroid)، وتقيس صيغة geometry على امتداد خط

SELECT ST_AsText(ST_LineSubstring( 'LINESTRING(-118.2436 34.0522, -71.0570 42.3611)'::geography, 0.333, 0.666),6) AS geog_sub
 , ST_AsText(ST_LineSubstring('LINESTRING(-118.2436 34.0522, -71.0570 42.3611)'::geometry, 0.333, 0.666),6) AS geom_sub;
---------------------------------------------------------------
geog_sub | LINESTRING(-104.167064 38.854691,-87.674646 41.849854)
geom_sub | LINESTRING(-102.530462 36.819064,-86.817324 39.585927)