ST_Clip — Gibt den nach der Eingabegeometrie zugeschnittenen Raster zurück. Falls die Bandnummer nicht angegeben ist, werden alle Bänder verarbeitet. Wenn crop nicht angegeben oder auf TRUE gesetzt ist, wird der Ausgaberaster entsprechend zugeschnitten. Wenn touched auf TRUE gesetzt ist, werden auch berührte Pixel einbezogen, andernfalls nur Pixel, bei denen sich der Mittelpunkt im Inneren der Geometrie befindet.
raster ST_Clip(raster rast, integer[] nband, geometry geom, double precision[] nodataval=NULL, boolean crop=TRUE, boolean touched=FALSE);
raster ST_Clip(raster rast, integer nband, geometry geom, double precision nodataval, boolean crop=TRUE, boolean touched=FALSE);
raster ST_Clip(raster rast, integer nband, geometry geom, boolean crop, boolean touched=FALSE);
raster ST_Clip(raster rast, geometry geom, double precision[] nodataval=NULL, boolean crop=TRUE, boolean touched=FALSE);
raster ST_Clip(raster rast, geometry geom, double precision nodataval, boolean crop=TRUE, boolean touched=FALSE);
raster ST_Clip(raster rast, geometry geom, boolean crop, boolean touched=FALSE);
Gibt einen Raster aus, der nach der Eingabegeometrie geom ausgeschnitten wird. Wird kein Band angegeben, so werden alle Bänder bearbeitet.
Raster die aus einer Operation mit ST_Clip resultieren, müssen in den Bereichen wo sie ausgeschnitten werden, einen NODATA-Wert für jedes Band aufweisen. Wenn keine Werte übergeben werden und für den Ausgangsraster kein NODATA-Wert festgelegt wurde, dann werden die NODATA-Werte des Zielrasters auf ST_MinPossibleValue(ST_BandPixelType(rast, band)) gesetzt. Wenn die Anzahl der NODATA-Werte in dem übergebenen Feld kleiner als die Anzahl der Bänder ist, wird für die restlichen Bänder der letzte Wert des Feldes verwendet. Wenn die Anzahl der NODATA-Werte größer als die Anzahl der Bänder ist, so werden die zusätzlichen NODATA-Werte übergangen. Alle Varianten, die ein Feld mit NODATA-Werten akzeptieren, nehmen auch einen einzelnen Wert für alle Bänder entgegen.
Wenn crop nicht angegeben ist, wird true angenommen, was bedeutet, dass das Ausgaberaster auf den Schnittpunkt der Ausdehnungen geomund rast beschnitten wird. Wenn crop auf false gesetzt ist, erhält das neue Raster die gleiche Ausdehnung wie rast. Wenn touched auf true gesetzt ist, werden alle Pixel im rast, die die Geometrie schneiden, ausgewählt.
|
|
|
Das Standardverhalten ist touched=false, wodurch nur Pixel ausgewählt werden, deren Mittelpunkt von der Geometrie abgedeckt ist. |
Verbessert: 3.5.0 - berührtes Argument hinzugefügt.
Verfügbarkeit: 2.0.0
Erweiterung: 2.1.0 neu geschrieben in C
Die Beispiele verwenden Luftbilddaten aus Massachusetts, die auf der MassGIS-Website MassGIS Aerial Orthos verfügbar sind.
Comparing selecting all touched vs. not all touched.
WITH source AS (
SELECT rast, geom
FROM ST_AsRaster(ST_Letters('R'), scalex =
> 1.0, scaley =
> -1.0) AS r(rast)
INNER JOIN ST_GeomFromText('LINESTRING(0 1,5 6,10 10)') AS g(geom)
ON ST_Intersects(r.rast, g.geom)
), clipped AS (
SELECT rast,
ST_Clip(rast, geom, touched =
> true) AS rast_touched,
ST_Clip(rast, geom, touched =
> false) AS rast_not_touched
FROM source
), variants AS (
SELECT 'original' AS title, ST_Count(rast) AS pixel_count, rast AS rendered
FROM clipped
UNION ALL
SELECT 'all touched', ST_Count(rast_touched), rast_touched
FROM clipped
UNION ALL
SELECT 'default clip', ST_Count(rast_not_touched), rast_not_touched
FROM clipped
)
SELECT title, pixel_count, ST_AsPNG(rendered) AS image
FROM variants
ORDER BY CASE title
WHEN 'original' THEN 1
WHEN 'all touched' THEN 2
ELSE 3
END;
title | pixel_count | image --------------+-------------+---------------------------- original | 2605 | PNG image, 48 x 74 pixels all touched | 16 | PNG image, 11 x 11 pixels default clip | 10 | PNG image, 11 x 11 pixels (3 rows)
The following self-contained example uses three simple shapes as RGB bands. It compares cropping band 1, clipping band 1 without cropping and then restoring bands 2 and 3, and clipping every band without cropping.
WITH canvas AS (
SELECT ST_AddBand(
ST_AddBand(
ST_AddBand(
ST_MakeEmptyRaster(128, 128, 0, 128, 1, -1, 0, 0, 0),
'8BUI'::text, 0::double precision, 0::double precision
),
'8BUI'::text, 0::double precision, 0::double precision
),
'8BUI'::text, 0::double precision, 0::double precision
) AS rast
), source AS (
SELECT ST_SetValue(
ST_SetValue(
ST_SetValue(rast, 1, ST_Buffer('POINT(32 96)'::geometry, 22), 220),
2, ST_Buffer('LINESTRING(18 20,110 110)'::geometry, 6,
'endcap=flat join=bevel'), 210
),
3, ST_Buffer('LINESTRING(10 48,118 48)'::geometry, 7,
'endcap=flat'), 180
) AS rast,
ST_Buffer('POINT(64 64)'::geometry, 34) AS clipper
FROM canvas
), variants AS (
SELECT 'original RGB' AS title, rast AS rendered FROM source
UNION ALL
SELECT 'band 1 cropped', ST_Clip(rast, 1, clipper, true) FROM source
UNION ALL
SELECT
'band 1 only',
ST_AddBand(
ST_Clip(rast, 1, clipper, false),
ARRAY[ST_Band(rast, 2), ST_Band(rast, 3)]
)
FROM source
UNION ALL
SELECT 'all bands clipped', ST_Clip(rast, clipper, false) FROM source
)
SELECT title, ST_AsPNG(rendered) AS image
FROM variants
ORDER BY CASE title
WHEN 'original RGB' THEN 1
WHEN 'band 1 cropped' THEN 2
WHEN 'band 1 only' THEN 3
ELSE 4
END;
title | image -------------------+----------------------------- original RGB | PNG image, 128 x 128 pixels band 1 cropped | PNG image, 68 x 68 pixels band 1 only | PNG image, 128 x 128 pixels all bands clipped | PNG image, 128 x 128 pixels (4 rows)
Crop, single-band clipping, and all-band clipping.
Source tile |
Cropped |
One-band source |
One-band clip |
All-band source |
All-band clip |