ST_MapAlgebraExpr — Versão de banda raster 2: Cria uma banda raster nova formada pela aplicação de uma operação algébrica válida PostgreSQL nas duas bandas raster de entrada e do tipo de pixel fornecido. A banda 1 de cada raster é assumida se nenhum número de bandas for especificado. O raster resultante será alinhado (escala, inclinação e cantos de pixel) na grade definida pelo primeiro raster e tem sua extensão definida pelo parâmetro "extenttype". O valores para "extenttype" pode ser: INTERSEÇÃO, UNIÃO, PRIMEIRO, SEGUNDO.
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 é menosprezado como do 2.1.0. Use ST_MapAlgebra (expression version). |
Cria uma nova banda raster formada pela aplicação válida de uma operação algébrica PostgreSQL definida pela expression no raster de saída (rast). Se nband, band2 não forem especificados, a banda 1 é assumida. O raster resultante será alinhado (escala, inclinação e cantos de pixel) na grade definida pelo primeiro raster. O raster resultante terá de ser definido pelo primeiro raster. O raster resultante terá a extensão definida pelo parâmetro extenttype.
expression
Uma expressão algébrica PostgreSQL envolvendo dois rasters e funções/operadores PostgreSQL definidos que irão elucidar o valor do pixel quando eles se intersectarem. ex.: (([rast1] + [rast2])/2.0)::integer
pixeltype
O tipo de pixel resultante do raster de saída. Deve ser um listado em ST_BandPixelType, deixado de fora ou NULO. Se não passar ou for NULO, usa-se o tipo de pixel do primeiro raster.
extenttype
Controla a extensão do raster resultante
INTERSECTION - A extensão do novo raster é a interseção de dois rasters. Este é o padrão.
UNION - A extensão do novo raster é a união dos dois raster.
FIRST - A extensão do novo raster é a mesma da do primeiro raster.
SECOND - A extensão do novo raster é a mesma da do segundo raster.
nodata1expr
Uma expressão algébrica envolvendo somente rast2 ou uma constante que define o que retornar quando pixeis de rast1 são valores nodata e os pixeis rast2 têm valores.
nodata2expr
Uma expressão algébrica envolvendo somente rast1 ou uma constante que define o que retornar quando pixeis de rast2 são valores nodata e os pixeis rast1 têm valores.
nodatanodataval
Uma constante numérica para retornar quando os pixeis rast1 e raste2 forem ambos valores nodata.
Se pixeltype passar, o novo raster terá uma banda desse tipo de pixel. Se o tipo de pixel passar NULOou nenhum tipo for especificado, a nova banda raster terá o mesmo tipo de pixel da banda de entrada rast1.
Use o termo [rast1.val] [rast2.val] para referir-se ao valor de pixel das bandas rasters originais e [rast1.x], [rast1.y] etc. para referir-se à posição da coluna/linha dos pixeis.
Disponibilidade: 2.0.0
2 Band Intersection and Union.
Cria uma nova banda raster 1 a partir da nossa original que é uma função de módulo 2 da banda 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.
ST_MapAlgebraExpr, ST_AddBand, ST_AsPNG, ST_AsRaster, ST_MapAlgebraFct, ST_BandPixelType, ST_GeoReference, ST_Value, ST_Union, ST_Union