Outdated version of the documentation. Find the latest one here.

Virtuele lagen

Een speciaal soort vectorlaag stelt u in staat om een laag te definiëren als resultaat van een geavanceerde query, met behulp van de taal voor SQL voor elk aantal andere vectorlagen die QGIS in staat is te openen. Deze lagen worden virtuel lagen genoemd: zij bevatten zelf geen gegevens en kunnen worden gezien als weergaven voor andere lagen.

Een virtuele laag maken

Open het dialoogventsre voor het maken van een virtuele laag door te klikken op Virtuele laag toevoegen in het menu Kaartlagen of vanuit de overeenkomende werkbalk.

Het dialoogvenster stelt u in saat een query voor SQL te specificeren. De query mag de naam (of ID) van bestaande vectorlagen gebruiken als ook veldnamen uit deze lagen.

Als u bijvoorbeeld een laag genaamd regions heeft, kunt u een nieuwe virtuele laag maken met een query voor SQL als SELECT * FROM regions WHERE id < 100. De query voor SQL zal worden uitgevoerd, ongeacht wat de onderliggende provider van de laag regions is en zelfs als deze provider niet direct query’s voor SQL ondersteunt.

Joins en complexe query’s kunnen ook eenvoudigweg worden gemaakt door direct de namen te gebruiken van de lagen die samengevoegd moeten worden.

Ondersteunde taal

Het onderliggende programma gebruikt SQLite en Spatialite voor bewerkingen.

Dat betekent alles voor SQL kunt gebruiken dat uw lokale installatie van SQLite begrijpt.

Functies uit SQLite en ruimtelijke functies uit Spatialite kunnen ook worden gebruikt voor een query voor een virtuele laag. maken van bijvoorbeeld een puntenlaag uit een laag met alleen attributen kan worden gedaan met een query soortgelijk aan: SELECT id, MakePoint(x, y, 4326) as geometry FROM coordinates

Functies van expressies van QGIS kunnen ook worden gebruikt in een query voor een virtuele laag.

Gebruik de naam geometry om te verwijzen naar de geometriekolom van een laag.

In tegenstelling tot een pure query in SQL, moeten alle velden voor een virtuele laag worden benoemd. Vergeet niet het sleutelwoord as te gebruiken om uw kolommen te benoemen als zij het resultaat zijn van een berekening of aanroep van een functie.

Problemen bij de uitvoering

Als standaard parameters zijn ingesteld, zal het programma voor de virtuele laag zijn best doen om de verschillende typen kolommen van de query te detecteren, inclusief het type van de geometriekolom als er een aanwezig is.

Dit wordt gedaan door middle van introspectie van de query indien mogelijk of door, als laatste middel, de eerste rij van de query op te halen (LIMIT 1). Ophalen van de eerste rij voor slechts het maken van de laag zou ongewenst kunnen zijn om redenen van uitvoering.

Het dialoogvenster voor het maken maakt het mogelijk verschillende parameters te specificeren:

  • Unieke kolom voor identificatie: deze optie maakt het mogelijk te specificeren welk veld van de query de unieke integere waarden weergeeft die QGIS kan gebruiken als identificatie voor de rijen. Standaard wordt een zichzelf ophogende waarde integer gebruikt. Specificeren van een unieke kolom voor identificatie maakt het mogelijk het selecteren van rijen op ID te versnellen.

  • Geen geometrie: deze optie forceert de virtuele laag om een veld voor geometrie te negeren. De resulterende laag is een laag met alleen attributen.

  • Geometriekolom: deze optie maakt het mogelijk de naam van de kolom te specificeren die moet worden gebruikt als de geometrie voor de laag.

  • Type: deze optie maakt het mogelijk het type geometrie voor de virtuele laag te specificeren.

  • CRS: deze optie maakt het mogelijk het coördinaten referentiesystem voor de virtuele laag te specificeren.

Speciale opmerkingen

Het programma voor de virtuele laag probeert het type te bepalen voor elke kolom van de query. Als dat mislukt wordt de eerste rij van de query opgehaald om typen kolommen te bepalen.

Het type van een bepaalde kolom kan direct in de query worden gespecificeerd met behulp van enkele speciale opmerkingen.

De syntaxis is de volgende: /*:type*/. Het moet worden geplaatst net na de naam van een kolom. type mag zijn int voor integers, real voor floating point numbers of text.

Bijvoorbeeld: SELECT id+1 as nid /*:int*/ FROM table

Het type en coördinaten referentiesysteem van de geometriekolom kan ook worden ingesteld dankzij speciale opmerkingen met de volgende syntaxis /*:gtype:srid*/ waar gtype het type geometrie is (point, linestring, polygon, multipoint, multilinestring of multipolygon) en srid een integer die de code voor EPSG van een coördinaten referentiesysteem weergeeft.

Indexen gebruiken

Bij het verzoeken om een laag door middel van een virtuele laag zullen indexen van de bronlaag op de volgende manieren worden gebruikt:

  • als een predicaat = wordt gebruikt in de kolom voor de primaire sleutel van de laag, zal de onderliggende gegevensprovider worden gevraagd naar een bepaalde ID (FilterFid)

  • voor elk ander predicaat (>, <=, !=, etc.) of op een kolom zonder primaire sleutel zal een verzoek dat is opgebouwd uit een expressie worden gebruikt om de onderliggende gegevensprovider te bevragen. Dat betekent dat indexen, als zij bestaan, kunnen worden gebruikt voor databaseproviders.

Er bestaat een specifieke syntaxis om ruimtelijke predicaten in verzoeken af te handelen en het gebruiken van ene ruimtelijke index te activeren: er bestaat voor elke virtuele laag een verborgen kolom, genaamd _search_frame_. Deze kolom mag voor gelijkheid worden vergeleken met een begrenzingsvak. Voorbeeld: select * from vtab where _search_frame_=BuildMbr(-2.10,49.38,-1.3,49.99,4326)

Ruimtelijke binaire predicaten zoals ST_Intersects werken veel sneller indien zij gebruikt worden in samenwerking met deze syntaxis voor ruimtelijke index.