Mehr

So rendern Sie ein SVG aus PostGIS mit ST_AsSVG

So rendern Sie ein SVG aus PostGIS mit ST_AsSVG


Als ich gestern Abend mit einem Kartographen von National Geographic sprach, wurde mein Interesse erneut an einem Open-Source-Toolset zur Kartenveröffentlichung geweckt, das auf PostGIS und Inkscape basiert (gemäß seinem Workflow und wie andere Illustrator mit Avenza Map Publisher mit ArcGIS-Daten verwenden).

Beim PostGIS ST_AsSVG-Befehl bin ich mir nicht sicher, wie ich mit der Ausgabe als SVG-Datei arbeiten soll. Ich kann in anderen Diskussionen sehen, dass SVGs irgendwie exportiert werden können, aber ich bin mir nicht sicher, wie das genau funktioniert.

Angenommen, es geht vielleicht nur darum, den Befehl zum Exportieren einer statischen SVG-Datei auszurichten - wäre / könnte Inkscape sogar ein SVG direkt aus PostGIS lesen?


Die Postgis-Funktion ST_AsSVG wandelt Geometrien einfach in ihre SVG-Punkt- oder Pfad-Äquivalente um und erlaubt Ihnen nicht, direkt irgendwelche Attribute/Styling hinzuzufügen. Zum Beispiel eine Abfrage mit einem Punkt, einer Linienfolge und einem Polygon:

MIT Formen (Geom, Attribut) AS (VALUES( (SELECT ST_MakePoint(0,0)),1), ((ST_MakeLine(ST_MakePoint(0,0), ST_MakePoint(10,10))), 2), ((SELECT ST_MakeBox2d(ST_MakePoint(0,0), ST_MakePoint(10,10))), 3) ) SELECT ST_AsSVG(geom) aus Formen;

kehrt zurück:

cx="0" cy="0" M 0 0 L 10 -10 M 0 0 L 0 -10 10 -10 10 0 Z

das ist ein Punkt, ein nicht geschlossener Linienzug und eine geschlossene Linie, dh ein Polygon. M bedeutet bewegen nach, L bedeutet Linie nach und Z bedeutet nah. Es gibt andere Geometrietypen in SVG, aber diese gibt ST_AsSVG zurück (siehe Dokumentation für die Multi-Version desselben).

An sich ist dies nicht sehr hilfreich, da Sie das vermissenPfad-Tagsund alle Styling-Informationen, von denen ein vollständiges Beispiel etwa so aussehen würde:

 

Weitere Informationen finden Sie im w3schools SVG-Tutorial.

Wenn Sie also tatsächlich mit einer Postgis-Abfrage ein gültiges SVG erstellen möchten, müssen Sie Pfad-Tags und Formatierungen für Farbe, Linie, Füllung usw. hinzufügen. Dies kann durch die Verwendung derConcat-Operatorund einFallaussageum die Formatierung einzustellen. Beispielsweise,

MIT Formen (Geom, Attribut) AS ( WERTE( (SELECT ST_MakeLine(ST_MakePoint(0,0), ST_MakePoint(10,10))), 2), ((SELECT ST_Envelope(ST_MakeBox2d(ST_MakePoint(0,0), ST_MakePoint( 10,10)))), 3) ) SELECT concat( '') VON Formen;

was zurückgibt:

 

Schließlich, wenn du das alles einpackstarray_to_stringundarray_agg, und fügen Sie die Kopf- und Fußzeile hinzu, dh dieund, erhalten Sie am Ende einen SVG-Block, der alle Ihre Geometrien repräsentiert, z.

