暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

金仓数据库 KingbaseGIS 使用手册(8.12. 栅格运算符、8.13. 栅格和栅格波段空间关系函数)

数据猿 2022-08-12
376

8.12. 栅格运算符

8.12.1. &&

&& —如果输入对象A的 bounding box与输入对象B的bounding box有交集,则返回TRUE。

用法

boolean &&( raster A , raster B );

描述

如果输入栅格A的 bounding box与输入栅格B的bounding box有交集,则返回TRUE。

注意

这个函数会充分利用栅格上的任意索引。

样例

SELECT A.rid As a_rid, B.rid As b_rid, A.rast && B.rast As intersect
FROM dummy_rast AS A CROSS JOIN dummy_rast AS B LIMIT 3;

a_rid| b_rid| intersect
-----+------+---------
2    | 2    | t
2    | 3    | f
2    | 1    | f

8.12.2. &<

&< —如果栅格A的缓冲区在B的左边,那么返回true。

用法

boolean &<( raster A , raster B );

描述

如果输入栅格A的bounding box与输入栅格B的bounding box重合或者在后者的右边,则返回TRUE。 或者更准确地说,覆盖或者不在栅格B的bounding box的右侧。

注意

这个函数会充分利用几何对象上的任意索引。

样例

SELECT A.rid As a_rid, B.rid As b_rid, A.rast &< B.rast As overleft
FROM dummy_rast AS A CROSS JOIN dummy_rast AS B;

a_rid| b_rid| overleft
-----+------+----------
2    | 2    | t
2    | 3    | f
2    | 1    | f
3    | 2    | t
3    | 3    | t
3    | 1    | f
1    | 2    | t
1    | 3    | t
1    | 1    | t

8.12.3. &>

&> —如果A的bounding box覆盖或在B的bounding box的右侧,则返回TRUE。

用法

boolean &>( raster A , raster B );

描述

如果A的bounding box覆盖或在B的bounding box的右侧,则返回TRUE,或者更准确地说覆盖或者不在栅格B的bounding box的左侧。

注意

这个函数会充分利用几何对象上的任意索引。

样例

SELECT A.rid As a_rid, B.rid As b_rid, A.rast &> B.rast As overright
FROM dummy_rast AS A CROSS JOIN dummy_rast AS B;

a_rid| b_rid| overright
-----+------+----------
2    | 2    | t
2    | 3    | t
2    | 1    | t
3    | 2    | f
3    | 3    | t
3    | 1    | f
1    | 2    | f
1    | 3    | t
1    | 1    | t

8.12.4. =

= ——如果栅格A的bounding box与B的bounding box相同,则返回TRUE。注意:输入的栅格A和B的bounding box都是双精度。

用法

boolean =( raster A , raster B );

描述

如果geometry或geography对象A的bounding box与geometry或geography对象B的bounding box相同,则返回TRUE。 KingbaseES使用针对栅格定义的运算符=,<和>来进行内部排序和栅格之间的比较(例如在GROUP BY或ORDER BY这样的SQL子 句中)。

警告

这个运算符不会使用栅格上的任何索引,使用运算符~=代替,这个运算符可以用于栅格列的聚合操作。

参考

~=

8.12.5. ~=

~= —如果栅格A的缓冲区和栅格B的缓冲区相同,则返回true。

用法

boolean ~=( raster A , raster B );

描述

如果栅格A的缓冲区和栅格B的缓冲区相同,则返回true。

注意

这个函数会充分利用栅格上的任意索引。

样例

非常有用的用例是:以两套单波段栅格,但每一个栅格代表不同的主题,用来创建一个多波段的栅格。

SELECT ST_AddBand(prec.rast, alt.rast) As new_rast
FROM prec INNER JOIN alt ON (prec.rast ~= alt.rast);

参考

ST_AddBand, =

8.13. 栅格和栅格波段空间关系函数

8.13.1. ST_Contains

ST_Contains —当且仅当栅格rastB的所有点没有在栅格rastA的外部,并且rastB最少有一个点在rastA的内部。

用法

