/ Desenvolvedores / Correção de limites

Correção de limites

Limites de campo raramente chegam perfeitos. O Launch Pad passa cada limite por um pipeline automático de correção de geometria que detecta formas inválidas e as corrige antes do planejamento, para que os Projetos de Linhas sejam sempre gerados a partir de geometria limpa e válida.

A maioria dos problemas de limites é invisível

Geometria inválida é surpreendentemente comum em dados reais de limites, e a maior parte não pode ser vista em um mapa: uma autointerseção pode se esconder em um único vértice. A maioria dos clientes nunca fica sabendo que seus limites têm esses problemas, porque o Launch Pad os corrige automaticamente. Se você está integrando com a API e se perguntando por que um limite lido de volta difere ligeiramente do que você enviou, esta página explica o que aconteceu e por quê.

De onde vem a geometria inválida

Edição manual

Desenhar um polígono no mapa e depois adicionar, excluir ou arrastar vértices pode introduzir autointerseções e sobreposições sem nenhum sinal visível.

Serviços de terceiros

Limites alterados por plataformas conectadas (por exemplo, o John Deere Operations Center) podem voltar topologicamente malformados.

Arquivos com conteúdo misto

Arquivos enviados às vezes trazem pontos soltos, linhas ou coleções de geometrias em vez de polígonos limpos.

Mais do que um "make valid" básico

A maioria das stacks GIS corrige geometria quebrada com uma única operação de "make valid" (tornar válido). Isso resolve o erro de topologia, mas é um instrumento grosseiro, sem nenhum critério sobre como deve ficar um limite de campo utilizável depois. O Launch Pad, em vez disso, aplica uma sequência de correções direcionadas e mantém uma correção "make valid" genérica como fallback para os casos que as correções direcionadas não conseguem resolver.

Filtragem

Pontos, linhas e outras geometrias sem área são removidos para que apenas polígonos sigam adiante.

Divisão

Limites externos com autointerseção são divididos em polígonos válidos separados, em vez de descartar parte do campo.

União

Buracos sobrepostos ou que se intersectam são unidos em um único buraco, como a especificação exige.

Aplicação de buffer

Um buffer com uma pequena tolerância é aplicado aos anéis para que os buracos nunca compartilhem uma aresta com o limite externo.

Reconstrução

Os buracos são subtraídos dos limites externos para reconstruir um MultiPolygon limpo, recortando qualquer buraco que escape do seu contorno.

Remoção de fragmentos minúsculos

Fragmentos minúsculos abaixo de uma área mínima são descartados, a menos que sejam a única parte do campo.

Normalização

A orientação dos anéis segue a regra da mão direita do GeoJSON e as coordenadas são achatadas para 2D, com quaisquer valores de elevação removidos.

Correção de fallback

Uma correção "make valid" de uso geral trata autointerseções e outros erros que sobrevivem às etapas direcionadas.

O que significa "válido"

A saída do pipeline é sempre um MultiPolygon válido, seguindo as regras de validade de polígonos e MultiPolygon da OGC Simple Features Specification:

  • Todo polígono tem exatamente um anel exterior, e esse anel é um polígono válido: uma linha fechada com pelo menos 3 pontos distintos e sem autointerseções.
  • Anéis interiores, se houver, são polígonos válidos totalmente contidos dentro do seu anel exterior.
  • Anéis interiores não se intersectam entre si; anéis que se intersectam são mesclados em um só.

Anel exterior (contorno externo)

O limite externo de um polígono. Há exatamente um por polígono.

Anel interior (buraco)

Um limite interno recortado do polígono, como um brejo ou um amontoado de pedras. Um polígono pode ter muitos buracos.

MultiPolygon

Uma coleção de polígonos. Um campo com duas parcelas separadas é um único MultiPolygon com dois polígonos.

Mesclagem

Uma operação de união de geometrias: a combinação de formas sobrepostas em uma única forma.

