Ceci fait suite à la question précédente . Vous verrez que je suis un nouvel utilisateur de PostGIS.
J'ai examiné la validité de la topologie dans mes données et j'ai trouvé environ 1700 problèmes de topologie dans l'ensemble de données de couverture terrestre (polygone). Ce sont tous des "Ring Self_intersection".
En utilisant quelques informations utiles dans cette présentation de Paul Ramsay (page 20), j'ai tenté de mettre mes données en mémoire tampon en conséquence:
UPDATE schema.data SET the_geom = buffer (the_geom, 0.0) WHERE isvalid (the_geom) = false et isvalid (buffer (the_geom, 0.0)) = true;
Mais je reçois la réponse:
AVIS: auto-intersection en anneau au point ou à proximité (modifié) ERREUR: une nouvelle ligne pour la relation "sgm_buffer" viole la contrainte de vérification "enforce_geotype_the_geom"
********** Erreur **********
ERREUR: une nouvelle ligne pour la relation "sgm_buffer" viole la contrainte de vérification "enforce_geotype_the_geom" État SQL: 23514
J'ai aussi essayé juste:
UPDATE csgn.sgm_buffer SET the_geom = buffer (the_geom, 0.0)
et obtenir:
ERREUR: une nouvelle ligne pour la relation "sgm_buffer" viole la contrainte de vérification "enforce_geotype_the_geom"
********** Erreur **********
ERREUR: une nouvelle ligne pour la relation "sgm_buffer" viole la contrainte de vérification "enforce_geotype_the_geom" État SQL: 23514
Dois-je donc supposer que cette technique de tampon ne fonctionnera pas sur mes problèmes? Ou est-ce que je fais quelque chose de mal?
M. Ramsay poursuit ensuite dans le même document pour suggérer une technique supplémentaire pour traiter les polygones "figure de 8". Je ne comprends pas entièrement comment écrire cela en entier dans le code (ou ce qu'il fait et si cela m'aidera):
SELECT ST_BuildArea (ST_Union ('LINESTRING EMPTY', ST_ExteriorRing ('POLYGON ((...))' '
Alors ... quelqu'un peut-il aider? Cela s'avère un vrai cauchemar avec mes délais serrés et mes compétences limitées dans PostGIS.
ST_Multi()
pour forcer tous les polygones à êtreMULTIPOLYGON
s (ceci est une hypothèse)Réponses:
Je pense que ce qui se passe, c'est que vos polygones auto-entrecroisés deviennent MULTIPOLYGONS lors de la mise en mémoire tampon.
vous avez deux options:
1 supprimez la contrainte "enforce_geotype_the_geom", vous pouvez le faire dans pgAdmin
2 mettez le résultat dans une nouvelle table au lieu de mettre à jour l'ancienne. c'est souvent une bonne façon de faire les choses car vous ne changez rien dans votre table d'origine. la requête peut ressembler à quelque chose comme:
bien sûr, vous souhaiterez peut-être apporter plus de champs à votre nouvelle table.
essayez d'abord l'astuce de tampon. Dans la deuxième approche, Paul peut se dire quel effet a la chaîne de lignes vide. Je ne me souviens pas comment cette magie se produit.
la source
J'ai eu les mêmes problèmes il y a quelques mois. J'avais des polygones dans ma base de données avec beaucoup d'auto-intersections. J'ai utilisé la méthode de Niklas Aven, mais cela n'a pas fonctionné. J'ai également utilisé d'autres méthodes.
Ma méthode consiste à supprimer l'auto-intersection de mes polygones. Voici la requête SQL que j'ai utilisée:
J'ai calculé l'aire du polygone et de l'auto-intersection et je ne garderai que les polygones qui ont une aire> 1.
1
est la tolérance car l'aire de l'auto-intersection est très petite. Notez également que la transformation du SRID en mètres est importante si vous avez des données en degrés.la source