الاسم
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 -
يتحكم في امتداد الرستر الناتج
-
INTERSECTION- امتداد الرستر الجديد هو تقاطع الرسترين. وهذا هو الافتراضي. -
UNION- امتداد الرستر الجديد هو اتحاد الرسترين. -
FIRST- امتداد الرستر الجديد هو امتداد الرستر الأول نفسه. -
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;
|
![]() الخطوط الزرقاء هي حدود قطع الأراضي المختارة
|






