الاسم
ST_MapAlgebraFct — نسخة النطاق الواحد - تُنشئ رسترًا جديدًا بنطاق واحد يتكون بتطبيق دالة PostgreSQL صالحة على نطاق الرستر المُدخل وبنوع البكسل المقدَّم. يُفترض النطاق 1 إذا لم يُحدَّد نطاق.
المختصر
raster ST_MapAlgebraFct(raster rast, regprocedure onerasteruserfunc);
raster ST_MapAlgebraFct(raster rast, regprocedure onerasteruserfunc, text[] VARIADIC args);
raster ST_MapAlgebraFct(raster rast, text pixeltype, regprocedure onerasteruserfunc);
raster ST_MapAlgebraFct(raster rast, text pixeltype, regprocedure onerasteruserfunc, text[] VARIADIC args);
raster ST_MapAlgebraFct(raster rast, integer band, regprocedure onerasteruserfunc);
raster ST_MapAlgebraFct(raster rast, integer band, regprocedure onerasteruserfunc, text[] VARIADIC args);
raster ST_MapAlgebraFct(raster rast, integer band, text pixeltype, regprocedure onerasteruserfunc);
raster ST_MapAlgebraFct(raster rast, integer band, text pixeltype, regprocedure onerasteruserfunc, text[] VARIADIC args);
الوصف
|
|
|
ST_MapAlgebraFct مُهملة (deprecated) منذ 2.1.0. استخدم ST_MapAlgebra (callback function version) بدلًا منها. |
تُنشئ رسترًا جديدًا بنطاق واحد يتكون بتطبيق دالة PostgreSQL صالحة تحددها onerasteruserfunc على الرستر المُدخل (rast). إذا لم يُحدَّد band، فيُفترض النطاق 1. سيكون للرستر الجديد الإسناد الجغرافي والعرض والارتفاع نفسها للرستر الأصلي، لكن سيكون له نطاق واحد فقط.
إذا مُرِّر pixeltype، فسيكون للرستر الجديد نطاق من ذلك النوع. وإذا مُرِّر pixeltype بقيمة NULL، فسيكون لنطاق الرستر الجديد نوع البكسل نفسه لنطاق rast المُدخل.
يجب أن يكون المعامل onerasteruserfunc اسم دالة SQL أو PL/pgSQL وتوقيعها، محوَّلًا إلى regprocedure. ومن أمثلة دوال PL/pgSQL البسيطة جدًا وعديمة الفائدة تقريبًا:
CREATE OR REPLACE FUNCTION simple_function(pixel FLOAT, pos INTEGER[], VARIADIC args TEXT[])
RETURNS FLOAT
AS $$ BEGIN
RETURN 0.0;
END; $$
LANGUAGE 'plpgsql' IMMUTABLE;
يمكن أن تقبل userfunction وسيطين أو ثلاثة: قيمة عشرية (float)، ومصفوفة أعداد صحيحة اختيارية، ومصفوفة نصية variadic. الوسيط الأول هو قيمة خلية رستر مفردة (بصرف النظر عن نوع بيانات الرستر). والوسيط الثاني هو موضع الخلية الجاري معالجتها بالصيغة '{x,y}'. ويشير الوسيط الثالث إلى أن جميع المعاملات المتبقية لـ ST_MapAlgebraFct ستُمرَّر إلى userfunction.
يتطلب تمرير وسيط من نوع regprodedure إلى دالة SQL تمرير توقيع الدالة كاملًا، ثم تحويله إلى النوع regprocedure. لتمرير دالة PL/pgSQL المذكورة في المثال أعلاه وسيطًا، تكون تعليمة SQL للوسيط:
'simple_function(float,integer[],text[])'::regprocedure
لاحظ أن الوسيط يحتوي على اسم الدالة وأنواع وسائطها وعلامات اقتباس حول الاسم وأنواع الوسائط، وتحويلًا إلى regprocedure.
الوسيط الثالث لـ userfunction مصفوفة من نوع variadic text. تُمرَّر جميع الوسائط النصية اللاحقة في أي استدعاء لـ ST_MapAlgebraFct إلى userfunction المحددة، وتُحتوى في الوسيط args.
|
|
|
لمزيد من المعلومات عن الكلمة المفتاحية VARIADIC، يُرجى الرجوع إلى توثيق PostgreSQL وقسم «SQL Functions with Variable Numbers of Arguments» من دوال لغة الاستعلام (SQL). |
|
|
|
الوسيط text[] لـ |
متاحة منذ: 2.0.0
أمثلة
إنشاء رستر جديد بنطاق واحد من الرستر الأصلي يكون دالة لباقي القسمة على 2 لنطاق الرستر الأصلي.
ALTER TABLE dummy_rast ADD COLUMN map_rast raster;
CREATE FUNCTION mod_fct(pixel float, pos integer[], variadic args text[])
RETURNS float
AS $$
BEGIN
RETURN pixel::integer % 2;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE;
UPDATE dummy_rast SET map_rast = ST_MapAlgebraFct(rast,NULL,'mod_fct(float,integer[],text[])'::regprocedure) WHERE rid = 2;
SELECT ST_Value(rast,1,i,j) As origval, ST_Value(map_rast, 1, i, j) As mapval
FROM dummy_rast CROSS JOIN generate_series(1, 3) AS i CROSS JOIN generate_series(1,3) AS j
WHERE rid = 2;
origval | mapval
---------+--------
253 | 1
254 | 0
253 | 1
253 | 1
254 | 0
254 | 0
250 | 0
254 | 0
254 | 0
إنشاء رستر جديد بنطاق واحد من نوع البكسل 2BUI من الرستر الأصلي بعد إعادة تصنيفه، وضبط قيمة nodata على معامل يُمرَّر إلى دالة المستخدم (0).
ALTER TABLE dummy_rast ADD COLUMN map_rast2 raster;
CREATE FUNCTION classify_fct(pixel float, pos integer[], variadic args text[])
RETURNS float
AS
$$
DECLARE
nodata float := 0;
BEGIN
IF NOT args[1] IS NULL THEN
nodata := args[1];
END IF;
IF pixel < 251 THEN
RETURN 1;
ELSIF pixel = 252 THEN
RETURN 2;
ELSIF pixel
> 252 THEN
RETURN 3;
ELSE
RETURN nodata;
END IF;
END;
$$
LANGUAGE 'plpgsql';
UPDATE dummy_rast SET map_rast2 = ST_MapAlgebraFct(rast,'2BUI','classify_fct(float,integer[],text[])'::regprocedure, '0') WHERE rid = 2;
SELECT DISTINCT ST_Value(rast,1,i,j) As origval, ST_Value(map_rast2, 1, i, j) As mapval
FROM dummy_rast CROSS JOIN generate_series(1, 5) AS i CROSS JOIN generate_series(1,5) AS j
WHERE rid = 2;
origval | mapval
---------+--------
249 | 1
250 | 1
251 |
252 | 2
253 | 3
254 | 3
SELECT ST_BandPixelType(map_rast2) As b1pixtyp
FROM dummy_rast WHERE rid = 2;
b1pixtyp
----------
2BUI
الأصل (العمود rast-view) |
rast_view_ma |
إنشاء رستر جديد بثلاثة نطاقات وبنوع البكسل نفسه من الرستر الأصلي ذي النطاقات الثلاثة، مع تعديل النطاق الأول بجبر الخرائط وإبقاء النطاقين الآخرين دون تعديل.
CREATE FUNCTION rast_plus_tan(pixel float, pos integer[], variadic args text[])
RETURNS float
AS
$$
BEGIN
RETURN tan(pixel) * pixel;
END;
$$
LANGUAGE 'plpgsql';
SELECT ST_AddBand(
ST_AddBand(
ST_AddBand(
ST_MakeEmptyRaster(rast_view),
ST_MapAlgebraFct(rast_view,1,NULL,'rast_plus_tan(float,integer[],text[])'::regprocedure)
),
ST_Band(rast_view,2)
),
ST_Band(rast_view, 3) As rast_view_ma
)
FROM wind
WHERE rid=167;
انظر أيضًا
ST_MapAlgebraExpr, ST_BandPixelType, ST_GeoReference, ST_SetValue