Suite

Utiliser des entités multipolygones ou surfaciques pour de grandes opérations d'intersection ?


J'ai deux grandes couches que je veux faire des opérations d'intersection. L'un concerne les municipalités et l'autre l'aménagement du territoire. Pour le moment, la couche landuse est de type MultiPolygon c'est-à-dire, pour l'ensemble de l'état, je n'ai qu'une entrée dans le tableau avec la classe "Forest", mais composée de plusieurs petits polygones.

Si je voulais trouver toutes les zones forestières de ma ville, quoi de plus efficace dans PostGIS :

  1. Faire un croisement entre ma commune et le multipolygone FOREST qui occupe tout l'état ou,
  2. Convertissez le multipolygone Forest en une nouvelle couche avec plusieurs polygones, puis effectuez l'intersection

Mon intuition est que si je divise l'entité multipolygone en polygones simples, l'intersection pourrait être plus rapide car elle ne se produirait que dans les polygones qui ont une boîte englobante qui chevauche ma municipalité. Si j'ai des entités multipolygones, l'intersection devrait parcourir tout l'état pour identifier uniquement les parties qui se trouvent à l'intérieur de la municipalité.

C'est plus ou moins ce que j'essaie d'obtenir. Je veux les polygones vert clair.

Est-ce important que les polygones forestiers (F) soient stockés sous forme de multipolygones ou de polygones simples ?

Je vais traiter un très grand ensemble de données (Amazon)


Vous avez raison de dire que le vidage des multipolygones en polygones rend l'index plus efficace, pour la raison que vous mentionnez.

Donc, si la taille de l'ensemble de données rend les performances un problème, vous devez :

  1. vider les multipolygones dans une nouvelle table.
  2. créer un index spatial sur les polygones
  3. obtenir la partie d'intersection et restreindre la requête aux polygones qui se croisent.

Quelque chose comme:

/*Créer une table de polygones à partir de multipolygones*/ Créer une table forest_polygons as select (st_dump(geom)).geom geom from forest_table; /*créer l'index spatial*/ créer l'index idx_forest_geom sur forest_polygons en utilisant gist(geom); /*informer le planificateur de l'index*/ analyser forest_polygons; /*Faire une sélection de forêt dans la municipalité, ou plus correct : Attribuez l'identifiant de municipalité aux forêts*/ Sélectionnez st_intersection(gem), municipalités_id comme forest_in_municipality de forest_polygons inner join municipalités sur st_intersects(forest_polygons.geom, municipalités.geom);

À partir de votre description, une requête de landuse="forest" qui croise votre municipalité renverra le seul enregistrement dans votre table d'occupation des sols. Et cela devrait être assez efficace. Mais il semble que vous cherchiez vraiment lequel des morceaux de la forêt multipolygone croise le(s) polygone(s) de votre municipalité, vous devez donc le diviser en morceaux distincts. Pas besoin de créer une nouvelle table, cependant - utilisez ST_Dump() dans votre requête pour le faire à la volée, et cela devrait être assez rapide. Comme:

SELECT * FROM municipalités m, (SELECT gid, ST_Dump(geom).geom as the_geom FROM landuse WHERE class = 'forêt') as foo WHERE ST_Intersects(m.the_geom, foo.the_geom) AND m.name = 'Denver';


Voir la vidéo: QGIS Géotraitement: intersection (Octobre 2021).