WITH shape (geom, Attribut) AS ( VALUES( (SELECT ST_MakeLine(ST_MakePoint(0,0), ST_MakePoint(10,10))), 2), ((SELECT ST_Envelope(ST_MakeBox2d(ST_MakePoint(0,0), st_makepoint( 10,10)))), 3) ), Pfade (svg) als ( SELECT concat( '') FROM Formen ) SELECT concat( '', array_to_string(array_agg(svg),"), '') FROM-Pfade;

was nun den einzelnen Datensatz zurückgibt:

TL;DR, andere Optionen

An diesem Punkt denken Sie wahrscheinlich, TL; DR, und es ist wahr, dass dies eine Menge Arbeit ist, und die Fallanweisungen für die Strichfarbe, -breite usw. könnten sehr lang und unhandlich werden.

Es gibt andere Möglichkeiten. Geoserver (mit einer Postgis/Vektor-Datenquelle) unterstützt SVG als Ausgabeformat und Sie können SLDs oder CartoCSS innerhalb von Geoserver verwenden, um sie zu stylen, dann einfach ein WMS mit SVG als Ausgabeformat anfordern und fertig. Wie @Scro auch sagte, können Sie Tools wie verwenden Fliesenfräse um das Styling für Sie zu übernehmen (nicht getestet). Nach einer sehr langen Antwort schlage ich im Grunde vor, dass Sie ST_AsSVG nicht direkt für etwas anderes als für sehr schnelle und schmutzige SVGs verwenden sollten.


Wenn Sie offen für den Export von Daten aus QGIS und nicht aus PostGIS sind, können Sie das Simple SVG-Plugin verwenden. Dieses Plugin exportiert die aktiven Layer aus QGIS und versucht, die Symbologie beizubehalten. Ich habe dies mit relativ gutem Erfolg verwendet. Darüber hinaus können Sie QGIS Composer verwenden, um Ihre Karten zu starten und deren SVG-Exportfunktion zu verwenden. Dies ist nicht dasselbe wie die PostGIS-Abfrage, aber wenn das Ziel darin besteht, Daten von QGIS an Inkscape zu übertragen, funktioniert dies.


Durch einige sehr ungeschickte Fummelei bin ich auf eine umfassendere ( / generalisierte ) Lösung gestoßen, von der ich hoffe, dass sie anderen Reisenden auf der Suche nach Google / dieser Site hilfreich sein könnte.

WITH query AS (SELECT wkb_geometry AS Geometrie FROM Bezirke ), q AS (SELECT ST_XMin(ST_Collect(geometry)) as x_min, ST_XMax(ST_Collect(geometry)) as x_max, ST_YMin(ST_Collect(geometry)) as y_min, ST_YMax(ST_Collect( Geometrie)) als y_max, ARRAY_TO_STRING(ARRAY_AGG(CONCAT('')),") als svg FROM-Abfrage ) SELECT CONCAT('', q.svg, '') VON q

Legen Sie Ihre Anfrage zuerst darin abAbfrage AS (… )CTE, und Bob ist dein Onkel.


SVG-Bild href wird komplett schwarz gerendert

Ich versuche, ein SVG aus einem Browsertool (pgadmin4) zu holen. Am Ende habe ich jedoch ein SVG, das falsch gerendert wird. Die generierte Grafik verwendet SVG-"Symbole", indem sie auf externe Dateien verweist. Während dies im Browser gut funktioniert, werden alle farbigen Pixel dieser eingebetteten SVGs zu 100% schwarz gerendert. (Nachdem ich die Links korrigiert habe, um auf die richtigen Dateien zu verweisen. Wie man sehen kann, sind die Formen korrekt).

Hier das Bild aus dem Browser:

Und hier, was ich in inkscape bekomme:


1 Antwort 1

Ich habe das hier http://jsfiddle.net/fktGL/1/ gelöst, zuerst musste ich das svg-Attribut von ändern

da die svg nicht auf dem W3C-Validierungsdienst validiert wurde, und hier ist ein Stackoverflow, der erklärt, dass eine Änderung erforderlich ist.

Ich musste dann einige Zeitüberschreitungen hinzufügen, damit das SVG richtig gerendert werden konnte. Ich verstehe, dass dies daran liegt, dass das Bild in der SVG- und Amp-Leinwand gezeichnet wurde, aber beide brauchen etwas Zeit, um das Bild zu rendern. Meine Lösung funktioniert auf langsameren Geräten nicht perfekt (eine Erhöhung der Timeouts würde helfen), aber ich kenne keinen anderen Weg, dies zu umgehen (begrüße alle Kommentare/Verbesserungen).


Dies ist aus unserer Sicht beabsichtigt - es ist wie die Verwendung eines PNG-Bildes in frühen Versionen von Internet Explorer, bevor der Browser dieses Bildformat noch unterstützte.

Wenn Sie also als <img> auf .svg verlinken, sollten Sie sich bewusst sein, dass Sie die Zielgruppe einschränken, da nicht alle Browser diesen Inhalt rendern können.

Ich schlage vor, diese in einfachere PNG-Bilddateien zu konvertieren. Ich habe dies für den fraglichen Beitrag getan.

Es funktioniert in Browsern, die SVG innerhalb eines IMG-Tags wie Chrome unterstützen. Firefox benötigt SVG in einem OBJECT-Tag. IE unterstützt SVG nicht. Siehe http://en.wikipedia.org/wiki/Scalable_Vector_Graphics#Support_for_SVG_in_web_browsers als Referenz.

SVG ist eher wie Flash als ein Bild. Die Unterstützung in Browsern erfolgte immer durch Plugins, anstatt zu versuchen, es direkt als Bild zu verwenden.

Google hat sich in Chrome in diesem Fall selbstständig gemacht und wurde daher in HTML5 aufgenommen. Dies ist jedoch noch kein Standard.

Also grundsätzlich keine SVG-Bilder verwenden noch

Was die Verwirrung mit Besuchern angeht, denke ich, dass es ungewöhnlich ist, dass sie am Ende ein SVG-Bild zum Hochladen haben, es sei denn, sie haben es erstellt. In diesem Fall sollten sie wissen, dass sie es im Moment zu einem PNG für die Webnutzung machen müssen.


5.1. PostGIS-Geometrie/Geographie/Box-Datentypen

In diesem Abschnitt werden die benutzerdefinierten PostgreSQL-Datentypen aufgelistet, die von PostGIS installiert werden, um räumliche Daten darzustellen.

Jeder Datentyp beschreibt sein Typumwandlungsverhalten. Eine Typumwandlung konvertiert Werte eines Datentyps in einen anderen Typ. PostgreSQL ermöglicht das Definieren des Umwandlungsverhaltens für benutzerdefinierte Typen zusammen mit den Funktionen, die zum Konvertieren von Typwerten verwendet werden. Besetzungen können haben automatisch Verhalten, das die automatische Konvertierung eines Funktionsarguments in einen von der Funktion unterstützten Typ ermöglicht.

Einige Besetzungen haben explizit Verhalten, was bedeutet, dass die Umwandlung mit der Syntax CAST(myval As sometype) oder myval::sometype angegeben werden muss. Explizites Casting vermeidet das Problem mehrdeutiger Casts, die auftreten können, wenn eine überladene Funktion verwendet wird, die einen bestimmten Typ nicht unterstützt. Eine Funktion kann beispielsweise ein box2d oder ein box3d akzeptieren, aber keine Geometrie. Da Geometrie automatisch in beide Boxtypen umgewandelt wird, führt dies zu einem Fehler "mehrdeutige Funktion". Um den Fehler zu vermeiden, verwenden Sie eine explizite Umwandlung in den gewünschten Boxtyp.

Alle Datentypen können in text umgewandelt werden, sodass dies nicht explizit angegeben werden muss.


Vereinfachung der Kartenfunktionen

Um die Dateigröße Ihres SVG zu reduzieren, unterstützt Kartograph eine topologieerhaltende Vereinfachung. Der Standardalgorithmus ist die Visvalingam-Whyatt-Vereinfachung, die von Mike Bostock schön erklärt wurde.

Kartograph enthält jedoch auch zwei andere Algorithmen ( douglas-peucker und Distance ), die Sie verwenden können, indem Sie das folgende Wörterbuch bereitstellen:

Die Bedeutung von Toleranz variiert zwischen den verschiedenen Algorithmen, aber im Allgemeinen gilt: Je höher die Toleranz, desto stärker die Vereinfachung (und desto kleiner die Dateigröße).


Antworten

Letztendlich möchten Sie OSM-Daten entweder in eine Datenbank wie PostGIS/PostgreSQL oder als Esri Shapefiles konvertieren. Sie sind ziemlich nah an Standards für diese Art von Sachen. Viele Empfehlungen für Online-Software werden von wissenschaftlicher/datenseitiger Seite kommen. Alle haben Relevanz, aber wenn Sie einen Designhintergrund haben, sollten Sie sich wahrscheinlich das MAPublisher-Plugin für Illustrator ansehen. Ich glaube, viele Kartenillustratoren für NatGeo usw. würden es heutzutage verwenden. Wenn Sie mit Webdesign-Standards vertraut sind, sollten Sie sich die Legacy-Version von Mapbox Studio von Mapbox ansehen. Es hat immer noch eine Lernkurve, aber sobald Sie Ihre Kartendaten darin gespeichert haben, können Sie sie wie CSS gestalten und in Druckauflösungen exportieren. Die neuere Version von Studio ist nur online und bietet fast keine Unterstützung für den Export in Druckauflösungen (mit Schwerpunkt auf Webanwendungen).

Ich würde vorschlagen, sich etwas Zeit zu nehmen, um all die oben genannten Punkte zu recherchieren. Es gibt eine Lernkurve für den professionelleren Weg, und wenn Zeit und Geduld wichtig sind, kann es vielleicht die richtige Wahl sein, eine einfachere (OSM-Standardexport) Wahl zu akzeptieren. Ich warne Sie, dass es leicht zu glauben ist, dass das Exportieren einer Karte als Vektorform wie eps, svg oder ai die beste Lösung zu sein scheint, aber Sie können schnell auf eine Menge Stilkomplexität stoßen, es sei denn, Ihre Karte ist relativ einfach. Schließen Sie es nicht aus, aber seien Sie sich dessen bewusst. GIS-Datenbanken und -Formate wie Shapefiles helfen, indem sie die Anwendung von Stilen basierend auf Regeln und Filtern ermöglichen (ein Konzept, das CSS-Stilen in HTML nicht unähnlich ist). Dies ist unglaublich nützlich für die visuelle Kommunikation von Karten, bei denen Sie eine kohärente visuelle Sprache dessen wünschen, was die Karte darstellt, basierend auf der Wiedergabe ähnlicher Funktionen auf ähnliche Weise.


1 Antwort 1

Overleaf verwendet im Backend einen „normalen Latex-Compiler“ (sie haben kürzlich auf TeX Live 2018 aktualisiert). Das heißt, die Konvertierung Ihrer .tex-Datei in PDF (mit pdflatex oder xelatex oder was auch immer) geschieht auf den Servern von Overleaf. Danach sendet das System das resultierende PDF an Ihren Browser, wo der Frontend-Code pdf.js verwendet, um das PDF in einem HTML-Canvas zu rendern. Ein Teil des Overleaf/ShareLaTeX-Quellcodes ist auf GitHub verfügbar (der ursprüngliche Blogbeitrag von 2014 war unter diesem Link (jetzt umgeleitet)).

Abgesehen von Overleaf, was „Ich möchte eine kompilierte Version eines Latexdokuments […] auf meiner Website zeigen“ geht, besteht eine weitere Möglichkeit darin, DVI (statt PDF) auf dem Server zu erzeugen und dann mit dvisvgm in SVG zu konvertieren .

Der andere mögliche Ansatz besteht darin, den Kompilierungsprozess stattdessen im Browser des Benutzers auszuführen. Ich kenne zwei Projekte, die dies bisher zum Ziel haben, beide sind experimentell und eher langsam:

Es gibt texlive.js (siehe Demo) und xetex.js, die den TeX-Live-Code über Emscripten zu Javascript kompilieren (könnten heute stattdessen auch zu WebAssembly kompilieren).

Es gibt auch Jim Fowlers neueste Arbeit, siehe Demo hier und hier, Quellcode hier/hier/hier und TUGboat-Artikel in Band 40 (2019) Ausgabe 1. Dies kompiliert den WEB/Pascal-Code von TeX mit einem benutzerdefinierten Compiler in WebAssembly und verwendet dann ein benutzerdefinierter DVI-Konverter zum Rendern in HTML.


Geben Sie beispielsweise ein FEN als Eingabe an (sagen wir, wir speichern unser Python-Skript als boardtosvg.py )

Verwenden von Python3 und der Python-Chess-Bibliothek Version 0.30.1

Beispiel FEN: 'rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1'

Befehl zum Ausführen Ihres Skripts vom Terminal aus:

python boardtosvg.py 'rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1'

Gespeicherte Datei (Falls Sie SVGs nicht öffnen können, können Sie zumindest einen Browser wie Chrome verwenden, um die Datei anzuzeigen):


Schritt 4: Daten herunterladen

Vorausgesetzt, es ist genügend Zeit vergangen, hat Repustate einige Daten für uns gefunden und wir können sie über die Social API abrufen:

Die Daten werden als CSV-Datei heruntergeladen. Es bleibt eine Übung für den Leser, die Daten in einem Format zu speichern, das Sie danach abfragen und abrufen können, aber nehmen wir einfach an, dass wir unsere Daten gespeichert haben. In diesem Datendump sind die Breiten- und Längengrade jedes Tweets enthalten. Woher wissen wir, ob dieser Tweet(er) in Toronto ist? Es gibt tatsächlich ein paar Möglichkeiten.

Wir könnten PostGIS verwenden, eine unglaublich erstaunliche Erweiterung für PostgreSQL, mit der Sie alle möglichen interessanten Abfragen mit geografischen Daten durchführen können. Wenn wir diesen Weg gehen würden, könnten wir das Original-Shapefile in eine PostGIS-fähige Datenbank laden und dann für jeden Tweet die ST_Contains-Methode verwenden, um zu überprüfen, welche Tweets sich in Toronto befinden. Eine andere Möglichkeit, dies zu tun, besteht darin, über Ihr Dataset zu iterieren und für jedes einzelne einen schnellen Punkt in der Polygonberechnung in der Sprache Ihrer Wahl durchzuführen. Die Polygondaten können aus der von uns erstellten GeoJSON-Datei abgerufen werden. In jedem Fall ist es nicht allzu schwer zu bestimmen, welche Daten aus Toronto stammen, wenn die angegebenen Breiten-/Längen-Koordinaten gegeben sind.


Bewegungsdaten in GIS extra: Trajektorien-Generalisierungscode und Beispieldaten

Der heutige Beitrag ist ein Follow-up zu Bewegungsdaten in GIS #3: Visualisierung massiver Trajektorien-Datensätze. In diesem Beitrag habe ich ein Konzept zur Trajektorienverallgemeinerung zusammengefasst. Jetzt habe ich die Skripte und Beispieldaten in meinem QGIS-Processing-Tools-Repository auf Github veröffentlicht.

Um die Trajektorien-Generalisierungsskripte zu Ihrer Verarbeitungs-Toolbox hinzuzufügen, können Sie das Tool Skripts aus Dateien hinzufügen verwenden:

Es ist erwähnenswert, dass das Hinzufügen von Skripten aus Dateien potenzielle Hilfedateien für die Skripte nicht korrekt importiert, aber das ist diesmal kein Problem, da ich noch nicht dazu gekommen bin, tatsächlich Hilfedateien zu schreiben.

Die Skripte werden in der folgenden Reihenfolge verwendet:

  1. Extrahieren Sie charakteristische Trajektorienpunkte
  2. Punkte im Raum gruppieren
  3. Berechnen von Flüssen zwischen Zellen aus Trajektorien

Das Beispielprojekt enthält Eingabedaten sowie Ausgabeschichten der einzelnen Werkzeuge. Die einzige erforderliche Eingabe ist ein Trajektorien-Layer, wobei die Trajektorien LINESTRINGM (beachten Sie das M!)-Feature sein müssen:

Trajektorienprobe basierend auf Daten des GeoLife-Projekts

In charakteristische Trajektorienpunkte extrahieren werden Distanzparameter in Metern, Stoppdauer in Sekunden und Winkel in Grad angegeben. Die charakteristischen Punkte enthalten Start- und Endpunkte sowie Abbiege- und Haltepunkte:

Die charakteristischen Punkte werden dann geclustert. In diesem Werkzeug muss der Abstand in Schichteinheiten angegeben werden, die im Fall der Beispieldaten Grad sind.

Schließlich können wir Flüsse zwischen Zellen berechnen, die durch diese Cluster definiert sind:

Flusslinien skaliert nach Flussstärke und Zellzentren skaliert nach Anzahlen

Wenn Sie diese Tools für Ihre eigenen Daten verwenden, würde ich mich freuen, also sehen Sie, was Sie sich einfallen lassen!