ST_MapAlgebraExpr — 2 rasterbandversion: Skapar en ny enbandsraster som bildas genom att tillämpa en giltig PostgreSQL-algebraisk operation på de två inmatningsrasterbanden och av pixeltyp som tillhandahålls. band 1 för varje raster antas om inga bandnummer anges. Den resulterande rastern kommer att justeras (skala, skevhet och pixelhörn) på det rutnät som definieras av den första rastern och ha sin utsträckning definierad av parametern "extenttype". Värden för "extenttype" kan vara: 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 är föråldrad från och med 2.1.0. Använd ST_MapAlgebra (expression version) istället. |
Skapar en ny enbandsraster som bildas genom att tillämpa en giltig PostgreSQL-algebraisk operation på de två banden som definieras av uttrycket på de två inmatningsrasterbanden rast1,(rast2). Om inget band1, band2 anges antas band 1. Det resulterande rastret kommer att vara justerat (skala, skevhet och pixelhörn) på det rutnät som definieras av det första rastret. Det resulterande rastret kommer att ha den utsträckning som definieras av parametern extenttype.
expression
Ett PostgreSQL-algebraiskt uttryck som involverar de två rasterna och PostgreSQL-definierade funktioner / operatorer som definierar pixelvärdet när pixlar korsar varandra. t.ex. (([rast1] + [rast2])/2.0):: heltal
pixeltype
Den resulterande pixeltypen för utdatarastern. Måste vara en som listas i ST_BandPixelType, utelämnas eller sätts till NULL. Om den inte skickas in eller sätts till NULL, kommer den första rastrets pixeltyp att användas som standard.
extenttype
Styr omfattningen av det resulterande rastret
INTERSECTION - Det nya rastrets utsträckning är skärningspunkten mellan de två rastren. Detta är standardinställningen.
UNION - Utbredningen av det nya rastret är en sammanslagning av de två rastren.
FIRST - Utbredningen av det nya rastret är densamma som för det första rastret.
SECOND - Utbredningen av det nya rastret är densamma som för det andra rastret.
nodata1expr
Ett algebraiskt uttryck som endast omfattar rast2 eller en konstant som definierar vad som ska returneras när pixlar i rast1 har nodatavärden och spatialt motsvarande pixlar i rast2 har värden.
nodata2expr
Ett algebraiskt uttryck som endast omfattar rast1 eller en konstant som definierar vad som ska returneras när pixlar i rast2 har nodatavärden och spatialt motsvarande pixlar i rast1 har värden.
nodatanodataval
En numerisk konstant som returneras när spatialt motsvarande rast1- och rast2-pixlar båda är nodatavärden.
Om pixeltype skickas in kommer det nya rastret att ha ett band av den pixeltypen. Om pixeltype skickas till NULL eller ingen pixeltyp anges, kommer det nya rasterbandet att ha samma pixeltyp som det inmatade rast1-bandet.
Använd termen [rast1. val] [rast2.val] för att hänvisa till pixelvärdet för de ursprungliga rasterbanden och [rast1. x], [rast1. y] etc. för att hänvisa till pixlarnas kolumn-/radpositioner.
Tillgänglighet: 2.0.0
Skapa ett nytt 1-bandsraster från vårt original som är en funktion av modulo 2 av det ursprungliga rasterbandet.
--Create a cool set of rasters --
DROP TABLE IF EXISTS fun_shapes;
CREATE TABLE fun_shapes(rid serial PRIMARY KEY, fun_name text, rast raster);
-- Insert some cool shapes around Boston in Massachusetts state plane meters --
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;
--map them -
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
|
![]() mapalgebra intersektion
|
![]() karta algebra union
|
-- 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 AS bnum,
ST_Buffer(ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'), 10,'join=bevel') As geom
UNION ALL
SELECT 1 As bnum,
ST_Buffer(ST_GeomFromText('LINESTRING(60 50,150 150,150 50)'), 5,'join=bevel') As geom
),
-- define our canvas to be 1 to 1 pixel to geometry
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,
Max(ST_SRID(geom)) As srid
from mygeoms
) As foo
),
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]') As rast
FROM mygeoms AS m CROSS JOIN canvas
ORDER BY m.bnum) As rasts
)
SELECT rasts[1] As rast1 , rasts[2] As rast2, rasts[3] As rast3, ST_AddBand(
ST_AddBand(rasts[1],rasts[2]), rasts[3]) As final_rast
FROM rbands;
|
![]() rast1
|
![]() rast2
|
|
![]() rast3
|
![]() sista_rast
|
-- Create new 3 band raster composed of first 2 clipped bands, and overlay of 3rd band with our geometry
-- This query took 3.6 seconds on PostGIS windows 64-bit install
WITH pr AS
-- Note the order of operation: we clip all the rasters to dimensions of our region
(SELECT ST_Clip(rast,ST_Expand(geom,50) ) As rast, g.geom
FROM aerials.o_2_boston AS r INNER JOIN
-- union our parcels of interest so they form a single geometry we can later intersect with
(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))
),
-- we then union the raster shards together
-- ST_Union on raster is kinda of slow but much faster the smaller you can get the rasters
-- therefore we want to clip first and then union
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)
-- return our final raster which is the unioned shard with
-- with the overlay of our parcel boundaries
-- add first 2 bands, then mapalgebra of 3rd band + geometry
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;
|
![]() De blå linjerna är gränserna för utvalda skiften
|