ST_MapAlgebraExpr — Version avec 2 bandes : Crée un nouveau raster à une bande formé en appliquant une opération algébrique PostgreSQL valide sur les deux bandes du raster d'entrée et du type de pixel fourni. La bande 1 de chaque raster est utilisée si aucun numéro de bande n'est spécifié. Le raster résultant sera aligné (échelle, obliquité et coins) sur la grille définie par le premier raster et aura son étendue définie par le paramètre "extenttype". Les valeurs de "extenttype" peuvent être : 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 est obsolète depuis 2.1.0. Utilisez plutôt ST_MapAlgebra (expression version). |
Crée un nouveau raster à une bande formé en appliquant une opération algébrique PostgreSQL valide aux deux bandes définies par expression sur les deux bandes d'entrée rast1 (et optionnellement rast2). Si aucune bande band1, band2 n'est spécifiée, la bande 1 est utilisée. Le raster résultant sera aligné (échelle, obliquité et coins) sur la grille définie par le premier raster. Le raster résultant aura l'étendue définie par le paramètre extenttype.
expression
Une expression algébrique PostgreSQL impliquant les deux rasters et les fonctions/opérateurs définis par PostgreSQL qui définiront la valeur du pixel lorsque les pixels intersectent, par exemple (([rast1] + [rast2])/2.0)::integer
pixeltype
Le type de pixel résultant du raster de sortie. Doit être l'un de ceux listés dans ST_BandPixelType, omis ou NULL. S'il n'est pas fourni ou NULL, le type de pixel du premier raster sera utilisé par défaut.
extenttype
Contrôle l'étendue du raster de sortie
INTERSECTION - L'étendue du nouveau raster est l'intersection des deux rasters. Il s'agit de la valeur par défaut.
UNION - L'étendue du nouveau raster est l'union des deux rasters.
FIRST - L'étendue du nouveau raster est la même que celle du premier raster.
SECOND - L'étendue du nouveau raster est la même que celle du second raster.
nodata1expr
Une expression algébrique impliquant uniquement rast2, ou une constante qui définit la valeur à retourner lorsque les pixels de rast1 sont des valeurs nodata et que les pixels correspondants dans rast2 ont des valeurs.
nodata2expr
Une expression algébrique impliquant uniquement rast1, ou une constante qui définit la valeur à retourner lorsque les pixels de rast2 sont des valeurs nodata et que les pixels correspondants dans rast1 ont des valeurs.
nodatanodataval
Constante numérique à retourner lorsque les pixels de rast1 et de rast2 sont tous deux des valeurs nodata.
Si le pixeltype est fourni, le nouveau raster aura une bande de ce type de pixel. Si le type de pixel est NULL ou si aucun type de pixel n'est spécifié, la nouvelle bande raster aura le même type de pixel que la bande d'entrée de rast1.
Utilisez le mot clé [rast1.val] [rast2.val] pour désigner la valeur en pixels des bandes raster d'origine et [rast1.x], [rast1.y] etc. pour désigner la position des pixels dans les colonnes et les lignes.
Disponibilité : 2.0.0
2 Band Intersection and Union.
Crée une nouveau raster à 1 bande qui est une fonction modulo 2 de la bande du raster original.
Create a cool set of rasters.
Insert some cool shapes around Boston in Massachusetts state plane meters, then map their intersection and union.
DROP TABLE IF EXISTS fun_shapes;
CREATE TABLE fun_shapes(rid serial PRIMARY KEY, fun_name text, rast raster);
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;
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
The same intersection and union operations using two deterministic, self-contained rasters.
WITH canvas AS (
SELECT ST_AddBand(
ST_MakeEmptyRaster(80, 80, 0, 80, 1, -1, 0, 0, 0),
1, '8BUI', 40, 0
) AS rast
), inputs AS (
SELECT
rast AS raster_1,
ST_AsRaster(
ST_Buffer(ST_Point(40, 40), 28),
rast,
'8BUI', 220, 0
) AS raster_2
FROM canvas
), variants AS (
SELECT 'raster 1' AS title, raster_1 AS rendered FROM inputs
UNION ALL
SELECT 'raster 2', raster_2 FROM inputs
UNION ALL
SELECT 'intersection', ST_MapAlgebraExpr(
raster_1, raster_2,
'[rast2.val]', '8BUI', 'INTERSECTION',
'[rast2.val]', '[rast1.val]'
) FROM inputs
UNION ALL
SELECT 'union', ST_MapAlgebraExpr(
raster_1, raster_2,
'[rast2.val]', '8BUI', 'UNION',
'[rast2.val]', '[rast1.val]'
) FROM inputs
)
SELECT title, ST_AsPNG(rendered) AS image
FROM variants
ORDER BY CASE title
WHEN 'raster 1' THEN 1
WHEN 'raster 2' THEN 2
WHEN 'intersection' THEN 3
ELSE 4
END;
title | image --------------+--------------------------- raster 1 | PNG image, 80 x 80 pixels raster 2 | PNG image, 56 x 56 pixels intersection | PNG image, 56 x 56 pixels union | PNG image, 80 x 80 pixels
Overlaying rasters on a one-unit-per-pixel canvas as separate bands. 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,
ST_Buffer(
ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'),
10,
'join=bevel'
)
UNION ALL
SELECT 1,
ST_Buffer(
ST_GeomFromText('LINESTRING(60 50,150 150,150 50)'),
5,
'join=bevel'
)
), 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
FROM mygeoms
) AS bounds
), 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]'
)
FROM mygeoms AS m
CROSS JOIN canvas
ORDER BY m.bnum
) AS rasts
)
SELECT title, ST_AsPNG(rendered) AS image
FROM rbands
CROSS JOIN LATERAL (VALUES
('band 1', rasts[1]),
('band 2', rasts[2]),
('band 3', rasts[3]),
('RGB', ST_AddBand(ST_AddBand(rasts[1], rasts[2]), rasts[3]))
) AS variants(title, rendered);
title | image --------+----------------------------- band 1 | PNG image, 200 x 200 pixels band 2 | PNG image, 200 x 200 pixels band 3 | PNG image, 200 x 200 pixels RGB | PNG image, 200 x 200 pixels
Overlay a two-meter boundary of selected parcels over aerial imagery. The query first unions the parcel geometries, clips the source raster shards to the region, unions those smaller shards, and finally adds the first two bands plus a third-band map algebra overlay.
Create a new three-band raster composed of the first two clipped bands and the third band overlaid with the geometry. This query took 3.6 seconds on a 64-bit PostGIS Windows installation.
WITH pr AS (
SELECT ST_Clip(rast, ST_Expand(geom, 50)) AS rast, g.geom
FROM aerials.o_2_boston AS r
INNER JOIN (
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))
), 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
)
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;
Parcel-boundary overlay.
The blue lines are the boundaries of selected parcels |
The generated four-panel canvas example above shows the same band-overlay technique without requiring an external aerial-imagery or parcel table.