Belangrijk

Vertalen is een inspanning van de gemeenschap waaraan u deel kunt nemen <translation_guidelines>. Deze pagina is momenteel voor 100.00% vertaald.

16.4. Gegevens tussen lagen verbinden en bewerken

De mogelijkheid om gegevens tussen lagen te verbinden is een van de plichten van GIS-software. Een dergelijke verbinding kan zijn gebaseerd op de ruimtelijke relatie tussen de objecten, of op hun gedeelde attributen. QGIS verschaft gereedschappen om deze associaties af te handelen, zoals:

16.4.1. Objecten koppelen tussen twee lagen

Koppelingen in QGIS maken het voor u mogelijk om objecten van de huidige laag te koppelen aan objecten van een andere geladen vectorlaag. Of zij ruimtelijk ingeschakeld zijn of het type geometrie maakt niet uit. De koppeling is gebaseerd op een attribuut dat is gedeeld door de lagen, in een relatie een-tot-een.

Een koppeling maken met een laag (hieronder geïdentificeerd als doellaag):

  1. Ga naar de tab van de laag Eigenschappen ► join Koppelingen

  2. Klik op de knop symbologyAdd Nieuwe koppeling maken. Het dialoogvenster Vectorkoppeling toevoegen verschijnt.

  3. Selecteer de Koppellaag waarmee u de doelvectorlaag wilt verbinden

  4. Specificeer het Koppelveld (uit de koppellaag) en het Doelveld (uit de doellaag). Dat zijn de velden die worden gebruikt om overeenkomende objecten te vinden in beide lagen, als zij gemeenschappelijke waarden hebben.

  5. Druk op OK en een overzicht van de geselecteerde parameters wordt toegevoegd aan het paneel Koppelingen.

../../../_images/join_attributes.png

Fig. 16.101 Een attributentabel koppelen aan een bestaande vectorlaag

De stappen hierboven zullen een koppeling maken waar ALLE attributen, van het eerste overeenkomende object in de koppellaag, worden toegevoegd aan het object van de doellaag. De volgende logica wordt gebruikt om objecten te paren, gedurende een proces van koppelen:

  • Alle objecten in de doellaag worden teruggegeven, ongeacht of zij een overeenkomst hebben

  • Als het doelveld duplicaat-waarden bevat, worden deze objecten toegewezen aan hetzelfde object uit de koppellaag.

  • Als het koppelveld dubbele overeenkomende waarden bevat, wordt alleen het eerst opgehaalde object gekozen.

Notitie

Koppelingen in QGIS zijn gebaseerd op een enkel veld dat overeenkomt, dus de meeste keren zou u er voor moeten zorgen dat waarden in het overeen te komen veld uniek zijn.

QGIS verschaft nog wat meer opties om de koppeling aan te passen:

  • checkbox Koppellaag in virtueel geheugen ‘cachen’: stelt u in staat waarden in het geheugen te cachen (zonder geometrieën) uit de gekoppelde laag om opzoekacties te versnellen.

  • unchecked Index voor attributen aanmaken op het koppelveld om opzoeken sneller te maken

  • unchecked Dynamisch formulier: helpt om de koppelvelden direct te synchroniseren, overeenkomstig het Doelveld. Op deze manier worden ook beperkingen voor de koppelvelden ook correct bijgewerkt. Onthoud dat het standaard is uitgeschakeld, omdat het heel tijdrovend kan zijn als u heel veel objecten hebt of ontelbare koppelingen.

  • Als de doellaag bewerkbaar is, dan zullen enkele pictogrammen worden weergegeven in de attributentabel naast velden, om te informeren over hun status:

    • joinNotEditable: de koppellaag is niet geconfigureerd om te worden bewerkt. Als u in staat wilt zijn om gekoppelde objecten uit de attributentabel van het doel te bewerken, dan moet u de optie checkbox Bewerkbare samengevoegde laag selecteren.

    • joinedLayerNotEditable: de koppellaag is wel geconfigureerd om te worden bewerkt, maar de huidige status is Alleen-lezen.

    • joinHasNotUpsertOnEdit: de koppellaag is te bewerken, maar de mechanismen voor synchroniseren zijn niet geactiveerd. Als u automatisch een object wilt toevoegen in de koppellaag als een object in de doellaag wordt gemaakt, dan moet u de optie checkbox Bijwerken bij bewerken selecteren. Symmetrisch, de optie checkbox Stapel verwijderen moet worden geactiveerd als u automatisch gekoppelde objecten wilt verwijderen.

  • unchecked Gekoppelde velden: in plaats van het toevoegen van alle velden uit de gekoppelde laag, kunt u een subset specificeren.

  • unchecked Voorvoegsel voor naam aangepast veld voor gekoppelde velden, om botsingen tussen namen van velden te vermijden

