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

ST_MapAlgebraFct

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

الاسم

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[] لـ userfunction مطلوب، بصرف النظر عمّا إذا اخترت تمرير أي وسائط إلى دالة المستخدم لمعالجتها أم لا.

متاحة منذ: 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;