Como reparar um polígono com auto-interseção?
-
28-09-2019 - |
Pergunta
Existe uma maneira de remover as auto-intercepções de um polígono usando GEOs?
Solução
Então, eu tenho que responder à pergunta sozinho. Talvez isso ajude alguém.
Você pode reparar um polígono usando o GEOS :: Operação :: Buffer :: Bufferop Class. Por exemplo
geos::geom::Geometry * result =
geos::operation::buffer::BufferOp::bufferOp(polygon, 1.0);
Você pode encontrar mais algumas boas receitas no Segredos da suíte de topologia JTS.
Outras dicas
Muitas vezes são permitidas cruzamentos de pontos, para que você possa mudar
1 2 4
*--* *
| \ /|
| X |
| / \|
*--* *
6 5 3
para
1 2 4
*--* *
| \ /|
| 3*6|
| / \|
*--* *
8 7 5
onde os pontos 3 e 6 são os mesmos. Se não forem permitidos cruzamentos de pontos, mova um deles uma pequena quantidade.
Na minha experiência, a maioria dessas interseções alguns é de uma simplificação de polígonos com defeito, por isso seria melhor voltar à fonte, se possível.
O polígono auto-intercalado é inválido. Assim, o buflorop pode dar resultado inválido. Não encontrei nenhuma maneira de consertar o polígono auto-intercalado em GEOs. Função ST_MakeValid no PostGIS usa GEOs. Portanto, é possível investigar o código -fonte.