16.4.2. Relaties instellen tussen twee lagen

Anders dan koppelingen die een koppeling een-tot-een definiëren tussen objecten van twee lagen, helpen relaties u verbindingen te maken tussen meerdere objecten van twee of meer lagen. Als zodanig zijn relaties instellingen op het niveau van het project en worden ingesteld in Project ► Eigenschappen ► tab relations Relaties. Daar kunt u:

  • symbologyAdd Relatie toevoegen waarvan het type kan zijn:

    Notitie

    Er is nog geen eenvoudige manier om een niet-polymorfische relatie te bewerken als die eenmaal is gemaakt. Alleen de naam kan worden bewerkt met een dubbelklik. Voor elke andere parameter van een dergelijke relatie zult u die moeten verwijderen en opnieuw maken=.

  • symbologyAdd Relaties ontdekken: QGIS is in staat om bestaande relaties te ontdekken uit ondersteunde indelingen voor databases (PostgreSQL, GeoPackage, ESRI File Geodatabase, …). Dit kan ene goede manier zijn om het definiëren van relaties te makkelijker te maken.

  • symbologyRemove Relatie verwijderen

../../../_images/project_relations.png

Fig. 16.102 Tab Relaties

16.4.2.1. Relaties een-tot-veel (1-N)

Als voorbeeld heeft u een laag met alle regio’s van Alaska (polygoon) die verschillende attributen verschaft over de naam ervan en het type regio en een unieke ID (die dient als primaire sleutel).

Dan krijgt u een andere laag met punten of tabel met informatie over vliegvelden die in de regio’s liggen en u wilt ook deze bijhouden. Als u ze wilt toevoegen aan de laag van de regio’s, dient u een één tot veel-relatie te maken met behulp van secundaire sleutels, omdat er meerdere vliegvelden in de meeste regio’s liggen.

../../../_images/regions_with_airports.png

Fig. 16.103 Regio Alaska met vliegvelden

Lagen en sleutels

QGIS maakt geen verschil tussen een tabel en een vectorlaag. In feite is een vectorlaag een tabel met een geometrie. Dus kunt u uw laag tabel als een vectorlaag toevoegen. U kunt, om de relatie 1-n te demonstreren, de lagen regions en airports laden uit de voorbeeld gegevensset. In de praktijk behoort elk vliegveld tot precies één regio, terwijl elke regio een onbepaald aantal vliegvelden kan hebben (een typische een tot veel-relatie).

dat een veld vreemde sleutel heeft (fk_region) naar de laag regions.

In aanvulling op de attributen die de vliegvelden beschrijven, heeft de laag aiports een ander veld fk_region, dat optreedt als een secundaire sleutel (als u een database hebt wilt u waarschijnlijk daar een beperking voor maken). Dit veld fk_region zal altijd een ID van een region bevatten. Het kan worden gezien als een verwijzing naar de region waartoe het behoort.

Alles wat u hoeft te doen is QGIS de relatie te vertellen tussen de lagen zodat u een aangepast formulier voor bewerken kunt maken en QGIS zorgt dan voor de instelling. Het werkt met verschillende providers (dus u kunt het ook gebruiken met Shapefiles en CSV-bestanden).

1-N-relaties definiëren