Como o pipeline funciona

  1. 1
    Normalizar a entrada. Apenas a geometria poligonal é mantida. Pontos, linhas e outros membros sem área de coleções de geometrias são descartados, e os anéis exteriores são extraídos.
  2. 2
    Validar cada anel. Cada polígono exterior é validado, um por vez, e depois cada anel interior.
  3. 3
    Corrigir autointerseções. Anéis exteriores com autointerseção são divididos em polígonos separados. Anéis interiores que se intersectam são mesclados. Se uma mesclagem não resolver uma interseção dentro do contorno principal, o polígono recorre a uma correção "make valid" genérica.
  4. 4
    Aplicar um buffer aos anéis. Cada anel recebe um buffer com uma pequena tolerância para que anéis interiores nunca acabem compartilhando uma aresta com um anel exterior.
  5. 5
    Reconstruir o resultado. Os anéis interiores são subtraídos dos anéis exteriores para formar o MultiPolygon final válido. Buracos que caem fora de um contorno são recortados conforme o contorno que os contém, e um buraco que fica totalmente fora de todos os contornos é mantido como um polígono próprio em vez de ser descartado.

Se a entrada não puder ser recuperada, por exemplo quando nada resta depois que as partes inválidas são removidas, o Launch Pad reporta a falha em vez de inventar uma forma, e cada etapa de correção é registrada em log para que o resultado possa ser auditado.

Observação: O processamento acontece em um sistema de coordenadas projetado, de modo que as distâncias ficam em metros, e o resultado é convertido de volta para WGS84. É por isso que as tolerâncias de buffer são expressas em metros, e não em graus.

Exemplos de antes e depois

Cinco casos representativos de geometria de entrada malformada (azul) e a saída corrigida (amarelo). Expanda o WKT para ver as coordenadas exatas.

Caso 1: Tipos de geometria mistos

A entrada é uma GeometryCollection em vez de um MultiPolygon, e contém uma LineString e um Point junto com o polígono propriamente dito. A linha e o ponto são removidos, e o anel exterior é extraído do polígono.

Entrada
Geometria de entrada contendo um polígono mais uma linha e um ponto soltos
WKT de entrada
GEOMETRYCOLLECTION (LINESTRING (131 125, 305 326),
  POINT (260 130),
  POLYGON ((130 330, 223 330, 223 245, 130 245, 130 330)))
Resultado
Geometria do resultado: um único polígono limpo com a linha e o ponto removidos
WKT do resultado
MULTIPOLYGON (((130 330, 223 330, 223 245, 130 245, 130 330)))

Caso 2: Limite com autointerseção

O anel exterior cruza a si mesmo, formando uma gravata-borboleta. Isso não é um polígono válido, e muitos planejadores o rejeitariam ou descartariam silenciosamente um dos lóbulos. A rotina de correção divide o anel no ponto de cruzamento em dois polígonos válidos, preservando toda a área desenhada.

Entrada
Polígono de entrada cujo contorno cruza a si mesmo, formando uma gravata-borboleta com o ponto de interseção destacado
WKT de entrada
POLYGON ((120 110, 120 360, 340 130, 310 360, 120 110))
Resultado
Geometria do resultado: a gravata-borboleta dividida em dois polígonos válidos que se encontram em um único ponto
WKT do resultado
MULTIPOLYGON (((120 110, 120 360, 225.87639311043566 249.3110435663627, 120 110)),
  ((225.87639311043566 249.3110435663627, 310 360, 340 130, 225.87639311043566 249.3110435663627)))

Caso 3: Buracos sobrepostos

Dois anéis interiores se intersectam, o que a especificação proíbe. Os buracos são mesclados em um só, e o polígono é recriado com o único buraco combinado.

Entrada
Geometria de entrada com dois buracos sobrepostos dentro do limite do campo
WKT de entrada
-- outer boundary
POLYGON ((130 460, 550 460, 550 30, 130 30, 130 460))
-- inner boundary
MULTIPOLYGON (((230 110, 410 290, 470 100, 230 110)),
  ((370 380, 400 140, 200 200, 370 380)))
