GISarabia.org
PostGIS › الدليل الرسمي › 11. مرجع الرستر › 11.12. معالجة الرستر: جبر الخرائط (Map Algebra)
PostGIS 3.6 · Official Manual · ترجمة عربية

ST_MapAlgebraExpr

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

الاسم

ST_MapAlgebraExpr — نسخة نطاقي رستر: تُنشئ رسترًا جديدًا بنطاق واحد يتكون بتطبيق عملية جبرية صالحة في PostgreSQL على نطاقي الرسترين المُدخلين وبنوع البكسل المقدَّم. يُفترض النطاق 1 من كل رستر إذا لم تُحدَّد أرقام النطاقات. سيُحاذى الرستر الناتج (المقياس والانحراف وأركان البكسلات) على الشبكة التي يعرّفها الرستر الأول، ويتحدد امتداده بالمعامل «extenttype». يمكن أن تكون قيم «extenttype»: INTERSECTION وUNION وFIRST وSECOND.

المختصر

raster ST_MapAlgebraExpr(raster rast1, raster rast2, text expression, text pixeltype=same_as_rast1_band, text extenttype=INTERSECTION, text nodata1expr=NULL, text nodata2expr=NULL, double precision nodatanodataval=NULL);

raster ST_MapAlgebraExpr(raster rast1, integer band1, raster rast2, integer band2, text expression, text pixeltype=same_as_rast1_band, text extenttype=INTERSECTION, text nodata1expr=NULL, text nodata2expr=NULL, double precision nodatanodataval=NULL);

الوصف

[تنبيه]

ST_MapAlgebraExpr مُهملة (deprecated) منذ 2.1.0. استخدم ST_MapAlgebra (expression version) بدلًا منها.

تُنشئ رسترًا جديدًا بنطاق واحد يتكون بتطبيق عملية جبرية صالحة في PostgreSQL على النطاقين اللذين يعرّفهما expression في نطاقي الرسترين المُدخلين rast1 و(rast2). إذا لم يُحدَّد band1 وband2 فيُفترض النطاق 1. سيُحاذى الرستر الناتج (المقياس والانحراف وأركان البكسلات) على الشبكة التي يعرّفها الرستر الأول. وسيكون للرستر الناتج الامتداد الذي يعرّفه المعامل extenttype.

expression

تعبير جبري في PostgreSQL يتضمن الرسترين ودوال/عوامل معرّفة في PostgreSQL، يحدد قيمة البكسل عند تقاطع البكسلات. مثلًا (([rast1] + [rast2])/2.0)::integer

pixeltype

نوع البكسل الناتج للرستر المُخرَج. يجب أن يكون أحد الأنواع المدرجة في ST_BandPixelType أو أن يُغفل أو يُضبط على NULL. إذا لم يُمرَّر أو ضُبط على NULL، فسيكون افتراضيًا نوع البكسل للرستر الأول.

extenttype

يتحكم في امتداد الرستر الناتج

  1. INTERSECTION - امتداد الرستر الجديد هو تقاطع الرسترين. وهذا هو الافتراضي.

  2. UNION - امتداد الرستر الجديد هو اتحاد الرسترين.

  3. FIRST - امتداد الرستر الجديد هو امتداد الرستر الأول نفسه.

  4. SECOND - امتداد الرستر الجديد هو امتداد الرستر الثاني نفسه.

nodata1expr

تعبير جبري يتضمن rast2 فقط أو ثابت، يحدد ما يُعاد عندما تكون بكسلات rast1 ذات قيم nodata وتكون لبكسلات rast2 المقابلة مكانيًا قيم.

nodata2expr

تعبير جبري يتضمن rast1 فقط أو ثابت، يحدد ما يُعاد عندما تكون بكسلات rast2 ذات قيم nodata وتكون لبكسلات rast1 المقابلة مكانيًا قيم.

nodatanodataval

ثابت عددي يُعاد عندما تكون بكسلات rast1 وrast2 المتقابلة مكانيًا كلتاهما ذات قيم nodata.

إذا مُرِّر pixeltype، فسيكون للرستر الجديد نطاق من ذلك النوع. وإذا مُرِّر pixeltype بقيمة NULL أو لم يُحدَّد نوع بكسل، فسيكون لنطاق الرستر الجديد نوع البكسل نفسه لنطاق rast1 المُدخل.

استخدم المصطلحين [rast1.val] [rast2.val] للإشارة إلى قيمة البكسل في نطاقي الرسترين الأصليين، و[rast1.x] و[rast1.y] وما إلى ذلك للإشارة إلى مواضع الأعمدة/الصفوف للبكسلات.

متاحة منذ: 2.0.0

مثال: تقاطع واتحاد نطاقين

إنشاء رستر جديد بنطاق واحد من الرستر الأصلي يكون دالة لباقي القسمة على 2 لنطاق الرستر الأصلي.

--Create a cool set of rasters --
DROP TABLE IF EXISTS fun_shapes;
CREATE TABLE fun_shapes(rid serial PRIMARY KEY, fun_name text, rast raster);

-- Insert some cool shapes around Boston in Massachusetts state plane meters --
INSERT INTO fun_shapes(fun_name, rast)
VALUES ('ref', ST_AsRaster(ST_MakeEnvelope(235229, 899970, 237229, 901930,26986),200,200,'8BUI',0,0));

