Probleme mit Darstellung großer SVG-Dateien
-
Mein Name ist Hendrik und ich entwickle seit ca. 1,5 Jahren Anwendungssoftware mit folgender Konfiguration:
- Debian Linux x64 v9.13
- Python v3.5.3
- Qt 5.15.0 unter PySide2
- als Entwicklungs-GUI setzte ich Eclipse ein
Seit einigen Wochen beschäftige ich mit OpenStreetMap (OSM). Ich habe den Datenbestand der OSM-Daten aus Deutschland in einer lokalen PostGreSQL-Datenbank und habe mir mit Hilfe der Bibliotheken »mapnik« und »cairo« einen Renderer geschrieben, der mir aus einen Rechteck von GPS-Koordinaten eine SVG-Vektorgraphik rendert. Die gerenderten Graphiken sehen gut aus, wenn ich sie z.B. mit InkScape öffne.
Jetzt kommt das Problem. Wenn ich die SVG-Graphic in Qt öffne, bekomme ich zunächst in der Konsole 298 Warnungen der Form
qt.svg: <SVG-FILE>:71772: Could not resolve property: #pattern0 ... qt.svg: <SVG-FILE>:71772: Could not resolve property: #pattern297
und anschließend ca. 8.500 Zeilen der Form
qt.svg: link #glyph0-1 is undefined! ... qt.svg: link #glyph241-0 is undefined!
Die Links sind allesamt vorhanden, ich habe ca. 70 - 80 Links überprüft. Das Ergebnis in meiner Application sieht dann leider so aus:
Alle Bezeichnungen fehlen, lediglich die Bezeichnungen mit Outline-Schriften sind zu erkennen.
Ich benutzte ein vom Standard abgeleitetes QtWidgets.QGraphicsView(), in dessen QGraphicsScene ich ein QtSvg.QGraphicsItem() einfüge. Der Code sieht so aus:
class MyGraphicsView(QtWidgets.QGraphicsView): def __init__(self, parent): super().__init__(parent) self._scene = QtWidgets.QGraphicsScene(self) self._renderer = QtSvg.QSvgRenderer() self.setScene(self._scene) def load_map(self): # set graphic scene - renderView ist vom Typ »MyGraphicsView()« _scene = self.ui.renderView._scene _scene.setSceneRect(0, 0, 8000, 8000) # SVG Image - self.SVG_Image enthält den Pfad zur SVG-Graphic _svg_item = QtSvg.QGraphicsSvgItem(self.SVG_Image) _scene.addItem(_svg_item) # self.ui.renderView.fitInView(_svg_item, Qt.KeepAspectRatio)
Ich habe nach den Warnungen gesucht, aber leider kein für mich brauchbares Ergebnis gefunden. Habe lediglich gefunden, wie ich mit einer Umgebungsvariablen die Meldungen unterdrücken kann, aber das Ergebnis fand ich nicht wirklich hilfreich ;-)
Kann mir jemand von euch helfen was ich tun kann, dass die SVG-Graphic sauber dargestellt wird? Kann es ggf. sein, dass Qt mit sehr großen SVG-Graphiken Probleme hat? Meine 8000x8000 große SVG-Graphik hat ca. 20 MB, aber die Probleme sind auch bei kleiner gerenderten SVG-Graphiken, z.B. 800x600 Pixel.
Danke im voraus und viele Grüße, Hendrik.
-
@___Hendrik___123
der Qt SVG renderer/interpreter unterstützt einfach nicht alle Features. Insbesondere hat er Probleme mit styling.
Wenn du QtSvg verwenden willst wird dir nichts anderes übrig bleiben als das generierte SVG an sich zu ändern. -
@raven-worx
Danke für deine Antwort! Ich muss nicht unbedingt QtSvg verwenden, gibt es ggf. Alternativen die du mit empfehlen kannst und die die Probleme nicht haben? -
@___Hendrik___123
persönlich habe ich keine Empfehlung.
Aber eine google suche hat z.B. folgendes Ergebnis gebracht: librsvg (oder irgendeine andere 3rdparty lib)
k.A. was deine Anforderungen sind, aber könnte ein wenig umständlich sein unter Windows. -
@raven-worx
Danke, ich schaue mir die Libs mal an. Die Anforderungen sind, dass das SVG so aussieht wie ich es gerendert habe und mit Windows habe ich bei dieser Sache glücklicherweise nix zu tun ;-)