Quais são as implicações de geometrias inválidas

15

Importei alguns dados em um banco de dados Postgis e algumas das geometrias são relatadas inválidas (ST_IsValidReason relata auto-interseção ou auto-interseção de anel).

As consultas que estou executando não parecem afetadas pelo aspecto inválido dessas geometrias (só estou usando consultas ST_Distance).

Quais são as coisas que quebram quando as geometrias são inválidas?

A correção dessas geometrias "automaticamente" (buffer (geom, 0) ou ST_SimplifyPreserveTopology (geom, 0,0001)) é uma opção?

diciu
fonte

Respostas:

19

Manter dados malformados é uma má ideia, porque você nunca pode prever quando e onde ocorrerá a falha. Além disso, dados malformados podem causar Heisenbugs , o tipo mais vicioso e ilusório de erros.

Eu acho que é um pouco inútil discutir o possível resultado do armazenamento de geometrias inválidas. Dito isto, as consequências podem incluir:

  • Resultados incorretos (ou seja, ST_Distanceretornarão valores incorretos ou imprecisos)
  • Problemas de desempenho do banco de dados: Manter dados malformados pode prejudicar seriamente o desempenho do banco de dados e criar um arquivo de log enorme, pois todas as chamadas de função gravam um erro no log e interrompem o trabalho comum do banco de dados.
  • Falhas no banco de dados.
  • Falhas no aplicativo - causadas pelo recebimento de dados malformados do banco de dados ou pelo recebimento de resultados irracionais (distância negativa, por exemplo).
  • Comportamento fantasma (veja o link acima). Esta é a pior consequência de todas. Você terá coisas estranhas acontecendo. Lentidão, perda de dados, falhas, resultados irracionais, longas pausas, sem resposta e muitas outras maldições. Talvez você não consiga identificá-los ou reproduzi-los, porque todos se enquadram na categoria "indefinida" em toda a documentação.

Meu conselho - se pequenos buffers não prejudicarem significativamente a consistência dos dados, use-os para impedir que alguma das situações acima aconteça. Mantenha seus dados válidos.

Adam Matan
fonte
Você pode elaborar um pouco sobre o uso de buffers pequenos? Como faço isso?
diciu
1
ST_Buffer(the_geom, 0.0000001)pode fazer o truque para auto-interseção. Use-o apenas se as consequências de uma geometria um pouco maior não forem severas.
quer
1
Minha experiência é que a correção de dados malformados é uma investigação e tanto. Mas, apesar de demorado, normalmente vale o esforço. O ST_Buffer(the_geom, 0.0000001)truque definitivamente ajuda muito.
Chau
O problema é que ST_Buffer corrige a geometria, mas o resultado não é exatamente o que eu esperava - para esse polígono inválido aqui ( openstreetmap.org/browse/way/51954364 ) ST_Buffer retorna apenas o retângulo superior esquerdo. ST_SimplifyPreserveTopology parece estar mais próximo do que eu preciso (geometria válida, mas o mais próximo possível do original inválido). Alguma desvantagem no uso de ST_SimplifyPreserveTopology?
diciu
Essa geometria deve ser processada como um MULTIPOLYGONdos dois polígonos, não como um único POLYGON. Tente obter o WKT original, se possível.
precisa
13

Você pode impedir que geometrias inválidas entrem no seu banco de dados. Para usuários do PostgreSQL / PostGIS, isso é simples, com restrições de verificação . Por exemplo, considere uma tabela public.my_valid_tablecom uma coluna de geometrias de polígonos geom, use o seguinte SQL / DDL:

ALTER TABLE public.my_valid_table
  ADD CONSTRAINT enforce_valid_geom CHECK (st_isvalid(geom));

Nota: esta tabela precisa ter polígonos válidos antes de aplicar a restrição.

Se você tentar inserir / adicionar uma geometria inválida, verá um erro:

ERROR:  new row for relation "my_valid_table" violates check constraint "enforce_valid_geom"
Mike T
fonte