ST_Intersection — 返回一个栅格或一组几何像素值对,表示两个栅格的共享部分或栅格矢量化和几何图形的几何交集。
setof geomval ST_Intersection(geometry geom, raster rast, integer band_num=1);
setof geomval ST_Intersection(raster rast, geometry geom);
setof geomval ST_Intersection(raster rast, integer band, geometry geomin);
raster ST_Intersection(raster rast1, raster rast2, double precision[] nodataval);
raster ST_Intersection(raster rast1, raster rast2, text returnband, double precision[] nodataval);
raster ST_Intersection(raster rast1, integer band1, raster rast2, integer band2, double precision[] nodataval);
raster ST_Intersection(raster rast1, integer band1, raster rast2, integer band2, text returnband, double precision[] nodataval);
返回一个栅格或一组几何像素值对,表示两个栅格的共享部分或栅格矢量化和几何图形的几何交集。
前三个变体返回一组 geomval,在向量空间中工作。 首先将栅格矢量化(使用ST_DumpAsPolygons)为一组 geomval 行,然后使用 ST_Intersection (geometry, Geometry) PostGIS 函数将这些行与几何相交。 仅与栅格的无数据值区域相交的几何将返回空几何。 通常通过在 WHERE 子句中正确使用 ST_Intersects将它们从结果中排除。
您可以通过用括号将它们括起来并在表达式末尾添加“.geom”或“.val”来访问几何图形和生成的 geomval 集的值部分。 例如 (ST_Intersection(rast, geom)).geom
其他变体返回光栅,在光栅空间中工作。 他们使用 ST_MapAlgebraExpr 的两个栅格版本来执行交集。
生成的栅格范围对应于两个栅格范围的几何交集。 生成的栅格包含“BAND1”、“BAND2”或“BOTH”波段,遵循作为 returnband 参数传递的内容。 任何波段中存在的无数据值区域都会导致结果的每个波段中出现无数据值区域。 换句话说,与无数据值像素相交的任何像素都成为结果中的无数据值像素。
由 ST_Intersection 生成的栅格必须为不相交的区域分配 nodata 值。 您可以通过提供一个包含一个或两个 nodata 值的 nodataval[] 数组来定义或替换任何结果频段的 nodata 值,具体取决于您是否请求“BAND1”、“BAND2”或“BOTH”频段。 数组中的第一个值替换第一个带中的无数据值,第二个值替换第二个带中的无数据值。 如果一个输入带没有定义 nodata 值并且没有以数组形式提供,则使用 ST_MinPossibleValue 函数选择一个。 所有接受 nodata 值数组的变体也可以接受单个值,该值将分配给每个请求的带。
在所有变体中,如果未指定波段编号,则假定波段 1。 如果您需要栅格和返回栅格的几何图形之间的交集,请参阅 ST_Clip。
|
|
|
For more control over the result extent or NODATA handling, use the two-raster variant of ST_MapAlgebraExpr. To compute a raster-space intersection with a geometry, use ST_Clip. Use this function together with ST_Intersects and an index on the raster or geometry column when filtering table data. |
增强:2.0.0 - 引入了光栅空间中的交集。 在 2.0.0 之前的早期版本中,仅支持在向量空间中执行交集。
SELECT
foo.rid,
foo.gid,
GeometryType((foo.geomval).geom) AS geom_type,
(foo.geomval).val AS value
FROM (
SELECT
A.rid,
g.gid,
ST_Intersection(A.rast, g.geom) As geomval
FROM dummy_rast AS A
CROSS JOIN (
VALUES
(1, ST_Point(3427928, 5793243.85) ),
(2, 'LINESTRING(3427927.85 5793243.75,3427927.8 5793243.75,3427927.8 5793243.8)'::geometry),
(3, 'LINESTRING(1 2,3 4)'::geometry)
) As g(gid, geom)
WHERE A.rid = 2
) AS foo;
rid | gid | geom_type | value -----+-----+----------------------+------- 2 | 1 | POINT | 249 2 | 1 | POINT | 253 2 | 2 | POINT | 254 2 | 2 | POINT | 251 2 | 2 | POINT | 253 2 | 2 | LINESTRING | 252 2 | 2 | MULTILINESTRING | 250 2 | 3 | GEOMETRYCOLLECTION |
The same line example rendered in a common coordinate frame. The raster footprint and complete input line remain visible behind the returned intersection pieces.
WITH source AS (
SELECT
rast,
ST_GeomFromText(
'LINESTRING(3427927.85 5793243.75,'
'3427927.8 5793243.75,3427927.8 5793243.8)'
) AS input_geometry
FROM dummy_rast
WHERE rid = 2
), intersection AS (
SELECT
rast,
input_geometry,
ST_Collect(gv.geom) AS result_geometry
FROM source
CROSS JOIN LATERAL ST_Intersection(rast, input_geometry) AS gv
GROUP BY rast, input_geometry
), layers AS (
SELECT
'raster' AS title,
ST_Translate(ST_Envelope(rast), -3427927.75, -5793243.75) AS geom
FROM intersection
UNION ALL
SELECT
'input',
ST_Translate(input_geometry, -3427927.75, -5793243.75)
FROM intersection
UNION ALL
SELECT
'intersection',
ST_Translate(result_geometry, -3427927.75, -5793243.75)
FROM intersection
)
SELECT title, geom AS geom
FROM layers
ORDER BY CASE title
WHEN 'raster' THEN 1
WHEN 'input' THEN 2
ELSE 3
END;
title | geom --------------+------------------------------------------------------------- raster | POLYGON((0 0,0 0.25,0.25 0.25,0.25 0,0 0)) input | LINESTRING(0.1 0,0.05 0,0.05 0.05) intersection | GEOMETRYCOLLECTION