boolean ST_Contains( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_Contains( raster rastA , raster rastB );

描述

当且仅当栅格rastB的所有点没有在栅格rastA的外部,并且rastB最少有一个点在rastA的内部。 如果没有指定是哪个波段(或设置为NULL),只有栅格的凸包会被考虑,如果提供了波段号,只有值不为NODATA的像素会被考虑处理。

注意

这个函数会充分利用栅格上的任意索引。

注意

要想测试一个栅格和一个几何对象的空间关系,对栅格使用函数ST_Polygon,ST_Contains(ST_Polygon(raster), geometry) 或 ST_Contains(geometry, ST_Polygon(raster)) 。

注意

函数ST_Contains()是函数ST_Within()相反效果的函数,因此函数ST_Contains(rastA, rastB) 的结果和函数ST_Within(rastB, rastA)的结果一样。

样例

-- specified band numbers
SELECT r1.rid, r2.rid, ST_Contains(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN
dummy_rast r2 WHERE r1.rid = 1;

NOTICE: The first raster provided has no bands

rid| rid | st_contains
---+-----+-------------
1  | 1   |
1  | 2   | f

-- no band numbers specified
SELECT r1.rid, r2.rid, ST_Contains(r1.rast, r2.rast) FROM dummy_rast r1 CROSS JOIN
dummy_rast r2 WHERE r1.rid = 1;

rid| rid | st_contains
---+-----+-------------
1  | 1   | t
1  | 2   | f

参考

ST_Intersects, ST_Within

8.13.2. ST_ContainsProperly

ST_ContainsProperly —如果输入栅格B和栅格A的内部相交,但不和A的边界(或外部)有接触,那么返回TRUE。

用法

boolean ST_ContainsProperly( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_ContainsProperly( raster rastA , raster rastB );

描述

如果输入栅格B和栅格A的内部相交,但不和A的边界(或外部)有接触,那么返回TRUE。 如果没有指定波段(或者设定为NULL值),那么该函数只适用于凸包型的栅格,如果指定了波段,那么只有有像元值(非NODATA)的栅格适用于这个函数。

注意

这个函数会充分利用栅格上的任意索引。

注意

要想测试一个栅格和一个几何对象之间的关系,对栅格应用函数ST_Polygon, 例如ST_ContainsProperly(ST_Polygon(raster), geometry)或ST_ContainsProperly(geometry, ST_Polygon(raster)) 。

样例

SELECT r1.rid, r2.rid, ST_ContainsProperly(r1.rast, 1, r2.rast, 1)
FROM dummy_rast r1 CROSS
JOIN dummy_rast r2 WHERE r1.rid = 2;

rid| rid | st_containsproperly
---+-----+---------------------
2  | 1   | f
2  | 2   | f

参考

ST_Intersects, ST_Contains

8.13.3. ST_Covers

ST_Covers —如果栅格rastB没有点在栅格rastA外,则返回true。

用法

boolean ST_Covers( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_Covers( raster rastA , raster rastB );

描述

如果栅格rastB没有点在栅格rastA外,则返回true。如果没有指定波段(或者设定为NULL值),那么该函数只适用于凸包型的栅格, 如果指定了波段,那么只有有像元值(非NODATA)的栅格适用于这个函数。

注意

这个函数会充分利用栅格上的任意索引。

注意

想要测试一个栅格和一个几何对象的空间关系,对栅格使用函数ST_Polygon, 例如ST_Covers(ST_Polygon(raster), geometry) 或ST_Covers(geometry, ST_Polygon(raster)) 。

样例

SELECT r1.rid, r2.rid, ST_Covers(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN
dummy_rast r2 WHERE r1.rid = 2;

rid|rid| st_covers
---+---+-----------
2  | 1 | f
2  | 2 | t

参考

ST_Intersects, ST_CoveredBy

8.13.4. ST_CoveredBy

ST_CoveredBy —如果栅格rastA没有点在栅格rastB外,则返回true。

用法

boolean ST_CoveredBy( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_CoveredBy( raster rastA , raster rastB );

描述

如果栅格rastA没有点在栅格rastB外,则返回true。 如果没有指定波段(或者设定为NULL值),那么该函数只适用于凸包型的栅格,如果指定了波段,那么只有有像元值(非NODATA)的栅格适用于这个函数。

注意

这个函数会充分利用栅格上的任意索引。

注意

想要测试一个栅格和一个几何对象的空间关系,对栅格使用函数ST_Polygon, 例如ST_CoveredBy(ST_Polygon(raster), geometry) 或ST_CoveredBy(geometry, ST_Polygon(raster)) 。

样例

SELECT r1.rid, r2.rid, ST_CoveredBy(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN
dummy_rast r2 WHERE r1.rid = 2;

rid|rid| st_coveredby
---+---+--------------
2  | 1 | f
2  | 2 | t

参考

ST_Intersects, ST_Covers

8.13.5. ST_Disjoint

ST_Disjoint —如果两个栅格rastA和栅格rastB没有空间相交,则返回true。

用法

boolean ST_Disjoint( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_Disjoint( raster rastA , raster rastB );

描述

如果两个栅格rastA和栅格rastB没有空间相交,则返回true。 如果没有指定波段(或者设定为NULL值),那么该函数只适用于凸包型的栅格,如果指定了波段,那么只有有像元值(非NODATA)的栅格适用于这个函数。

注意

该函数不使用任何索引。

注意

想要测试一个栅格和一个几何对象的空间关系,对栅格使用函数ST_Polygon, 例如ST_Disjoint(ST_Polygon(raster), geometry) 。

样例

-- rid = 1 has no bands, hence the NOTICE and the NULL value for st_disjoint
SELECT r1.rid, r2.rid, ST_Disjoint(r1.rast, 1, r2.rast, 1)
FROM dummy_rast r1 CROSS JOIN
dummy_rast r2 WHERE r1.rid = 2;

NOTICE: The second raster provided has no bands

rid|rid| st_disjoint
---+---+-------------
2  | 1 |
2  | 2 | f

-- this time, without specifying band numbers
SELECT r1.rid, r2.rid, ST_Disjoint(r1.rast, r2.rast)
FROM dummy_rast r1 CROSS JOIN
dummy_rast r2 WHERE r1.rid = 2;

rid|rid| st_disjoint
---+---+-------------
2  | 1 | t
2  | 2 | f

参考

ST_Intersects

8.13.6. ST_Intersects

ST_Intersects — 如果栅格rastA和栅格rastB空间上相交,则返回true。

用法

boolean ST_Intersects( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_Intersects( raster rastA , raster rastB );
boolean ST_Intersects( raster rast , integer nband , geometry geommin);
boolean ST_Intersects( raster rast , geometry geommin , integer nband=NULL );
boolean ST_Intersects( geometry geommin , raster rast , integer nband=NULL );

描述

如果栅格rastA和栅格rastB空间上相交,则返回true。 如果没有指定波段(或者设定为NULL值),那么该函数只适用于凸包型的栅格,如果指定了波段,那么只有有像元值(非NODATA)的栅格适用于这个函数。

注意

这个函数会充分利用栅格上的任意索引。

样例

-- different bands of same raster
SELECT ST_Intersects(rast, 2, rast, 3) FROM dummy_rast WHERE rid = 2;

st_intersects
---------------
t

参考

ST_Intersection, ST_Disjoint

8.13.7. ST_Overlaps

ST_Overlaps —如果栅格rastA和rastB相交,但是一个并没有完全包含另一个,则返回true。

用法

boolean ST_Overlaps( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_Overlaps( raster rastA , raster rastB );

描述

如果栅格rastA和rastB相交,但是一个并没有完全包含另一个,则返回true。 如果没有指定波段(或者设定为NULL值),那么该函数只适用于凸包型的栅格,如果指定了波段,那么只有有像元值(非NODATA)的栅格适用于这个函数。

注意

这个函数会充分利用栅格上的任意索引。

注意

想要测试一个栅格和一个几何对象的空间关系,在栅格上使用函数ST_PolygonST_Overlaps(ST_Polygon(raster), geometry) 。

样例

-- comparing different bands of same raster
SELECT ST_Overlaps(rast, 1, rast, 2) FROM dummy_rast WHERE rid = 2;

st_overlaps
-------------
f

参考

ST_Intersects

8.13.8. ST_Touches

ST_Touches — 如果两个栅格rastA和rastB有至少一个共同点,但内部并不相交,那么返回true。

用法

boolean ST_Touches( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_Touches( raster rastA , raster rastB );

描述

如果两个栅格rastA和rastB有至少一个共同点,但内部并不相交,那么返回true。 如果没有指定波段(或者设定为NULL值),那么该函数只适用于凸包型的栅格,如果指定了波段,那么只有有像元值(非NODATA)的栅格适用于这个函数。

注意

这个函数会充分利用栅格上的任意索引。

注意

想要测试一个栅格和一个几何对象的空间关系,在栅格上使用函数ST_Polygon,例如ST_Touches(ST_Polygon(raster), geometry) 。

样例

SELECT r1.rid, r2.rid, ST_Touches(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN
dummy_rast r2 WHERE r1.rid = 2;

rid|rid| st_touches
---+---+------------
2  | 1 | f
2  | 2 | f

参考

ST_Intersects

8.13.9. ST_SameAlignment

ST_SameAlignment — 如果上之间有相同的特征值skew, scale, spatial ref(即SRID),则返回true。如果有不同,则返回false。

用法

boolean ST_SameAlignment( raster rastA , raster rastB );
boolean ST_SameAlignment( double precision ulx1 , double precision uly1 , double precision scalex1 , double precision scaley1, double precision skewx1 , double precision skewy1 , double precision ulx2 , double precision uly2 , double precision scalex2 ,double precision scaley2 , double precision skewx2 , double precision skewy2 );
boolean ST_SameAlignment( raster set rastfield );

描述

非聚合函数版本 (函数变体1和函数变体2): 如果两个栅格(或者直接提供或者使用参数upperleft, scale, skew 和 srid的值)有相同的参数scale, skew, srid 和至少有一个栅格的任意像素的任意角点和另一个栅格的任意像素的任意角点重叠,那么返回true。如果不满足这些条件将会返回false,并提示对齐方式的细节问题。

聚合版本(函数变体3):如果一个集合的栅格都aligned(对齐),那么返回true。函数ST_SameAlignment()从KingbaseES的术语来看是一个“聚合”函数。这意味着它的执行方式和SQL里面的函数SUM()和 AVG() 是类似的。

样例 : Rasters

SELECT ST_SameAlignment(
ST_MakeEmptyRaster(1, 1, 0, 0, 1, 1, 0, 0),
ST_MakeEmptyRaster(1, 1, 0, 0, 1, 1, 0, 0)
) as sm;

sm
----
t

SELECT ST_SameAlignment(A.rast,b.rast)
FROM dummy_rast AS A CROSS JOIN dummy_rast AS B;

NOTICE: The two rasters provided have different SRIDsNOTICE: The two
rasters provided have different SRIDs

st_samealignment
------------------
t
f
f
f

参考

6.1节, ST_NotSameAlignmentReason, ST_MakeEmptyRaster

8.13.10. ST_NotSameAlignmentReason

ST_NotSameAlignmentReason — 如果栅格对齐了那么返回描述信息,如果没有对齐,返回没有对齐的原因。

用法

boolean ST_SameAlignment(raster rastA, raster rastB);

描述

如果栅格对齐了那么返回描述信息,如果没有对齐,返回没有对齐的原因。

注意

如果栅格没有对齐有多种原因,那么只返回其中一个原因(第一个让对齐失败的理由)。

样例

SELECT
ST_SameAlignment(
ST_MakeEmptyRaster(1, 1, 0, 0, 1, 1, 0, 0),
ST_MakeEmptyRaster(1, 1, 0, 0, 1.1, 1.1, 0, 0)
),
ST_NotSameAlignmentReason(
ST_MakeEmptyRaster(1, 1, 0, 0, 1, 1, 0, 0),
ST_MakeEmptyRaster(1, 1, 0, 0, 1.1, 1.1, 0, 0) )
;

st_samealignment  |st_notsamealignmentreason
------------------+-------------------------------------------------
f                 | The rasters have different scales on the X axis
(1 row)

参考

6.1节, ST_SameAlignment

8.13.11. ST_Within

ST_Within — 当且仅当栅格rastA的所有点没有在栅格rastB的外部,并且rastA最少有一个点在rastB的内部。

用法

boolean ST_Within( raster rastA , integer nbandA , raster rastB , integer nbandB );
boolean ST_Within( raster rastA , raster rastB );

描述

当且仅当栅格rastA的所有点没有在栅格rastB的外部,并且rastA最少有一个点在rastB的内部。

如果没有指定波段(或者设定为NULL值),那么该函数只适用于凸包型的栅格,如果指定了波段,那么只有有像元值(非NODATA)的栅格适用于这个函数。

注意

这个函数会充分利用栅格上的任意索引。

注意

要想测试一个栅格和一个几何对象的空间关系,对栅格使用函数ST_Polygon,例如ST_Within(ST_Polygon(raster), geometry) 或ST_Within(geometry, ST_Polygon(raster)) .

注意

函数ST_Within() 是函数ST_Contains()的逆实现,因此函数ST_Within(rastA, rastB)与函数ST_Contains(rastB, rastA)调用结果相同。

样例

SELECT r1.rid, r2.rid, ST_Within(r1.rast, 1, r2.rast, 1) FROM dummy_rast r1 CROSS JOIN
dummy_rast r2 WHERE r1.rid = 2;

rid|rid| st_within
---+---+-----------
2  | 1 | f
2  | 2 | t

参考

ST_Intersects, ST_Contains, ST_DWithin, ST_DFullyWithin

8.13.12. ST_DWithin

ST_DWithin — 如果栅格rastA和栅格rastB的距离在指定的距离内,则返回true。

用法

boolean ST_DWithin( raster rastA , integer nbandA , raster rastB , integer nbandB , double precision distance_of_srid );
boolean ST_DWithin( raster rastA , raster rastB , double precision distance_of_srid );

描述

如果栅格rastA和栅格rastB的距离在指定的距离内,则返回true。 如果没有指定波段(或者设定为NULL值),那么该函数只适用于凸包型的栅格,如果指定了波段,那么只有有像元值(非NODATA)的栅格适用于这个函数。距离单位是由栅格所在的空间参考系所定义的。 要想使用这个函数,输入的源栅格必须都有相同的坐标参考系也就是有相同的SRID。

注意

这个函数会充分利用栅格上的任意索引。

注意

想要测试栅格和几何对象之间的关系,需要对栅格使用函数ST_Polygon,例如ST_DWithin(ST_Polygon(raster), geometry) 。

样例

SELECT r1.rid, r2.rid, ST_DWithin(r1.rast, 1, r2.rast, 1, 3.14) FROM dummy_rast r1 CROSS
JOIN dummy_rast r2 WHERE r1.rid = 2;

rid|rid| st_dwithin
---+---+------------
2  | 1 | f
2  | 2 | t

参考

ST_Within, ST_DFullyWithin

8.13.13. ST_DFullyWithin

ST_DFullyWithin —如果栅格rastA和栅格rastB的距离完全在指定的距离内,则返回true。

用法

boolean ST_DFullyWithin( raster rastA , integer nbandA , raster rastB , integer nbandB , double precision distance_of_srid );
boolean ST_DFullyWithin( raster rastA , raster rastB , double precision distance_of_srid );

描述

如果栅格rastA和栅格rastB的距离完全在指定的距离内,则返回true。 如果没有指定波段(或者设定为NULL值),那么该函数只适用于凸包型的栅格,如果指定了波段,那么只有有像元值(非NODATA)的栅格适用于这个函数。 距离单位是由栅格所在的空间参考系所定义的。要想使用这个函数,输入的源栅格必须都有相同的坐标参考系也就是有相同的SRID。

注意

这个函数会充分利用栅格上的任意索引。

注意

想要测试栅格和几何对象之间的关系,需要在栅格上使用函数ST_Polygon,例如:ST_DFullyWithin(ST_Polygon(raster), geometry) 。

样例

SELECT r1.rid, r2.rid, ST_DFullyWithin(r1.rast, 1, r2.rast, 1, 3.14) FROM dummy_rast r1
CROSS JOIN dummy_rast r2 WHERE r1.rid = 2;

rid|rid| st_dfullywithin
---+---+-----------------
2  | 1 | f
2  | 2 | t

参考

ST_Within, ST_DWithin

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论