Stel je hebt een lijst met verschillende objecten die je als volgt op een kaart wil tonen:
Diagrammen in QGIS verwachten dat voor elke staaf of punt een kolom bestaat, maar onze objecten zitten allemaal onder elkaar in een kolom:
En de geometrie is opgeslagen in een goeie ouwe shapefile:
We kunnen dus het veld ‘code’ gebruiken om de tabellen te koppelen en te groeperen tot een rij per locatie.
Omdat QGIS vector-koppelingen geen 1:n relaties aankunnen, gaan we hiervoor een virtuele kaartlaag gebruiken. Hierin kun je alle sql gebruiken die door sqlite wordt ondersteund, inclusief JOIN en GROUP BY.
Dus we maken een nieuwe virtuele kaartlaag ‘cities_grouped’ met deze sql query:
[code language=”sql”]
SELECT
c.name,
c.code,
group_concat(amenity) AS amenities,
CASE WHEN INSTR(group_concat(amenity),’university’) > 0 THEN 1 ELSE 0 END AS university,
CASE WHEN INSTR(group_concat(amenity),’airport’) > 0 THEN 1 ELSE 0 END AS airport,
CASE WHEN INSTR(group_concat(amenity),’station’) > 0 THEN 1 ELSE 0 END AS station,
CASE WHEN INSTR(group_concat(amenity),’harbor’) > 0 THEN 1 ELSE 0 END AS harbor,
count(*) AS cnt,
c.geometry
FROM amenities a
LEFT JOIN cities c ON a.code = c.code
GROUP BY c.code, c.geometry
[/code]
De attributentabel van deze laag ziet er dan zo uit:
Nu kunnen we diagrammen gebruiken als symbologie voor deze nieuwe kaartlaag, waarbij we de nieuwe kolommen university, airport, station en harbor invoegen. Ik heb de count kolom (‘cnt’) gebruikt voor het instellen van de grafiekgrootte en label-afstand.
Ik hoop dat je hier wat aan hebt, en als je een makkelijkere manier weet om dit te doen hoor ik het graag!
Leave a comment
Some time ago I have to solve a similar problem with data from OpenStreetMap. Becaus I worked with PostgreSQL+PostGIS the crosstab-function (https://www.postgresql.org/docs/10/static/tablefunc.html) was a well working solution in my case. Maybe it helps you!