Svg images in project naar geopackage

Ik heb een lokaal Qgis project met verkeersborden NL. Ik gebruik daarvoor svg. images die in een lokale folder staan. Nu wilde ik de data en opmaak (dus inclusief svg) delen door alles in een geopackage bestand op te slaan. Probleem daarbij is dat de svg plaatjes niet meekomen. Oorzaak is dat ik de svg in het project heb opgenomen door locatie op mijn harde schijf aan te geven ipv te kiezen voor “embedded”. Omdat het nogal veel plaatjes zijn voel ik er niet veel voor om die allemaal weer opnieuw te “embedden”. Ik zoek dus een manier om deze plaatjes mee te nemen in de geopackage. Ik had de experimentele plugin “SVG embeddor” al gevonden maar die werkt helaas niet zoals ik had verwacht. Iemand een idee hoe ik dit eenvoudig voor elkaar kan krijgen?

Dag PeeWee,

Als je een svg symbool in qgis “embed” dan wordt de svg broncode in je qgis projectbestand geplakt . Een svg is namelijk gewoon een tekstbestandje met codes die beschrijven hoe je (vector)plaatje is opgebouwd. En een qgis projectbestand is in principe zelf ook gewoon een lap XML-tekst.
Het heeft dus verder niks te maken met of je projectbestand een losse .qgz is of zelf ook weer is ingebed in een geopackage. Het probleem is dat je project nog steeds verwijzingen naar svg bestanden op je lokale schijf bevat, in plaats van de svg broncodes zelf.

Je kan er natuurlijk voor kiezen om gewoon qgz + gpkg + map met svg bestanden mee te geven, als alles op relatieve paden staat dan zou dat op een andere pc gewoon moeten werken. Maar da’s minder mooi. En een paar honderd keer bestandjes terugzoeken om te embedden is ook niks. Gelukkig hebben we python en kan je daarmee bijna alles in qgis automatiseren. Of je dat nog eenvoudig mag noemen, dat is weer wat anders :wink:

Open een kopie van het project waarin de bord symbolen nog zichtbaar zijn. Mocht je naast verkeersborden nog andere lagen hebben, zorg dan dat de borden laag geselecteerd staat. Dan kan je in het python venster de volgende code draaien:

import base64

l = iface.activeLayer()
r = l.renderer()

for i,c in enumerate(r.categories()):
    s = c.symbol()
    m = s.symbolLayer(0)
    
    if not isinstance(m, QgsSvgMarkerSymbolLayer) or m.path()[0:6] == 'base64':
        continue
    
    with open( m.path(), 'rb') as svg:
        svg64 = base64.b64encode(svg.read()).decode('utf-8')
        m.setPath("base64:" + svg64)
    
    s.changeSymbolLayer(0, m.clone())
    r.updateCategorySymbol(i, s.clone())

iface.layerTreeView().refreshLayerSymbology(l.id())

Als je project zo is opgebouwd als ik denk (gecategoriseerd op een kolom RVV nummer, één svg per nr) dan werkt dit en zijn de svg’s hierna allemaal embedded. Je kan je projectbestand dan weer in een gpkg doen, of niet, dat maakt volgens mij weinig uit.
Laat maar even weten of het gelukt is.

@sriemens Dank voor je reactie.

Dit was precies wat ik van plan was te doen maar als het beter kan dan wil ik dat graag proberen. Misschien niet relevant maar het zijn wel bijna 2 miljoen borden dus hoop ik niet dat er per bord een embedded plaatje gemaakt hoeft te worden maar dat het per rvv code een plaatje wordt :wink:

Het is me helaas nog niet gelukt maar dat kan heel goed liggen aan mijn gebrek aan kennis van Python in Qgis. Ik krijg een foutmelding maar daar kan ik daar helaas niets mee. Zie plaatje.

Je aanname klopt dat de svg staan in een aparte map en dat ze per RVV verkeersbord een apart svg zijn. Ze zijn (tijdelijk) hier te downloaden mocht je interesse hebben (nb bron =Wikimedia) .

De geopackage (inclusief project bestand met verwijzing naar de svg) is hier (tijdelijk) te downloaden. Wellicht kun je daar iets mee.

Ehm, ho, er staat een verdwaalde dubbele punt aan het eind van regel 17. Die mag je verwijderen en dan opnieuw proberen. Ik pas de code in mijn vorige antwoord ook aan. Het zou trouwens kunnen dat de svg’s in dezelfde map moeten staan als het qgz projectbestand, hier zal je even mee moeten spelen ben ik bang, je krijgt vanzelf een foutmelding als een svg niet kan worden gevonden.

Ik heb ook even naar je gpkg gekeken maar het project daarin lijkt te verwijzen naar een postgres databaseverbinding en niet naar de gegevens in de geopackage zelf. Ik denk dat je bij elke laag even moet rechtsklikken, ‘Databron wijzigen’ en dan de bijbehorende laag in gpkg selecteren. Anders werkt het alsnog niet bij anderen.

Dank weer voor je reactie. Er lijkt wat gelukt te zijn maar “the proof of the pudding is in the eating” dus hier een nieuw (gezipte) geopackage inclusief project bestand.

Hopelijk is deze te gebruiken zodat ook de plaatjes zichtbaar zijn. Is mijn aanname juist dat men na het maken van de connectie naar de geopackage men alleen op het projectbestand in de geopackage hoeft te dubbelklikken om het werkend te krijgen?

Ja die doet het bij mij ook, ik krijg de borden te zien. Bij de svg symbolen staat ook keurig dat het om een ingebed bestand gaat. Er zijn er een paar waar je denk ik geen symbool voor kon vinden, die hebben een gekleurd rondje als marker. Je kan nu de symbolisering opslaan als qml stijlbestand en later weer op andere lagen toepassen. Ik denk dat het ook wel gewaardeerd wordt als je dat via dit forum of een andere openbare plek deelt.

Je kan een projectbestand in geopackage op meerdere manieren openen, de snelste vind ik via het menu Project > Openen vanuit > Geopackage. Of toch weer los als .qgz opslaan in dezelfde map als de geopackage, daarop kan je gewoon dubbelklikken om met qgis te openen. Kan allebei!
Ik doe zelf alles met geopackage, je ziet wat een gebruiksvriendelijk eindproduct je krijgt, zeer eenvoudig te delen met anderen en nooit gezeik over kolomlengtes of -namen.

Als laatste wil ik je nog even wijzen op de prachtige ondergrondkaarten in RD die via de onvolprezen PDOK plugin te benaderen zijn. Niet dat OpenStreetMap een lelijke kaart heeft maar binnen Nederland geniet werken in RD meestal de voorkeur.

Wederom dank. Fijn dat het werkt. Ik dacht dat ik alle voorkomende svg wel had dus kun je een voorbeeld geven van de positie waar een svg ontbreekt? (NB in de selectie waar je ze kunt aan/uitvinken ontbreken er wel een paar maar hopelijk op de kaart niet).

Mooi dat geopackage op diverse manieren in Qgis te openen zijn. Weer wat geleerd. :+1:

Het is de bedoeling om dit bestand te delen. Het betreft allemaal open data en het plan is om dit op het OSM forum te delen. (vandaar geen RD). De verkeersborden geven hints waar e.e.a. in OSM te verbeteren is nl. In postgis heb ik al een aantal queries gemaakt om die punten te identificeren en er zelfs al een flink aantal aangepast.

Je kunt Openstreetmap ook heel mooi in RD weergeven hoor, dat is voor in ieder geval NL geen probleem. Gebruik van OSM hoeft dus niet te betekenen dat je niet in RD kunt werken.