创建或刷新索引之前确保多边形的有效性
当 Vertica 创建或更新空间索引时,它不会检查多边形的有效性。为防止查询空间索引时获得无效结果,您应在创建或更新空间索引之前检查多边形的有效性。
以下示例向您展示如何检查多边形的有效性。
-
创建表并加载空间数据。
=> CREATE TABLE polygon_validity_test (gid INT, geom GEOMETRY); CREATE TABLE => COPY polygon_validity_test (gid, gx FILLER LONG VARCHAR, geom AS St_GeomFromText(gx)) FROM STDIN; Enter data to be copied followed by a newline. End with a backslash and a period on a line by itself. >> 2|POLYGON((-31 74,8 70,8 50,-36 53,-31 74)) >> 3|POLYGON((-38 50,4 13,11 45,0 65,-38 50)) >> 4|POLYGON((-12 42,-12 42,27 48,14 26,-12 42)) >> 5|POLYGON((0 0,1 1,0 0,2 1,1 1,0 0)) >> 6|POLYGON((3 3,2 2,2 1,2 3,3 3)) >> \.
-
使用 ST_IsValid 和 STV_IsValidReason 查找任何无效的多边形。
=> SELECT gid, ST_IsValid(geom), STV_IsValidReason(geom) FROM polygon_validity_test; gid | ST_IsValid | STV_IsValidReason -----+------------+------------------------------------------ 4 | t | 6 | f | Self-intersection at or near POINT (2 1) 2 | t | 3 | t | 5 | f | Self-intersection at or near POINT (0 0) (5 rows)
既然我们已经在表中识别出无效的多边形,因此在创建或刷新空间索引时,我们可以通过几种不同的方式来处理无效的多边形。
使用 WHERE 子句筛选无效多边形
此方法比创建索引之前进行筛选要慢,因为它在执行时将检查每个多边形的有效性。
以下示例向您展示如何使用 WHERE 子句排除无效多边形。
```
=> SELECT STV_Create_Index(gid, geom USING PARAMETERS index = 'valid_polygons') OVER()
FROM polygon_validity_test
WHERE ST_IsValid(geom) = 't';
```
创建或刷新索引之前筛选无效多边形
此方法比使用 WHERE 子句进行筛选更快,因为在构建索引之前会降低性能。
以下示例向您展示如何创建一个排除无效多边形的新表,以此来排除无效多边形。
```
=> CREATE TABLE polygon_validity_clean AS
SELECT *
FROM polygon_validity_test
WHERE ST_IsValid(geom) = 't';
CREATE TABLE
=> SELECT STV_Create_Index(gid, geom USING PARAMETERS index = 'valid_polygons') OVER()
FROM polygon_validity_clean;
```