Geometrier – validering och giltighet
Här beskrivs hur geometrivalideringen görs på Skogsstyrelsen och det finns också information om giltiga och ogiltiga geometrier.
För att Skogsstyrelsen ska kunna hantera geometrier för analys och vidarebefordran till andra system behöver de följa både Esri- och OGC-standard.
Verktygen som används vid validering
- Skogsstyrelsen interna: Koordinater avrundas alltid till 3 decimaler innan någon annan validering sker.
- NetTopologySuite (OGC validering, finns som nuget paket för .NET, motsvarande finns troligtvis också för Java).
- SQL validering (OGC validering, genom SQLGeometry klassen i .net).
- ESRI validering enligt dessa regler (arcgis.com)
En geometri måste alltså passera samtliga test för att vara giltig.
Tidigare användes DbGeometry.IsValid (microsoft.com)
För att förenkla för användaren förtydligas i felmeddelandet vilken eller vilka geometrier som inte är giltiga, till exempel:

Vill du minimera risken att producera geometrier som inte uppfyller OGC- eller Esri-standard kan du justera dem enligt följande steg:
- Kontrollera om geometrin som skickas in kan konverteras/omvandlas (samt kontrollera att det är en giltig wkt).
- Avrunda alla koordinater till 3 decimaler (millimeter för SWEREF 99 TM).
- Kontrollera om den avrundade geometrin är giltig.
- Om den avrundade geometrin inte är giltig, gör försök att göra den giltig (via .MakeValid() eller .Buffer(0)). Detta ska inte påverka hur geometrin ser ut utan bara "bygga om den". Kontrollera sedan:
- Om Geometrin är en polygon
- Om den avrundade geometrin fortfarande inte är giltig, kör MakeValid igen och ta bort delgeometrier som inte är polygon eller multipolygon.
- Om den avrundade geometrin fortfarande inte är giltig, kör en buffer på 0.05 och sedan på -0.05 för att ta bort spikar och små hål.
- Om den avrundade geometrin fortfarande inte är giltig, kör en buffer på 0.001 för att se till att yttre och inre polygonringar inte nuddar varandra.
- Om Geometrin är en polygon
- Om den avrundade geometrin inte är giltig, gör försök att göra den giltig (via .MakeValid() eller .Buffer(0)). Detta ska inte påverka hur geometrin ser ut utan bara "bygga om den". Kontrollera sedan:
- Räkna ut överlapp i både m² och % mellan inskickad geometri och fixedGeometry.
Giltiga geometrier
En giltig geometri kallas även enkel geometri.
- En punkt/multipunkt innehåller en eller flera punkter som geometrisk information. Alla enskilda punkter är giltiga.
- En linje/multilinje innehåller linjesegment som geometrisk information (som representeras av punkter). En giltig linje består av minst ett linjesegment och två åtskilda brytpunkter.
- En polygon/multipolygon innehåller ringar (varje ring är en samling av sammanhängande linjesegment så att startpunkten och slutpunkten blir densamma). En giltig polygon överlappar eller korsar inte sig själv.
Exempel på hur punkter, linjer och polygoner är uppbyggda med (bryt)punkter och koordinater:

Ogiltiga geometrier
Ogiltiga geometrier kan till exempel vara följande:
- Tom geometri – det finns inga punkter/brytpunkter.
- Avståndet mellan två brytpunkter (för en linje eller polygon) är kortare än minsta tillåtna avstånd i det associerade spatiala referenssystemet och anses inte åtskilda utan lika.
- Linje som korsar sig själv.
- Polygon som överlappar sig själv.
- Punkt, linje eller polygon innehåller dubbla (ovanpåliggande) brytpunkter.
- Polygon innehåller öppna ringar – det sista segmentet i en ring har inte sin "till"-brytpunkt på "från"-brytpunkten i det första segmentet.
Mer information om geometrier
About Invalid, Valid and Clean Polygons (springer.com)
Definitioner av punkt (github.io)
Definition av linje (github.io)
Definition av polygo (github.io)
Kontrollera och rätta geometrier