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.
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ê.
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.
Limites alterados por plataformas conectadas (por exemplo, o John Deere Operations Center) podem voltar topologicamente malformados.
Arquivos enviados às vezes trazem pontos soltos, linhas ou coleções de geometrias em vez de polígonos limpos.
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.
Pontos, linhas e outras geometrias sem área são removidos para que apenas polígonos sigam adiante.
Limites externos com autointerseção são divididos em polígonos válidos separados, em vez de descartar parte do campo.
Buracos sobrepostos ou que se intersectam são unidos em um único buraco, como a especificação exige.
Um buffer com uma pequena tolerância é aplicado aos anéis para que os buracos nunca compartilhem uma aresta com o limite externo.
Os buracos são subtraídos dos limites externos para reconstruir um MultiPolygon limpo, recortando qualquer buraco que escape do seu contorno.
Fragmentos minúsculos abaixo de uma área mínima são descartados, a menos que sejam a única parte do campo.
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.
Uma correção "make valid" de uso geral trata autointerseções e outros erros que sobrevivem às etapas direcionadas.
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:
O limite externo de um polígono. Há exatamente um por polígono.
Um limite interno recortado do polígono, como um brejo ou um amontoado de pedras. Um polígono pode ter muitos buracos.
Uma coleção de polígonos. Um campo com duas parcelas separadas é um único MultiPolygon com dois polígonos.
Uma operação de união de geometrias: a combinação de formas sobrepostas em uma única forma.
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.
Cinco casos representativos de geometria de entrada malformada (azul) e a saída corrigida (amarelo). Expanda o WKT para ver as coordenadas exatas.
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.
GEOMETRYCOLLECTION (LINESTRING (131 125, 305 326),
POINT (260 130),
POLYGON ((130 330, 223 330, 223 245, 130 245, 130 330)))
MULTIPOLYGON (((130 330, 223 330, 223 245, 130 245, 130 330)))
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.
POLYGON ((120 110, 120 360, 340 130, 310 360, 120 110))
MULTIPOLYGON (((120 110, 120 360, 225.87639311043566 249.3110435663627, 120 110)),
((225.87639311043566 249.3110435663627, 310 360, 340 130, 225.87639311043566 249.3110435663627)))
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.
-- 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)))
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)))
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.
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)))
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)))
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.
-- 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)))
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)))