Les délimitations de parcelles arrivent rarement parfaites. Launch Pad fait passer chaque délimitation par un pipeline de correction géométrique automatique qui détecte les formes invalides et les répare avant la planification, de sorte que les Plans de Passages soient toujours générés à partir d'une géométrie propre et valide.
La géométrie invalide est étonnamment fréquente dans les données de délimitation réelles, et elle est le plus souvent indécelable sur une carte : une auto-intersection peut se cacher dans un seul sommet. La plupart des clients ne savent jamais que leurs délimitations présentent ces défauts, car Launch Pad les corrige automatiquement. Si vous développez une intégration avec l'API et vous demandez pourquoi une délimitation que vous relisez diffère légèrement de celle que vous avez envoyée, cette page explique ce qui s'est passé et pourquoi.
Dessiner un polygone sur la carte, puis ajouter, supprimer ou faire glisser des sommets peut introduire des auto-intersections et des chevauchements sans aucun signe visible.
Les délimitations modifiées par des plateformes connectées (par exemple John Deere Operations Center) peuvent revenir topologiquement malformées.
Les fichiers importés contiennent parfois des points isolés, des lignes ou des collections de géométries au lieu de polygones propres.
La plupart des outils SIG réparent une géométrie défectueuse par une unique opération « make valid » (rendre valide). Cela résout l'erreur de topologie, mais c'est un instrument grossier, sans aucun parti pris sur ce à quoi doit ressembler ensuite une délimitation de parcelle exploitable. Launch Pad applique au contraire une séquence de corrections ciblées et conserve une réparation « make valid » générique en dernier recours pour les cas que les corrections ciblées ne parviennent pas à résoudre.
Les points, les lignes et les autres géométries sans surface sont supprimés afin que seuls les polygones poursuivent le traitement.
Les anneaux extérieurs qui s'auto-intersectent sont divisés en polygones valides distincts au lieu d'écarter une partie de la parcelle.
Les trous qui se chevauchent ou s'intersectent sont fusionnés par union en un seul trou, comme l'exige la spécification.
Un tampon d'une faible tolérance est appliqué aux anneaux afin que les trous ne partagent jamais d'arête avec l'anneau extérieur.
Les trous sont soustraits des anneaux extérieurs pour reconstruire un MultiPolygon propre, en rognant tout trou qui déborde de son enveloppe.
Les fragments résiduels dont la surface est inférieure à un seuil minimal sont éliminés, sauf s'ils constituent le seul morceau de la parcelle.
L'orientation des anneaux suit la règle de la main droite de GeoJSON et les coordonnées sont aplaties en 2D, toute valeur d'altitude étant supprimée.
Une réparation « make valid » générique traite les auto-intersections et les autres erreurs qui subsistent après les étapes ciblées.
La sortie du pipeline est toujours un MultiPolygon valide, conforme aux règles de validité des polygones et des MultiPolygon de la OGC Simple Features Specification :
Le contour extérieur d'un polygone. Il y en a exactement un par polygone.
Un contour intérieur découpé dans le polygone, comme une zone humide ou un tas de pierres. Un polygone peut comporter de nombreux trous.
Une collection de polygones. Une parcelle composée de deux îlots séparés forme un seul MultiPolygon avec deux polygones.
Une opération d'union géométrique : la combinaison de formes qui se chevauchent en une seule forme.
Si l'entrée ne peut pas être récupérée, par exemple lorsqu'il ne reste rien une fois les parties invalides supprimées, Launch Pad signale l'échec au lieu d'inventer une forme, et chaque étape de correction est journalisée afin que le résultat puisse être audité.
Remarque : Le traitement s'effectue dans un système de coordonnées projeté, où les distances sont en mètres, puis le résultat est reconverti en WGS84. C'est pourquoi les tolérances de tampon sont exprimées en mètres plutôt qu'en degrés.
Cinq cas représentatifs de géométrie d'entrée malformée (en bleu) et de résultat corrigé (en jaune). Dépliez le WKT pour voir les coordonnées exactes.
L'entrée est une GeometryCollection plutôt qu'un MultiPolygon, et elle contient une LineString et un Point aux côtés du polygone proprement dit. La ligne et le point sont supprimés, et l'anneau extérieur est extrait du polygone.
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)))
L'anneau extérieur se croise lui-même et forme un nœud papillon. Ce n'est pas un polygone valide, et de nombreux planificateurs le rejetteraient ou supprimeraient silencieusement l'un des lobes. Le module de correction divise l'anneau au point de croisement en deux polygones valides, préservant ainsi toute la surface dessinée.
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)))
Deux anneaux intérieurs s'intersectent, ce que la spécification interdit. Les trous sont fusionnés en un seul, et le polygone est recréé avec ce trou combiné unique.
-- 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)))
Plusieurs anneaux extérieurs se chevauchent et s'auto-intersectent, délimitant ensemble une poche vide. Un tampon est appliqué aux anneaux, qui sont ensuite fusionnés en un contour unique, et la poche enclose est préservée en tant que véritable trou.
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)))
La parcelle comporte deux anneaux extérieurs distincts, et les trous ne les respectent pas : un trou enjambe l'espace entre les deux enveloppes et d'autres débordent des bords. Chaque enveloppe est reconstruite séparément et chaque trou est rogné aux limites de l'enveloppe qui le contient, avec un léger tampon afin qu'aucun trou ne partage d'arête avec son enveloppe.
-- 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)))