Categorias:

Funções geoespaciais

ST_SIMPLIFY

Dado um objeto de entrada GEOGRAPHY ou GEOMETRY que representa uma linha ou polígono, retorna uma aproximação mais simples do objeto. A função identifica e remove os vértices selecionados, resultando em um objeto semelhante com menos vértices.

Por exemplo, se o objeto de entrada for um polígono com 50 vértices, ST_SIMPLIFY poderá retornar um polígono mais simples com apenas 20 desses vértices.

Ao simplificar um objeto, a função remove um vértice somente se a distância entre esse vértice e a borda resultante da remoção desse vértice estiver dentro da tolerância especificada.

Sintaxe

ST_SIMPLIFY( <geography_expression>, <tolerance> [ , <preserve_collapsed> ] )
ST_SIMPLIFY( <geometry_expression>, <tolerance> )
Copy

Argumentos

Obrigatório:

geography_expression . OR . geometry_expression

O objeto GEOGRAPHY ou GEOMETRY a ser simplificado.

Dependendo do tipo do objeto GEOGRAPHY ou GEOMETRY, ST_SIMPLIFY tem o seguinte efeito:

Tipo de objeto

Efeito de ST_SIMPLIFY

LineString MultiLineString, polígono ou MultiPolygon

ST_SIMPLIFY aplica o algoritmo de simplificação

Ponto ou MultiPoint

ST_SIMPLIFY não tem nenhum efeito.

GeometryCollection ou FeatureCollection

Para objetos GEOGRAPHY, ST_SIMPLIFY aplica o algoritmo de simplificação a cada objeto da coleção. . . Para objetos GEOMETRY, ST_SIMPLIFY não oferece suporte a estes tipos.

tolerance

A distância máxima em metros entre um vértice e a borda resultante da remoção do vértice. Se a distância exceder esta tolerância para um vértice, ST_SIMPLIFY manterá esse vértice no objeto simplificado.

Opcional:

preserve_collapsed

(Somente para objetos GEOGRAPHY) Se TRUE, são retidos objetos que de outra forma seriam muito pequenos dada a tolerância.

Por exemplo, quando preserve_collapsed é FALSE e tolerance é 10 (metros), uma linha de 1m é reduzida a um ponto no objeto simplificado. Quando preserve_collapsed é TRUE, a linha é preservada no objeto simplificado.

Padrão: FALSE.

Retornos

A função retorna um valor do tipo GEOGRAPHY ou GEOMETRY.

Exemplos

Exemplos GEOGRAPHY

Os exemplos nesta seção mostram a saída em formato WKT:

alter session set GEOGRAPHY_OUTPUT_FORMAT='WKT';
Copy

O exemplo a seguir retorna um LineString simplificado que tem menos vértices do que o LineString original. No objeto simplificado, um vértice é omitido se a distância entre o vértice e a borda que substitui o vértice for inferior a 1.000 metros.

SELECT ST_SIMPLIFY(
    TO_GEOGRAPHY('LINESTRING(-122.306067 37.55412, -122.32328 37.561801, -122.325879 37.586852)'),
    1000);
+----------------------------------------------------------------------------------------------------+
| ST_SIMPLIFY(                                                                                       |
|     TO_GEOGRAPHY('LINESTRING(-122.306067 37.55412, -122.32328 37.561801, -122.325879 37.586852)'), |
|     1000)                                                                                          |
|----------------------------------------------------------------------------------------------------|
| LINESTRING(-122.306067 37.55412,-122.325879 37.586852)                                             |
+----------------------------------------------------------------------------------------------------+
Copy

Exemplos GEOMETRY

Os exemplos nesta seção mostram a saída em formato WKT:

ALTER SESSION SET GEOMETRY_OUTPUT_FORMAT='WKT';
Copy

O exemplo a seguir retorna um LineString simplificado que tem menos vértices do que o LineString original. No objeto simplificado, um vértice é omitido se a distância entre o vértice e a borda que substitui o vértice for inferior a 500 metros.

SELECT ST_SIMPIFY(
  TO_GEOMETRY('LINESTRING(1100 1100, 2500 2100, 3100 3100, 4900 1100, 3100 1900)'),
  500);

+----------------------------------------------------------------------------------------------------+
| ST_SIMPLIFY(TO_GEOMETRY('LINESTRING(1100 1100, 2500 2100, 3100 3100, 4900 1100, 3100 1900)'), 500) |
|----------------------------------------------------------------------------------------------------|
| LINESTRING(1100 1100,3100 3100,4900 1100,3100 1900)                                                |
+----------------------------------------------------------------------------------------------------+
Copy

O exemplo a seguir simplifica uma elipse que tem 36 vértices iniciais para uma forma com 16 ou 10 vértices, dependendo do argumento tolerance:

SELECT ST_NUMPOINTS(geom) AS numpoints_before,
  ST_NUMPOINTS(ST_Simplify(geom, 0.5)) AS numpoints_simplified_05,
  ST_NUMPOINTS(ST_Simplify(geom, 1)) AS numpoints_simplified_1
  FROM
  (SELECT ST_BUFFER(to_geometry('LINESTRING(0 0, 1 1)'), 10) As geom);

+------------------+-------------------------+------------------------+
| NUMPOINTS_BEFORE | NUMPOINTS_SIMPLIFIED_05 | NUMPOINTS_SIMPLIFIED_1 |
|------------------+-------------------------+------------------------|
|               36 |                      16 |                     10 |
+------------------+-------------------------+------------------------+
Copy