INSERT INTO fun_shapes(fun_name,rast)
WITH ref(rast) AS (SELECT rast FROM fun_shapes WHERE fun_name = 'ref' )
SELECT 'area' AS fun_name, ST_AsRaster(ST_Buffer(ST_SetSRID(ST_Point(236229, 900930),26986), 1000),
            ref.rast,'8BUI', 10, 0) As rast
FROM ref
UNION ALL
SELECT 'rand bubbles',
            ST_AsRaster(
            (SELECT ST_Collect(geom)
    FROM (SELECT ST_Buffer(ST_SetSRID(ST_Point(236229 + i*random()*100, 900930 + j*random()*100),26986), random()*20) As geom
            FROM generate_series(1,10) As i, generate_series(1,10) As j
            ) As foo ), ref.rast,'8BUI', 200, 0)
FROM ref;

--map them -
SELECT  ST_MapAlgebraExpr(
        area.rast, bub.rast, '[rast2.val]', '8BUI', 'INTERSECTION', '[rast2.val]', '[rast1.val]') As interrast,
        ST_MapAlgebraExpr(
            area.rast, bub.rast, '[rast2.val]', '8BUI', 'UNION', '[rast2.val]', '[rast1.val]') As unionrast
FROM
  (SELECT rast FROM fun_shapes WHERE
 fun_name = 'area') As area
CROSS JOIN  (SELECT rast
FROM fun_shapes WHERE
 fun_name = 'rand bubbles') As bub
                    

تقاطع جبر الخرائط

اتحاد جبر الخرائط

مثال: تركيب رسترات على لوحة (canvas) كنطاقات منفصلة

-- we use ST_AsPNG to render the image so all single band ones look grey --
WITH mygeoms
    AS ( SELECT 2 As bnum, ST_Buffer(ST_Point(1,5),10) As geom
            UNION ALL
            SELECT 3 AS bnum,
                ST_Buffer(ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'), 10,'join=bevel') As geom
            UNION ALL
            SELECT 1 As bnum,
                ST_Buffer(ST_GeomFromText('LINESTRING(60 50,150 150,150 50)'), 5,'join=bevel') As geom
            ),
   -- define our canvas to be 1 to 1 pixel to geometry
   canvas
    AS (SELECT ST_AddBand(ST_MakeEmptyRaster(200,
        200,
        ST_XMin(e)::integer, ST_YMax(e)::integer, 1, -1, 0, 0) , '8BUI'::text,0) As rast
        FROM (SELECT ST_Extent(geom) As e,
                    Max(ST_SRID(geom)) As srid
                    from mygeoms
                    ) As foo
            ),
   rbands AS (SELECT ARRAY(SELECT ST_MapAlgebraExpr(canvas.rast, ST_AsRaster(m.geom, canvas.rast, '8BUI', 100),
                 '[rast2.val]', '8BUI', 'FIRST', '[rast2.val]', '[rast1.val]') As rast
                FROM mygeoms AS m CROSS JOIN canvas
                ORDER BY m.bnum) As rasts
                )
          SELECT rasts[1] As rast1 , rasts[2] As rast2, rasts[3] As rast3, ST_AddBand(
                    ST_AddBand(rasts[1],rasts[2]), rasts[3]) As final_rast
            FROM rbands;
                    

rast1

rast2

rast3

final_rast

مثال: تركيب حدود بعرض 2 متر لقطع أراضٍ مختارة فوق صور جوية

-- Create new 3 band raster composed of first 2 clipped bands, and overlay of 3rd band with our geometry
-- This query took 3.6 seconds on PostGIS windows 64-bit install
WITH pr AS
-- Note the order of operation: we clip all the rasters to dimensions of our region
(SELECT ST_Clip(rast,ST_Expand(geom,50) ) As rast, g.geom
    FROM aerials.o_2_boston AS r INNER JOIN
-- union our parcels of interest so they form a single geometry we can later intersect with
        (SELECT ST_Union(ST_Transform(geom,26986)) AS geom
          FROM landparcels WHERE pid IN('0303890000', '0303900000')) As g
        ON ST_Intersects(rast::geometry, ST_Expand(g.geom,50))
),
-- we then union the raster shards together
-- ST_Union on raster is kinda of slow but much faster the smaller you can get the rasters
-- therefore we want to clip first and then union
prunion AS
(SELECT ST_AddBand(NULL, ARRAY[ST_Union(rast,1),ST_Union(rast,2),ST_Union(rast,3)] ) As clipped,geom
FROM pr
GROUP BY geom)
-- return our final raster which is the unioned shard with
-- with the overlay of our parcel boundaries
-- add first 2 bands, then mapalgebra of 3rd band + geometry
SELECT ST_AddBand(ST_Band(clipped,ARRAY[1,2])
    , ST_MapAlgebraExpr(ST_Band(clipped,3), ST_AsRaster(ST_Buffer(ST_Boundary(geom),2),clipped, '8BUI',250),
     '[rast2.val]', '8BUI', 'FIRST', '[rast2.val]', '[rast1.val]') ) As rast
FROM prunion;
                    

الخطوط الزرقاء هي حدود قطع الأراضي المختارة