Het eerste dat gaan we doen is om QGIS in kennis te stellen van de relaties tussen de lagen. Dit wordt gedaan in Project ► Eigenschappen…. Open de tab Relaties en klik op symbologyAdd Relatie toevoegen.

  • Naam zal worden gebruikt als de titel. Het zou een door mensen te lezen tekenreeks moeten zijn, die beschrijft waar de relatie voor wordt gebruikt. We zullen het in dit geval eenvoudigweg vliegveld_relatie noemen.

  • Referentielaag (Ouder), ook wel beschouwd als de ouderlaag, is die waarnaar de primaire sleutel verwijst, dus hier is het de laag regions. U moet de primaire sleutel voor de referentielaag definiëren, dus is het ID.

  • Referentielaag (Kind), ook wel beschouwd als de kindlaag, is die met het veld voor de vreemde sleutel erop. In ons geval is dit de laag airports. Voor deze laag dient u een verwijzingsveld toe te voegen dat naar de andere laag verwijst, dus is dit fk_region.

    Notitie

    Soms heeft u meer dan één enkel veld nodig om objecten op een laag uniek te kunnen identificeren. Maken van een relatie met een dergelijke laag vereist een samengestelde sleutel, d.i. meer dan één enkel paar van overeenkomende velden. Gebruik de knop symbologyAdd Nieuw veldpaar toevoegen als deel van een samengestelde sleutel om net zoveel paren toe te voegen als nodig is.

  • ID zal worden gebruikt voor interne doeleinden en moet uniek zijn. U zou mogelijk aangepaste formulieren moeten maken. Als u het leeg laat zal er een voor u worden gegenereerd maar u kunt er zelf een toewijzen om er een te krijgen die voor u eenvoudiger is.

  • Sterkte relatie stelt de sterkte in van de relatie tussen de ouder- en kindlaag. Het standaard type Associatie betekent dat de ouderlaag eenvoudig is gekoppeld aan de kindlaag, terwijl het type Compositie u in staat stelt ook de kindobjecten te dupliceren bij het dupliceren van die van de ouderlaag en bij het verwijderen van een object ook de kinderen worden verwijderd, resulterend in trapsgewijze over alle niveaus (wat betekent dat kinderen van kinderen van… ook worden verwijderd).

../../../_images/regions_airports_mapping.png

Fig. 16.104 Toevoegen van een relatie tussen de lagen regions en airports

Op de tab Relaties kunt u ook drukken op de knop symbologyAdd Relaties ontdekken om de beschikbare relaties van de geladen lagen op te halen. Dit is mogelijk voor lagen die zijn opgeslagen in gegevensproviders zoals PostgreSQL of SpatiaLite.

Formulieren voor 1-N-relaties

Nu QGIS van de relatie weet zal het worden gebruikt om de formulieren te verbeteren die het genereert. Als we de standaardmethode voor het formulier niet wijzigden (automatisch gegenereerd) zal het eenvoudigweg een nieuw widget in ons formulier maken. Dus laten we de laag regions selecteren in de legenda en het gereedschap Objecten identificeren gebruiken. Afhankelijk van uw instellingen zou het formulier direct kunnen openen of u moet het kiezen om het openen in het dialoogvenster Identificatieresultaten onder Acties.

../../../_images/airport_relation_dataview.png

Fig. 16.105 Dialoogvenster Identificatieresultaten regions met relatie naar vliegvelden

Zoals u kunt zien worden de vliegvelden die tot deze bepaalde regio zijn toegewezen weergegeven in een tabel. En er zijn ook enkele knoppen beschikbaar. Laten we die even kort bekijken:

  • De knop toggleEditing is voor het aan of uitzetten van het bewerken. Onthoud dat het de modus Bewerken voor de laag airports schakelt, hoewel we in het objectformulier van een object uit de laag regions staan. Maar de tabel geeft objecten weer uit de laag airports.

  • De knop saveEdits is voor het opslaan van alle bewerkingen in de kindlaag (airport).

  • De knop capturePoint laat u de geometrie van het vliegveld digitaliseren in het kaartvenster en wijst het nieuwe object standaard toe aan de huidige region. Merk op dat het pictogram zal wijzigen, overeenkomstig het type geometrie.

  • De knop newTableRow voegt een nieuw record in de attributentabel van de laag airports in en wijst het nieuwe object standaard toe aan de huidige region. De geometrie kan later worden getekend met het gereedschap voor digitaliseren Deel toevoegen.

  • De knop duplicateFeature maakt het voor u mogelijk om één of meer kindobjecten te kopiëren en te plakken in de kindlaag. Ze kunnen later worden toegewezen aan een ander ouderobject of hun attributen kunnen worden aangepast.

  • De knop deleteSelectedFeatures verwijdert het/de geselecteerde vliegveld(en) permanent.

  • Het symbool link opent een nieuw dialoogvenster waar u een bestaand vliegveld kunt selecteren dat dan zal worden toegewezen aan de huidige region. Dit zou handig kunnen zijn als u het vliegveld per ongeluk in de verkeerde region maakte.

  • Het symbool unlink ontkoppelt het/de geselecteerde vliegveld(en) van de huidige region, hen effectief laten staan als niet toegewezen (de vreemde sleutel wordt ingesteld op NULL).

  • Met de knop zoomToSelected kunt u op de kaart inzoomen op de geselecteerde kindobjecten.

  • De twee knoppen formView en openTable aan de rechterkant schakelen tussen de tabel- en formulierweergave van de gerelateerde kind-objecten.

