Suite

ST_Intersection pour les polygones

ST_Intersection pour les polygones


Je recherche une requête qui renvoie les zones de chevauchement de deux tables avec des géométries de polygone. En utilisant row_number() over(), les entrées de la colonne gid ne sont pas uniques dans le cas de multipolygones vidés. J'ai donc des problèmes lors du chargement de la couche dans QGIS.

CREATE TABLE poly_intersection AS SELECT row_number() over() AS gid, (ST_Dump(ST_Intersection(poly1.geom, poly2.geom))).geom::geometry(polygon, SRID) AS geom FROM poly1, poly2 WHERE ST_Overlaps(poly1. geom, poly2.geom) = 't' OU ST_Contains(poly1.geom, poly2.geom) = 't' OU ST_Contains(poly2.geom, poly1.geom) = 't';

En attendant, j'ai modifié ma requête. Mais je me demande s'il existe une solution plus simple.

CREATE TABLE poly_intersection AS SELECT row_number() over() AS gid, g.geom::geometry(polygon, SRID) AS geom FROM (SELECT (ST_Dump(ST_Intersection(poly1.geom, poly2.geom))).geom FROM poly1, poly2 O ST_Overlaps(poly1.geom, poly2.geom) = 't' OU ST_Contains(poly1.geom, poly2.geom) = 't' OU ST_Contains(poly1.geom, poly2.geom) = 't') AS g;

ST_Intersects combiné avec NOT ST_Touches produira ce que vous recherchez plus efficacement que deux versions de ST_Contains et ST_Covers. Vous pouvez éviter row_number() over() pour générer le gid si vous sélectionnez (ST_Dump(… )).* dans la sous-requête, puis sélectionnez g.path et g.geom à partir de cette requête.

CREATE TABLE poly_intersection AS SELECT g.path[1] as gid, g.geom::geometry(polygon, SRID) AS geom FROM (SELECT (ST_Dump(ST_Intersection(poly1.geom, poly2.geom))).* FROM poly1, poly2 O ST_Intersects(poly1.geom, poly2.geom) ET NON ST_Touches(poly1.geom, poly2.geom) comme g ;

J'ai mentionné dans les commentaires que vous pourriez utiliser st_join . Cependant, cela peut ne pas vous donner le résultat souhaité. Dans la bibliothèque sf, il y a les prédicats binaires géométriques, tels que ?st_intersects , et les opérations géométriques telles que ?st_intersection

Les prédicats renvoient une matrice creuse (par défaut) ou dense vous indiquant avec quelle géométrie de y chaque géométrie de x se croise. Si vous l'utilisez dans st_join , il renverra les géométries (d'origine) qui se croisent, plutôt que la matrice creuse.

Alors que les opérations (par exemple st_intersection ) calculeront l'intersection et renverront de nouvelles géométries.

Exemple d'utilisation

Les prédicats ( st_intersects ) peuvent être utilisés à l'intérieur de st_join , et ils renverront les géométries d'origine qui « se croisent »

Dans ce cas, cela donne un seul type d'objet

Mais vous devez décider si le résultat de st_intersect est ce que vous recherchez ou si vous avez besoin des nouvelles géométries données par st_intersection .

Lectures complémentaires

les informations sur chaque jointure sont sur le blog sf.

les prédicats spatiaux et des exemples de ce que font les différentes opérations sont sur wikipedia (avec quelques bonnes illustrations)

Remerciements à l'utilisateur @lbussett pour sa description de la différence entre st_intersect et st_intersection


Préservation des types de géométrie lors de l'utilisation de st_intersection du package sf dans R

J'essaie de m'habituer à utiliser le package sf dans R.

Actuellement, j'essaie de découper un fichier de formes de tous les codes postaux des États-Unis à la frontière de l'État de l'Utah. J'ai téléchargé un fichier de formes pour la frontière de l'Utah et un fichier de formes de toutes les zones de tabulation des codes postaux aux États-Unis et j'ai fait correspondre leurs informations de projection.

J'ai trouvé que la création d'un clip à partir de deux fichiers de données à l'aide de st_intersects() suivi de st_intersection() fonctionnait bien. st_intersects () enregistre uniquement les codes postaux qui croisent la frontière de l'Utah, puis st_intersection () doit couper les codes postaux qui touchent ou se croisent avec la frontière de l'Utah à la frontière exacte de l'Utah.

Lorsque j'exécute la commande st_intersects() sur le fichier de code postal, le résultat préserve les géométries multipolygones de tous les codes postaux. Lorsque j'exécute st_intersection() , il crée un nouvel objet sf qui a un mélange de géométries - points, polygones et multipolygones. Je veux que le fichier sf résultant n'ait que des multipolygones. J'ai pu supprimer les géométries de points en utilisant ce code:

Cependant, j'ai toujours un objet sf avec un mélange de multipolygones et de polygones. Lorsque j'essaie de convertir les polygones en multipolygones à l'aide de st_cast() , j'obtiens cette erreur :

Il semble que des points existent toujours dans les géométries de mon fichier de formes de code postal, peut-être sous le couvert de "GEOMETRYCOLLECTION" ? Lorsque je vérifie le type de géométrie à l'aide de unique(st_geometry_type(zips_utah)) , voici le résultat que j'obtiens :

D'après ce que je comprends, je ne peux pas enregistrer l'objet sf de code postal découpé résultant dans un fichier de formes à moins que je ne convertisse d'abord toutes les géométries dans le même type. Lorsque j'essaie d'enregistrer le fichier de code postal tronqué à l'aide de st_write() , j'obtiens l'erreur suivante :


Voir la vidéo: Maths Eb2 Les polygones