Łączenie nazw dzielnic i numerów odcinków w wielobocznej warstwie ulic na podstawie skrzyżowania

Nov 23 2020

W QGIS 3.14 chcę, aby warstwa z konturami ulic (wielokątami) zapisywała nazwy obszarów, przez które przechodzi ulica, oraz numery działek katastralnych, przez które przebiega.

Jeśli ulica przecina kilka obiektów, ich nazwy należy wpisać w jednym polu po przecinku. Jak rozwiązać ten problem?

jeśli obszar obszaru wpadającego w granice ulicy jest mniejszy niż podana wartość, to jego nazwa nie jest brana pod uwagę

Odpowiedzi

Taras Nov 23 2020 at 20:59

Aby rozszerzyć zapytanie w tej odpowiedzi o regułę „obszar” , tj. Brać pod uwagę wartość tylko wtedy, gdy przecięcie jest większe niż określona wartość, rozważ nieco zmodyfikowane zapytanie:

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

Lub rozważ w kalkulatorze pola następujące wyrażenie:

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

Pamiętaj, że 'area'-funkcja

Zwraca powierzchnię obiektu wielokąta geometrii. Obliczenia są zawsze planimetryczne w przestrzennym systemie odniesienia (SRS) tej geometrii, a jednostki zwracanego obszaru będą zgodne z jednostkami dla SRS. Różni się to od obliczeń wykonywanych przez funkcję $ area, która wykona obliczenia elipsoidalne w oparciu o ustawienia elipsoidy i jednostki powierzchni projektu.

Skorzystaj z tego, gdy trzeba dodatkowo obliczyć obszary nakładających się elementów

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

lub w Kalkulatorze pola z nowym polem dla wartości powierzchni:

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)
)