Als u de Ontwerper Slepen en neerzetten gebruikt voor het object regions, kunt u selecteren welke gereedschappen beschikbaar zijn. U kunt zelfs beslissen of een nieuw formulier moet worden geopend wanneer een nieuw object wordt toegevoegd met de optie Formulier verbergen bij toevoegen object. Onthoud dat deze optie impliceert dat attributen niet Null een geldige waarde moeten hebben om correct te werken.

../../../_images/airport_relation_formproperties.png

Fig. 16.106 Ontwerper Slepen en neerzetten voor het configureren van gereedschappen voor relaties regions-airports

In het bovenstaande voorbeeld heeft de verwijzingslaag geometrieën (en is het niet slechts een alfanumerieke tabel), dus zullen de bovenvermelde stappen een item maken in de attributentabel van de laag dat geen overeenkomend geometrisch object heeft. De geometrie toevoegen:

  1. Kies openTable Attributentabel openen voor de referentielaag.

  2. Selecteer het record dat eerder werd toegevoegd in het objectformulier van de verwijzingslaag.

  3. Gebruik het gereedschap voor digitaliseren addPart Deel toevoegen om een geometrie te verbinden met het geselecteerde record van de attributentabel.

Als u werkt met de tabel Airports is de widget Relatie-verwijzing automatisch ingesteld voor het veld fk_region (dat werd gebruikt om de relatie te maken), bekijk widget Relatie-verwijzing.

In het formulier Airports zult u de knop formView zien aan de rechterkant van het veld fk_region: als u op de knop klikt zal het formulier van de laag Regions worden geopend. Dit widget stelt u in staat eenvoudig en snel de formulieren van de gekoppelde ouderobjecten te openen.

../../../_images/airport_attributes.png

Fig. 16.107 Dialoogvenster Identificatieresultaten Airports met relatie naar Regions

De widget Relatie-verwijzing heeft ook een optie om het formulier van de ouderlaag in te bedden in de kindlaag. Het is beschikbaar in het menu Eigenschappen ► Formulier attributen van de laag Airports: selecteer het veld fk_region en selecteer de optie Ingebed formulier weergeven.

Als u nu kijkt naar het dialoogvenster van het object, zult u zien dat het formulier van de regio nu is ingebed in het formulier van de vliegvelden en zelfs een combinatievak zal hebben, wat u in staat stelt het huidige vliegveld aan een andere regio toe te wijzen.

../../../_images/airport_attributes_expanded.png

Meer nog, als u schakelt met de modus Bewerken van de laag airports, heeft het veld fk_region ook een functie automatisch aanvullen: tijdens het typen zult u alle waarden zien van het veld id van de laag regions. Hier is het mogelijk een polygoon te digitaliseren voor de laag regions met de knop symbologyAdd als u kiest voor de knop Toevoegen nieuwe objecten toestaan in het menu Eigenschappen ► Formulier attributen van de laag airports.

De kindlaag kan ook worden gebruikt in het gereedschap Objecten selecteren d.m.v. waarde om objecten van de ouderlaag te selecteren, gebaseerd op attributen van hun kinderen.

In Fig. 16.108 zijn alle regio’s, waarvan de gemiddelde hoogte van de vliegvelden groter is dan 500 meter boven zeeniveau, geselecteerd.

U zult merken dat veel verschillende functies voor samenvoegen in het formulier beschikbaar zijn.

../../../_images/relation_select_by_value.png

Fig. 16.108 Ouderobjecten selecteren met waarden van hun kind

16.4.2.2. Relaties veel-tot-veel (N-M)

N-M-relaties zijn veel-tot-veel-relaties tussen twee tabellen. Bijvoorbeeld voor de lagen airports en airlines: een vliegveld ontvangt verscheidene luchtvaartmaatschappijen en een luchtvaartmaatschappij vliegt naar verscheidene vliegvelden.

