Zoo à géométrie invalide

9

Souvent, j'ai passé des heures à lutter contre des bugs bizarres résultant de géométries invalides . Les symptômes varient considérablement, notamment:

  • Ralentissements de la base de données
  • Résultats de requête \ Null incorrects
  • Fichiers journaux surchargés d'erreurs et d'avertissements
  • Résultat incohérent avec les opérateurs géométriques (par exemple intersection)

Je voudrais classer les types de géométries non valides, afin d'aider tout le monde ici à assainir ses données.

Veuillez répondre avec votre type préféré de géométrie invalide (un type par réponse). Les captures d'écran, les descriptions et les solutions sont les bienvenues - mais essayez de garder votre réponse courte.

Adam Matan
la source

Réponses:

3

Segments de longueur nulle

Exemple:

SELECT geomFromEWKT('LINESTRING(1 1, 1 1)');

                                    geomfromewkt                                    
------------------------------------------------------------------------------------
 0102000000020000000000000000000840000000000000104000000000000008400000000000001040

Problèmes: le stockage d'un segment de longueur nulle peut provoquer des bogues lors du calcul des ratios de longueur (division par zéro) ou lors de la tentative de calcul des azimuts et des fonctions trigonométriques.

Détection: dans PostGIS, les segments de longueur nulle peuvent être détectés à l'aide de isValid().

Solutions: essayez de conserver des segments de longueur nulle comme points.

Adam Matan
la source
3

Polygones auto-entrecroisés

entrez la description de l'image ici

Exemple:

SELECT isValid(geomFromEWKT('POLYGON((0 0, 1 1, 1 0, 0 1, 0 0))'));
NOTICE:  Self-intersection at or near point 0.5 0.5
 isvalid 
---------
 f
(1 row)

Problèmes: mauvais calculs, par exemple area():

SELECT area(geomFromEWKT('POLYGON((0 0, 1 1, 1 0, 0 1, 0 0))'));
 area 
------
    0
(1 row)

Cela peut provoquer des bogues de division zéro avec les fonctions d'appel.

Détection: dans PostGIS, les segments auto-entrecroisés peuvent être détectés à l'aide de isValid().

Solution: conversion en MULTIPOLYGON(voir commentaire).

Adam Matan
la source
Cette même forme équivaut à la validité:MULTIPOLYGON(((0 0, 0 1, 0.5 0.5, 0 0)),((1 1, 1 0, 0.5 0.5, 1 1)))
Mike T
@Mike Toews: Correct, la conversion en MULTIPOLYGON est une bonne solution.
Adam Matan