الاسم
ST_MapAlgebraFct — نسخة النطاقين - تُنشئ رسترًا جديدًا بنطاق واحد يتكون بتطبيق دالة PostgreSQL صالحة على نطاقي الرسترين المُدخلين وبنوع البكسل المقدَّم. يُفترض النطاق 1 إذا لم يُحدَّد نطاق. نوع الامتداد الافتراضي هو INTERSECTION إذا لم يُحدَّد.
المختصر
raster ST_MapAlgebraFct(raster rast1, raster rast2, regprocedure tworastuserfunc, text pixeltype=same_as_rast1, text extenttype=INTERSECTION, text[] VARIADIC userargs);
raster ST_MapAlgebraFct(raster rast1, integer band1, raster rast2, integer band2, regprocedure tworastuserfunc, text pixeltype=same_as_rast1, text extenttype=INTERSECTION, text[] VARIADIC userargs);
الوصف
|
|
|
ST_MapAlgebraFct مُهملة (deprecated) منذ 2.1.0. استخدم ST_MapAlgebra (callback function version) بدلًا منها. |
تُنشئ رسترًا جديدًا بنطاق واحد يتكون بتطبيق دالة PostgreSQL صالحة تحددها tworastuserfunc على الرسترين المُدخلين rast1 وrast2. إذا لم يُحدَّد band1 أو band2، فيُفترض النطاق 1. سيكون للرستر الجديد الإسناد الجغرافي والعرض والارتفاع نفسها للرسترين الأصليين، لكن سيكون له نطاق واحد فقط.
إذا مُرِّر pixeltype، فسيكون للرستر الجديد نطاق من ذلك النوع. وإذا مُرِّر pixeltype بقيمة NULL أو أُغفل، فسيكون لنطاق الرستر الجديد نوع البكسل نفسه لنطاق rast1 المُدخل.
يجب أن يكون المعامل tworastuserfunc اسم دالة SQL أو PL/pgSQL وتوقيعها، محوَّلًا إلى regprocedure. ومن أمثلة دوال PL/pgSQL:
CREATE OR REPLACE FUNCTION simple_function_for_two_rasters(pixel1 FLOAT, pixel2 FLOAT, pos INTEGER[], VARIADIC args TEXT[])
RETURNS FLOAT
AS $$ BEGIN
RETURN 0.0;
END; $$
LANGUAGE 'plpgsql' IMMUTABLE;
يمكن أن تقبل tworastuserfunc ثلاثة وسائط أو أربعة: قيمة double precision، وقيمة double precision، ومصفوفة أعداد صحيحة اختيارية، ومصفوفة نصية variadic. الوسيط الأول هو قيمة خلية رستر مفردة في rast1 (بصرف النظر عن نوع بيانات الرستر). والوسيط الثاني هو قيمة خلية رستر مفردة في rast2. والوسيط الثالث هو موضع الخلية الجاري معالجتها بالصيغة '{x,y}'. ويشير الوسيط الرابع إلى أن جميع المعاملات المتبقية لـ ST_MapAlgebraFct ستُمرَّر إلى tworastuserfunc.
يتطلب تمرير وسيط من نوع regprodedure إلى دالة SQL تمرير توقيع الدالة كاملًا، ثم تحويله إلى النوع regprocedure. لتمرير دالة PL/pgSQL المذكورة في المثال أعلاه وسيطًا، تكون تعليمة SQL للوسيط:
'simple_function(double precision, double precision, integer[], text[])'::regprocedure
لاحظ أن الوسيط يحتوي على اسم الدالة وأنواع وسائطها وعلامات اقتباس حول الاسم وأنواع الوسائط، وتحويلًا إلى regprocedure.
الوسيط الرابع لـ tworastuserfunc مصفوفة من نوع variadic text. تُمرَّر جميع الوسائط النصية اللاحقة في أي استدعاء لـ ST_MapAlgebraFct إلى tworastuserfunc المحددة، وتُحتوى في الوسيط userargs.
|
|
|
لمزيد من المعلومات عن الكلمة المفتاحية VARIADIC، يُرجى الرجوع إلى توثيق PostgreSQL وقسم «SQL Functions with Variable Numbers of Arguments» من دوال لغة الاستعلام (SQL). |
|
|
|
الوسيط text[] لـ |
متاحة منذ: 2.0.0
مثال: تركيب رسترات على لوحة (canvas) كنطاقات منفصلة
-- define our user defined function --
CREATE OR REPLACE FUNCTION raster_mapalgebra_union(
rast1 double precision,
rast2 double precision,
pos integer[],
VARIADIC userargs text[]
)
RETURNS double precision
AS $$
DECLARE
BEGIN
CASE
WHEN rast1 IS NOT NULL AND rast2 IS NOT NULL THEN
RETURN ((rast1 + rast2)/2.);
WHEN rast1 IS NULL AND rast2 IS NULL THEN
RETURN NULL;
WHEN rast1 IS NULL THEN
RETURN rast2;
ELSE
RETURN rast1;
END CASE;
RETURN NULL;
END;
$$ LANGUAGE 'plpgsql' IMMUTABLE COST 1000;
-- prep our test table of rasters
DROP TABLE IF EXISTS map_shapes;
CREATE TABLE map_shapes(rid serial PRIMARY KEY, rast raster, bnum integer, descrip text);
INSERT INTO map_shapes(rast,bnum, descrip)
WITH mygeoms
AS ( SELECT 2 As bnum, ST_Buffer(ST_Point(90,90),30) As geom, 'circle' As descrip
UNION ALL
SELECT 3 AS bnum,
ST_Buffer(ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'), 15) As geom, 'big road' As descrip
UNION ALL
SELECT 1 As bnum,
ST_Translate(ST_Buffer(ST_GeomFromText('LINESTRING(60 50,150 150,150 50)'), 8,'join=bevel'), 10,-6) As geom, 'small road' As descrip
),
-- define our canvas to be 1 to 1 pixel to geometry
canvas
AS ( SELECT ST_AddBand(ST_MakeEmptyRaster(250,
250,
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
)
-- return our rasters aligned with our canvas
SELECT ST_AsRaster(m.geom, canvas.rast, '8BUI', 240) As rast, bnum, descrip
FROM mygeoms AS m CROSS JOIN canvas
UNION ALL
SELECT canvas.rast, 4, 'canvas'
FROM canvas;
-- Map algebra on single band rasters and then collect with ST_AddBand
INSERT INTO map_shapes(rast,bnum,descrip)
SELECT ST_AddBand(ST_AddBand(rasts[1], rasts[2]),rasts[3]), 4, 'map bands overlay fct union (canvas)'
FROM (SELECT ARRAY(SELECT ST_MapAlgebraFct(m1.rast, m2.rast,
'raster_mapalgebra_union(double precision, double precision, integer[], text[])'::regprocedure, '8BUI', 'FIRST')
FROM map_shapes As m1 CROSS JOIN map_shapes As m2
WHERE m1.descrip = 'canvas' AND m2.descrip <
> 'canvas' ORDER BY m2.bnum) As rasts) As foo;
|
![]() تركيب نطاقات الخريطة (اللوحة) (R: طريق صغير، G: دائرة، B: طريق كبير)
|
دالة يعرّفها المستخدم تقبل وسائط إضافية
CREATE OR REPLACE FUNCTION raster_mapalgebra_userargs(
rast1 double precision,
rast2 double precision,
pos integer[],
VARIADIC userargs text[]
)
RETURNS double precision
AS $$
DECLARE
BEGIN
CASE
WHEN rast1 IS NOT NULL AND rast2 IS NOT NULL THEN
RETURN least(userargs[1]::integer,(rast1 + rast2)/2.);
WHEN rast1 IS NULL AND rast2 IS NULL THEN
RETURN userargs[2]::integer;
WHEN rast1 IS NULL THEN
RETURN greatest(rast2,random()*userargs[3]::integer)::integer;
ELSE
RETURN greatest(rast1, random()*userargs[4]::integer)::integer;
END CASE;
RETURN NULL;
END;
$$ LANGUAGE 'plpgsql' VOLATILE COST 1000;
SELECT ST_MapAlgebraFct(m1.rast, 1, m1.rast, 3,
'raster_mapalgebra_userargs(double precision, double precision, integer[], text[])'::regprocedure,
'8BUI', 'INTERSECT', '100','200','200','0')
FROM map_shapes As m1
WHERE m1.descrip = 'map bands overlay fct union (canvas)';
دالة يعرّفها المستخدم بوسائط إضافية ونطاقات مختلفة من الرستر نفسه
انظر أيضًا
ST_MapAlgebraExpr, ST_BandPixelType, ST_GeoReference, ST_SetValue