Deze code voor SQL maakt de drie tabellen die we nodig hebben voor een relatie N-M in schema voor PostgreSQL/PostGIS, genaamd locations. U kunt de code uitvoeren met Database ► DB Manager… voor PostGIS of met externe programma’s als pgAdmin. De tabel airports slaat de laag airports op en de tabel airlines slaat de laag airlines op. In beide tabellen worden voor de duidelijkheid enkele velden gebruikt. Het moeilijke gedeelte is de tabel airports_airlines. We dienen er voor te zorgen dat die alle airlines voor alle airports vermeld (of vice versa). Dit soort tabel staat bekend als een draaitabel. De voorwaarden in deze tabel forceren dat een airport alleen kan worden geassocieerd met een airline als beide al in hun lagen bestaan.

CREATE SCHEMA locations;

CREATE TABLE locations.airports
(
   id serial NOT NULL,
   geom geometry(Point, 4326) NOT NULL,
   airport_name text NOT NULL,
   CONSTRAINT airports_pkey PRIMARY KEY (id)
);

CREATE INDEX airports_geom_idx ON locations.airports USING gist (geom);

CREATE TABLE locations.airlines
(
   id serial NOT NULL,
   geom geometry(Point, 4326) NOT NULL,
   airline_name text NOT NULL,
   CONSTRAINT airlines_pkey PRIMARY KEY (id)
);

CREATE INDEX airlines_geom_idx ON locations.airlines USING gist (geom);

CREATE TABLE locations.airports_airlines
(
   id serial NOT NULL,
   airport_fk integer NOT NULL,
   airline_fk integer NOT NULL,
   CONSTRAINT airports_airlines_pkey PRIMARY KEY (id),
   CONSTRAINT airports_airlines_airport_fk_fkey FOREIGN KEY (airport_fk)
      REFERENCES locations.airports (id)
      ON DELETE CASCADE
      ON UPDATE CASCADE
      DEFERRABLE INITIALLY DEFERRED,
   CONSTRAINT airports_airlines_airline_fk_fkey FOREIGN KEY (airline_fk)
      REFERENCES locations.airlines (id)
      ON DELETE CASCADE
      ON UPDATE CASCADE
      DEFERRABLE INITIALLY DEFERRED
 );

In plaats van PostgreSQL kunt u ook GeoPackage gebruiken. In dit geval kunnen de drie tabellen handmatig worden gemaakt met Database ► DB Manager…. In GeoPackage zijn geen schema’s, dus het voorvoegsel locations is niet nodig.

Voorwaarden voor secundaire sleutels in de tabel airports_airlines kunnen niet worden gemaakt met Tabel ► Tabel maken… of Tabel ► Tabel bewerken… dus zouden zij moeten worden gemaakt met Database ► SQL-venster…. GeoPackage ondersteunt geen argumenten ADD CONSTRAINT, dus de tabel airports_airlines zou in twee stappen moeten worden gemaakt:

  1. Maak de tabel met alleen het veld ID met Tabel ► Tabel maken…

  2. Met Database ► SQL-venster…, typ en voer deze code voor SQL uit:

    ALTER TABLE airports_airlines
       ADD COLUMN airport_fk INTEGER
       REFERENCES airports (id)
       ON DELETE CASCADE
       ON UPDATE CASCADE
       DEFERRABLE INITIALLY DEFERRED;
    
    ALTER TABLE airports_airlines
       ADD COLUMN airline_fk INTEGER
       REFERENCES airlines (id)
       ON DELETE CASCADE
       ON UPDATE CASCADE
       DEFERRABLE INITIALLY DEFERRED;
    

Dan, in QGIS, zou u twee een-tot-veel relaties moeten instellen zoals hierboven uitgelegd:

  • een relatie tussen de tabel airlines en de draaitabel;

  • en een tweede tussen de tabel airports en de draaitabel.

Een gemakkelijker manier om dit te doen (alleen voor PostgreSQL) is met Relaties ontdekken in Project ► Eigenschappen ► Relaties. QGIS zal automatisch alle relaties in uw database lezen en u hoeft alleen de twee te kiezen die u nodig hebt. Vergeet niet eerst de drie tabellen in het project van QGIS in te lezen.

../../../_images/airports_airlines_relation.png

Fig. 16.109 Relaties en automatisch ontdekken

