- Categorias:
ST_ISVALID¶
Retorna TRUE se o objeto GEOGRAPHY ou GEOMETRY especificado representa uma forma válida. Exemplos de formas inválidas incluem formas com autointerseções e picos.
Sintaxe¶
ST_ISVALID( <geography_or_geometry_expression> )
Argumentos¶
geography_or_geometry_expression
O argumento deve ser uma expressão do tipo GEOGRAPHY ou GEOMETRY.
Retornos¶
Retorna um valor BOOLEAN.
Notas de uso¶
ST_ISVALID verifica apenas a validade de uma forma. Ele não modifica os dados. Ao construir objetos a partir de formatos espaciais (como WKT, WKB, EWKT, EWKBou GeoJSON), as funções de conversão (por exemplo, TO_GEOGRAPHY, TO_GEOMETRY, ST_GEOGRAPHYFROMWKT ou ST_GEOMETRYFROMWKT) analisam a entrada e, por padrão, tentam validar ou reparar formas. Se uma função de conversão não puder reparar uma forma, ela retornará um erro, a menos que você aceite formas inválidas.
Para ingerir dados que podem ser inválidos (por exemplo, dados que você planeja corrigir posteriormente), especifique TRUE para o argumento
allow_invalid
adicional ao chamar a função de conversão para permitir uma forma inválida. Você pode então usar a função ST_ISVALID para sinalizar linhas inválidas em uma tabela.Algumas funções geoespaciais podem retornar um erro ou resultados inutilizáveis quando recebem formas inválidas. Use a função ST_ISVALID para verificar a validade. Você pode corrigir formas inválidas antes de realizar análise espacial .
Quando as formas são inválidas, correções simples incluem armazenamento em buffer com uma pequena distância positiva ou negativa (por exemplo, para remover picos minúsculos ou resolver autointerseções) e, em seguida, verificar novamente a validade usando a função ST_ISVALID.
Exemplos¶
Os exemplos a seguir usam a função ST_ISVALID.
Determinar se um polígono é uma forma válida:
SELECT ST_ISVALID(
TO_GEOGRAPHY('POLYGON((-93.086 37.557,-86.699 37.497,-93.198 35.123,-93.086 37.557))')
) AS is_valid;
+----------+
| IS_VALID |
|----------|
| True |
+----------+
SELECT ST_ISVALID(
TO_GEOGRAPHY( 'POLYGON((-92.799 37.601,-88.240 37.617,-92.733 36.198,-88.305 36.171,-92.799 37.601))', TRUE)
) AS is_valid;
+----------+
| IS_VALID |
|----------|
| False |
+----------+
Corrija uma forma inválida usando a função ST_BUFFER para adicionar buffer pequeno:
WITH g AS (
SELECT TO_GEOMETRY('POLYGON((0 0, 2 2, 2 0, 0 2, 0 0))', TRUE) AS geom
)
SELECT ST_ISVALID(geom) AS is_valid_before_buffer,
ST_ISVALID(ST_BUFFER(geom, -0.001)) AS is_valid_after_buffer
FROM g;
+------------------------+-----------------------+
| IS_VALID_BEFORE_BUFFER | IS_VALID_AFTER_BUFFER |
|------------------------+-----------------------|
| False | True |
+------------------------+-----------------------+