Anneau d'auto-intersections dans PostGIS

10

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.

ESRIHelp
la source
1
que renvoie "select geometry_type (the_geom) from sgm_buffer limit 1"? De plus, en ce qui concerne le temps d'exécution de 40 heures mentionné dans l'autre question, y a-t-il des index spatiaux définis sur votre table?
diciu
Vous pourriez avoir besoin d'un ST_Multi()pour forcer tous les polygones à être MULTIPOLYGONs (ceci est une hypothèse)
Mike T
Merci pour les commentaires - diciu Je pense il y a des indices, ils semblent être visibles dans pgAdminIII, mais peut - être que je besoin de les rafraîchir? Je pourrais faire avec trouver des solutions pour accélérer la requête - je ne sais pas quel serait un délai raisonnable pour qu'il s'exécute? Landcover a environ 20 millions de fonctionnalités.
ESRIHelp

Réponses:

12

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:

CREATE TABLE new_buffered_table as
SELECT ST_Buffer(the_geom,0.0) as the_geom, gid FROM original_table;

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.

Nicklas Avén
la source
0

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:

     -- Create the new polygons 

SELECT ST_GeomFromText(polygone) as geom

   from (

    SELECT st_astext(ST_MakePolygon(linear)) as polygone

        from (
              SELECT st_astext
                ((ST_dump
                   (st_boundary
                      (ST_MakeValid
                     (ST_Transform
                        (ST_SETSRID
                           (geometry,4326),32631))))).geom) 
                          as linear from tables_name)
        as query2)

  as query1

where ST_area(polygone) > 1

J'ai calculé l'aire du polygone et de l'auto-intersection et je ne garderai que les polygones qui ont une aire> 1. 1est 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.

Abdillahi Abdi Mohamed
la source