In het geval u een airport of een airline wilt verwijderen, zal QGIS het/de geassocieerde record(s) in de tabel airports_airlines niet verwijderen. Deze taak zal door de database worden uitgevoerd als we de juiste voorwaarden specificeren bij het maken van de draaitabel, zoals in het huidige voorbeeld.

Notitie

N-M-relatie combineren met automatische transactie groep

U zou de modus voor transacties in moeten schakelen in Eigenschappen ► Databronnen ► bij het werken met een dergelijke context. QGIS zou in staat moeten zijn rij(en) in alle tabellen (airlines, airports en de draaitabel) toe te voegen en bij te werken.

Tenslotte moeten we de juiste kardinaliteit selecteren in Laageigenschappen ► Attributen formulier voor de lagen airports en airlines. Voor de eerste zouden we de optie airlines (id) kiezen en voor de tweede de optie airports (id).

../../../_images/airports_airlines_relation_formproperties.png

Fig. 16.110 Kardinaliteit relatie instellen

Nu kunt u een airport aan een airline koppelen (of een airline aan een airport) met Kindobject toevoegen of Bestaand kindobject koppelen in de subformulieren. Een record zal automatisch worden ingevoegd in de tabel airports_airlines.

../../../_images/add_airport_airline.png

Fig. 16.111 N-M-relaties tussen airports en airlines

Notitie

Kardinaliteit Veel-tot één-relatie gebruiken

Soms is het verbergen van de draaitabel in een N-M-relatie niet gewenst. Voornamelijk omdat er attributen in de relatie kunnen staan die alleen waarden hebben als er een relatie is. Als uw tabellen een veld geometrie hebben, zou het interessant kunnen zijn om de optie Op kaart identificeren (Laageigenschappen ► Formulier attributen ► Beschikbare widgets ► Velden) te activeren voor de velden met secundaire sleutels in de draaitabel.

Notitie

Primaire sleutel draaitabel

Vermijd het gebruiken van meerdere velden voor de primaire sleutel in een draaitabel. QGIS gaat uit van één enkele sleutel, dus een voorwaarde als constraint airports_airlines_pkey primary key (airport_fk, airline_fk) zal niet werken.

16.4.2.3. Polymorfische relaties

Het doel

Polymorfische relaties zijn een speciaal geval van 1-N-relaties, waar één enkele verwijzings- (document)laag de objecten bevat voor meerdere lagen waarnaar verwezen wordt. Dit verschilt van normale relaties die een verschillende verwijzingslaag vereisen voor elke laag waarnaar verwezen wordt. Één enkele verwijzings- (document)laag kan worden verkregen door een aanvullende kolom layer_field toe te voegen in de verwijzings- (document)laag die informatie opslaat om de laag waarnaar verwezen wordt te identificeren. In zijn meest eenvoudige vorm zal de verwijzings- (document)laag eenvoudigweg de laagnaam, van de laag waarnaar verwezen wordt, in dit veld invoegen.

Om meer precies te zijn, een polymorfische relatie is een set van normale relaties die dezelfde verwijzingslaag hebben, maar hebben de laag waarnaar verwezen wordt dynamisch gedefinieerd. De polymorfische instelling van de laag wordt opgelost door een expressie te gebruiken die overeen moet komen met enkele eigenschappen van de laag waarnaar verwezen wordt, zoals de naam van de tabel, laag-ID, laagnaam.

Stel u voor dat we naar het park gaan en foto’s willen nemen van verschillende soorten plants en animals die we daar zien. Elke plant of dier heeft meerdere foto’s aan zich verbonden, dus als we de normale 1:N-relaties zouden gebruiken om de foto’s op te slaan, zouden we twee afzonderlijke tabellen nodig hebben, animal_images en plant_images. Dit zou misschien geen probleem zijn voor 2 tabellen, maar stel u voor dat we afzonderlijke foto’s willen maken van paddenstoelen, vogels etc.

Polymorfische relaties lossen dit probleem op omdat alle objecten waarnaar verwezen wordt zijn opgeslagen in dezelfde tabel documents. Voor elk object wordt de laag waarnaar verwezen wordt opgeslagen in het veld referenced_layer en het verwezen object-ID in het veld referenced_fk.

Polymorfische-relaties definiëren

