Concaténation des noms des quartiers et des numéros des sections dans la couche polygonale des rues en fonction de l'intersection

Nov 23 2020

Dans QGIS 3.14, je souhaite qu'une couche avec des contours de rue (polygones) enregistre les noms des zones traversées par la rue et le nombre de parcelles cadastrales à travers lesquelles elle passe.

Si une rue croise plusieurs objets, leurs noms doivent être écrits dans un champ après une virgule. Comment résoudre ce problème?

si la superficie de la zone tombant dans les limites de la rue est inférieure à la valeur spécifiée, son nom n'est pas pris en compte

Réponses

Taras Nov 23 2020 at 20:59

Pour étendre la requête dans cette réponse avec une règle de "zone" , c'est-à-dire ne considérer la valeur que si l'intersection est supérieure à une certaine valeur, alors considérez une requête légèrement ajustée:

SELECT a.*, GROUP_CONCAT(b.info) AS concat_b_info
FROM "Layer_B" AS b, "Layer_A" As a
WHERE ST_INTERSECTS(a.geometry, b.geometry)
      AND ST_AREA(ST_INTERSECTION(a.geometry, b.geometry)) > 80000000
GROUP BY a.id

Ou considérez dans le calculateur de champ l'expression suivante:

aggregate(
  layer:='Layer_B',
  aggregate:='concatenate',
  expression:="info",
  concatenator:=',',
  filter:=(intersects($geometry,geometry(@parent)) AND area(intersection($geometry,geometry(@parent))) > 80000000)
)

Gardez à l'esprit que 'area'-fonction

Renvoie l'aire d'un objet polygone géométrique. Les calculs sont toujours planimétriques dans le système de référence spatiale (SRS) de cette géométrie, et les unités de la zone renvoyée correspondent aux unités du SRS. Cela diffère des calculs effectués par la fonction $ area, qui effectuera des calculs ellipsoïdaux basés sur les paramètres de l'ellipsoïde et de l'unité de surface du projet.

Lorsque les zones des entités qui se chevauchent doivent être calculées en plus, utilisez cette

SELECT a.*, GROUP_CONCAT(b.info) AS concat_b_info,
            GROUP_CONCAT(round(ST_AREA(ST_INTERSECTION(a.geometry, b.geometry)), 4)) AS a_b_areas
            -- GROUP_CONCAT(round(ST_AREA(b.geometry), 4)) AS b_areas
FROM "Layer_B" AS b, "Layer_A" As a
WHERE ST_INTERSECTS(a.geometry, b.geometry)
      AND ST_AREA(ST_INTERSECTION(a.geometry, b.geometry)) > 80000000
GROUP BY a.id

ou dans le calculateur de champ avec un nouveau champ pour les valeurs de surface:

aggregate(
  layer:='Layer_B',
  aggregate:='concatenate',
  expression:=to_string(round(area(intersection($geometry,geometry(@parent))),4)),
  # expression:=to_string(round(area($geometry),4)),
  concatenator:=',',
  filter:=(intersects($geometry,geometry(@parent)) AND area(intersection($geometry,geometry(@parent))) > 80000000)
)