Como é calculado o ST_PointOnSurface?

21

Os estados de documentação PostGIS que ST_PointOnSurfaceretorna "um ponto garantido estar na superfície". Parece que essa função pode ser implementada trivialmente para fornecer resultados que satisfaçam a documentação, mas fornecem pouca utilidade no mundo real, embora eu esteja certo de que o PostGIS fornece uma implementação não trivial.

Esta introdução ao PostGIS fornece uma boa comparação e contraste ST_Centroidcom ST_PointOnSurfacee diz que "[ST_PointOnSurface] é substancialmente mais caro em termos de computação que a operação do centróide".

Existe uma explicação mais completa de como ST_PointOnSurfaceé calculado? Estou usando ST_Centroid, mas encontrei alguns casos extremos nos meus dados em que o centróide está fora da geometria. Acredito que esse ST_PointOnSurfaceseja o substituto correto, mas o nome da função e a documentação deixam espaço para incertezas.

Além disso, a despesa computacional é ST_PointOnSurfaceincorrida mesmo que o centróide já esteja dentro da geometria?

mjobrien
fonte
Existe exatamente porque o centróide de polígonos não convexos nem sempre está incluído nele. Não tem nada a ver com alturas e DEMs, se essa é a parte confusa do nome. É melhor verificar os detalhes da implementação no código, mas acredito que você obterá uma resposta melhor no GIS.se.
Lynxlynxlynx
Bom ponto no GIS.se. Existe uma maneira de migrar essa pergunta para lá? Eu entendo por que ambas as funções existem. Acho o nome confuso porque existem infinitos pontos na superfície das goemetrias de polígonos com as quais estou trabalhando. No entanto, apenas um pequeno subconjunto desses pontos serve ao meu propósito. Quero saber que estou conseguindo um argumento que faz sentido sobre como quero usá-lo.

Respostas:

24

Com base em algumas experiências, acho que ST_PointOnSurface()funciona mais ou menos assim, se a geometria for um polígono:

  1. Trace um raio leste-oeste, situado a meio caminho entre as extensões norte e sul do polígono.
  2. Encontre o segmento mais longo do raio que cruza o polígono.
  3. Retorne o ponto que está a meio caminho ao longo do referido segmento.

Isso pode não fazer sentido, então aqui está um esboço de um polígono com um raio dividindo-o nas partes norte e sul:

             _
            / \             <-- northern extent
           /   \
          /     \
         /       \
        /         \      __
       /           \    /  \
      /_ _ _ P _ _ _\  / _ _\  P = point-on-surface
     /               \/      \
    /                         \
   /            C              \   C = centroid
  /                             \
 /                              /
/______________________________/  <-- southern extent

Assim, ST_PointOnSurface()e ST_Centroid()geralmente são pontos diferentes, mesmo em polígonos convexos.

A única razão para a "superfície" no nome, eu acho, é que, se a geometria tiver linhas 3D, o resultado será simplesmente um dos vértices.

Concordo que mais explicações (e melhores nomes) teriam sido úteis e espero que um programador do GEOS possa lançar um pouco mais de luz sobre o assunto.

Martin F
fonte
3
Olhando para o código libgeos , acredito que você esteja certo. A bissetriz horizontal é encontrada e, em seguida, o ponto médio da interseção mais larga é usado.
mjobrien