Eerst moeten we QGIS laten weten van de polymorfische relaties tussen de lagen. Dat wordt gedaan in Project ► Eigenschappen…. Open de tab Relaties en klik op de kleine pijl die naar beneden wijst naast de knop symbologyAdd Relatie toevoegen, zodat u de optie Polymorfische relatie toevoegen kunt selecteren in het nieuw verschenen keuzemenu.

../../../_images/polymorphic_relation_properties.png

Fig. 16.112 Toevoegen van een polymorfische relatie door een laag documents als verwijzing en animals en plants als lagen waarnaar verwezen wordt.

  • ID zal worden gebruikt voor interne doeleinden en moet uniek zijn. U zou mogelijk aangepaste formulieren moeten maken. Als u het leeg laat zal er een voor u worden gegenereerd maar u kunt er zelf een toewijzen om er een te krijgen die voor u eenvoudiger is.

  • Referentielaag (Kind), ook wel beschouwd als de kindlaag, is die met het veld voor de vreemde sleutel erop. In ons geval is dit de laag documents. Voor deze laag dient u een verwijzingsveld toe te voegen dat naar de andere laag verwijst, dus is dit referenced_fk.

    Notitie

    Soms heeft u meer dan één enkel veld nodig om objecten op een laag uniek te kunnen identificeren. Maken van een relatie met een dergelijke laag vereist een samengestelde sleutel, d.i. meer dan één enkel paar van overeenkomende velden. Gebruik de knop symbologyAdd Nieuw veldpaar toevoegen als deel van een samengestelde sleutel om net zoveel paren toe te voegen als nodig is.

  • Veld laag is het veld in de verwijzingstabel dat het resultaat van de expressie voor de geëvalueerde laag opslaat, wat de verwijzingstabel is waartoe dit object behoort. In ons voorbeeld zou dit het veld referenced_layer zijn.

  • Expressie veld laag evalueert naar een unieke identificatie van de laag. Dit mag zijn de laagnaam @layer_name, de laag-ID @layer_id, de naam van de tabel van de laag decode_uri(@layer, 'table') of elk ander ding dat een laag uniek kan identificeren.

  • Sterkte relatie stelt de sterkte in van de gemaakte relaties tussen de ouder- en kindlaag. Het standaard type Associatie betekent dat de ouderlaag eenvoudig is gekoppeld aan de kindlaag, terwijl het type Compositie u in staat stelt ook de kindobjecten te dupliceren bij het dupliceren van die van de ouderlaag en bij het verwijderen van een object ook de kinderen worden verwijderd, resulterend in trapsgewijze over alle niveaus (wat betekent dat kinderen van kinderen van… ook worden verwijderd).

  • Verwezen lagen ook wel beschouwd als ouderlagen, zijn die waar de primaire sleutel naartoe wijst, dus hier zouden dat de lagen plants en animals zijn. U moet de primaire sleutel definiëren van de verwezen lagen vanuit de keuzelijst, dus is het fid. Onthoud dat de definitie van een geldige primaire sleutel vereist dat alle verwezen lagen een veld hebben met die naam. Als er niet zo’n veld is, kunt u geen polymorfische relatie opslaan.

Eenmaal toegevoegd kan de polymorfische relatie worden bewerkt via het menu-item Polymorfische relatie bewerken.

../../../_images/polymorphic_relations.png

Fig. 16.113 Voorbeeld van de nieuw gemaakte polymorfische relatie en zijn kind-relaties voor animals en plants.

Het voorbeeld hierboven gebruikt het volgende databaseschema:

CREATE SCHEMA park;

CREATE TABLE park.animals
(
   fid serial NOT NULL,
   geom geometry(Point, 4326) NOT NULL,
   animal_species text NOT NULL,
   CONSTRAINT animals_pkey PRIMARY KEY (fid)
);

CREATE INDEX animals_geom_idx ON park.animals USING gist (geom);

CREATE TABLE park.plants
(
   fid serial NOT NULL,
   geom geometry(Point, 4326) NOT NULL,
   plant_species text NOT NULL,
   CONSTRAINT plants_pkey PRIMARY KEY (fid)
);

CREATE INDEX plants_geom_idx ON park.plants USING gist (geom);

CREATE TABLE park.documents
(
   fid serial NOT NULL,
   referenced_layer text NOT NULL,
   referenced_fk integer NOT NULL,
   image_filename text NOT NULL,
   CONSTRAINT documents_pkey PRIMARY KEY (fid)
);