Resultado
Geometria do resultado: os buracos sobrepostos mesclados em um único buraco dentro do limite
WKT do resultado
MULTIPOLYGON (((130 460, 550 460, 550 30, 130 30, 130 460),
  (292.3076923076923 172.30769230769232, 200 200, 370 380, 384.44444444444446 264.44444444444446, 410 290, 470 100, 230 110, 292.3076923076923 172.30769230769232)))

Caso 4: Anéis externos sobrepostos

Vários anéis exteriores se sobrepõem e apresentam autointerseções, delimitando juntos um bolsão vazio. Os anéis recebem um buffer e são mesclados em um único contorno, e o bolsão delimitado é preservado como um buraco propriamente dito.

Entrada
Geometria de entrada com vários retângulos sobrepostos dispostos em um circuito fechado
WKT de entrada
MULTIPOLYGON (((107 153, 134.3 153, 134.3 121.6, 107 121.6, 107 153),
  (120 147, 120 176.2, 130.5 176.2, 130.5 147, 120 147)),
  ((125 174, 163 174, 163 168, 125 168, 125 174)),
  ((157.5 178.6, 191 178.6, 191 156, 157.5 156, 157.5 178.6),
    (170 166, 185 166, 185 135, 170 135, 170 166)),
  ((180 140, 180 136, 120 136, 120 140, 180 140)))
Resultado
Geometria do resultado: os retângulos mesclados em um único contorno delimitando um único buraco
WKT do resultado
MULTIPOLYGON (((170 136, 134.3 136, 134.3 121.6, 107 121.6, 107 153, 120 153, 120 176.2, 130.5 176.2, 130.5 174, 157.5 174, 157.5 178.6, 191 178.6, 191 156, 185 156, 185 135, 170 135, 170 136),
  (130.5 168, 130.5 153, 134.3 153, 134.3 140, 170 140, 170 156, 157.5 156, 157.5 168, 130.5 168)))

Caso 5: Buracos fora do contorno

O campo tem dois anéis externos separados, e os buracos não os respeitam: um buraco atravessa o vão entre os dois contornos e outros ultrapassam as bordas. Cada contorno é reconstruído separadamente e cada buraco é recortado conforme o contorno que o contém, com um pequeno buffer para que nenhum buraco compartilhe uma aresta com o seu contorno.

Entrada
Geometria de entrada com dois contornos separados e buracos que os cruzam ou caem fora deles
WKT de entrada
-- outer boundary
MULTIPOLYGON (((104 199, 165 199, 165 125, 104 125, 104 199)),
  ((170 150, 195 150, 195 132, 170 132, 170 150)))
-- inner boundary
MULTIPOLYGON (((158.44444444444446 144.33333333333334, 174 144.33333333333334, 174 139, 158.44444444444446 139, 158.44444444444446 144.33333333333334)),
  ((101 169, 159 169, 159 165, 101 165, 101 169)),
  ((136 122, 109.44444444444444 122, 109.44444444444444 151.55555555555554, 136 151.55555555555554, 136 122)))
Resultado
Geometria do resultado: dois polígonos limpos com cada buraco recortado para caber dentro do seu próprio contorno
WKT do resultado
MULTIPOLYGON (((170 150, 195 150, 195 132, 170 132, 170 150),
  (170.0010000000475 144.33333333333334, 174 144.33333333333334, 174 139, 170.0010000000475 139, 170.0010000000475 144.33333333333334)),
  ((104 199, 165 199, 165 125, 104 125, 104 199),
    (109.44444444444444 125.0010000000475, 109.44444444444444 151.55555555555554, 136 151.55555555555554, 136 125.0010000000475, 109.44444444444444 125.0010000000475),
    (164.9989999999525 139, 158.44444444444446 139, 158.44444444444446 144.33333333333334, 164.9989999999525 144.33333333333334, 164.9989999999525 139),
    (104.0010000000475 169, 159 169, 159 165, 104.0010000000475 165, 104.0010000000475 169)))

Páginas relacionadas