Suite

Comment rendre un SVG à partir de PostGIS en utilisant ST_AsSVG


En parlant avec un cartographe de National Geographic hier soir, mon intérêt a de nouveau été piqué (à son maximum ?)

Avec la commande PostGIS ST_AsSVG, je ne sais pas comment travailler avec la sortie en tant que fichier SVG. Je peux voir dans d'autres discussions que les SVG peuvent être exportés d'une manière ou d'une autre, mais je ne sais pas comment cela fonctionne exactement.

Cela dit, en supposant qu'il s'agisse peut-être simplement d'orienter la commande pour exporter un fichier SVG statique - serait-il / pourrait-il même être possible pour Inkscape de lire un SVG directement à partir de PostGIS ?


La fonction Postgis ST_AsSVG convertit simplement les géométries en leurs équivalents point ou chemin SVG, et ne vous permet pas d'ajouter directement des attributs/styles. Par exemple, une requête avec un point, une chaîne de ligne et un polygone :

AVEC des formes (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) ) SELECTIONNER ST_AsSVG(geom) à partir des formes ;

Retour:

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

qui est un point, une ligne non fermée et une ligne fermée, c'est-à-dire un polygone. M signifie aller vers, L signifie ligne vers et Z signifie fermer. Il existe d'autres types de géométrie dans SVG, mais c'est ce que renvoie ST_AsSVG (voir la documentation pour la version Multi de celui-ci).

En soi, cela n'est pas très utile, car vous manquez lebalises de cheminet toute information de style, dont un exemple complet ressemblerait à :

 

Voir le didacticiel SVG de w3schools pour plus d'informations.

Ainsi, si vous souhaitez réellement créer un SVG valide à l'aide d'une requête Postgis, vous devrez ajouter des balises de chemin et un formatage de couleur, de ligne, de remplissage, etc. Ceci peut être accompli en utilisant leopérateur de concatet undéclaration de caspour définir le formatage. Par example,

AVEC des formes (géométrie, 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) ) SELECT concat( '') À PARTIR de formes ;

qui renvoie :

 

Enfin, si vous enveloppez tout cela dansarray_to_stringetarray_agg, et ajoutez l'en-tête et le pied de page, c'est-à-dire leet, vous vous retrouverez avec un bloc de SVG représentant toutes vos géométries, par exemple,

AVEC des formes (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) ), chemins (svg) as ( SELECT concat( '') FROM formes ) SELECT concat( '', array_to_string(array_agg(svg),"), '') FROM chemins;

qui renvoie maintenant l'enregistrement unique :

TL;DR, autres options

À quel point vous pensez probablement, TL; DR, et c'est vrai que c'est beaucoup de travail, et les déclarations de cas pour faire la couleur du trait, la largeur, etc., pourraient devenir très longues et difficiles à manier.

Il existe d'autres options. Géoserveur (avec une source de données Postgis/vectorielle) prend en charge SVG comme format de sortie et vous pouvez utiliser des SLD ou CartoCSS dans Geoserver pour les styliser, puis demandez simplement un WMS avec SVG comme format de sortie et vous avez terminé. Comme @Scro l'a également dit, vous pouvez utiliser des outils tels que Moulin à tuiles faire le coiffage à votre place (non testé). Donc, après une très longue réponse, je suggère essentiellement que vous ne devriez pas utiliser ST_AsSVG directement pour autre chose que des SVG très rapides et sales.


Si vous êtes prêt à exporter des données depuis QGIS plutôt que depuis PostGIS, vous pouvez utiliser le plugin Simple SVG. Ce plugin exportera les couches actives depuis QGIS, en essayant de maintenir la symbologie. Je l'ai utilisé avec un assez bon succès. De plus, vous pouvez utiliser QGIS composer pour démarrer vos cartes et utiliser leur fonction d'exportation SVG. Ce n'est pas la même chose que la requête PostGIS, mais si l'objectif est d'obtenir des données de QGIS vers Inkscape, cela fonctionnera.


Grâce à quelques tâtonnements très maladroits, je suis tombé sur une solution plus complète (/généralisée) qui, je l'espère, pourrait être utile aux autres voyageurs à la recherche de Google / Ce site.

AVEC requête AS (SELECT wkb_geometry AS géométrie FROM districts ), 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( géométrie)) comme y_max, ARRAY_TO_STRING(ARRAY_AGG(CONCAT('')),") as svg FROM query ) SELECT CONCAT('', q.svg, '') DE q

Déposez votre requête à l'intérieur de ce premierrequête AS (… )CTE, et Bob est ton oncle.


L'image SVG href est rendue entièrement noire

J'essaie de récupérer un SVG à partir d'un outil de navigation ( pgadmin4 ). Cependant, je me retrouve avec un SVG qui ne s'affiche pas correctement. Le graphique généré utilise des "icônes" SVG en référençant des fichiers externes. Bien que cela fonctionne bien dans le navigateur, tous les pixels colorés de ces SVG intégrés sont rendus 100% noirs. (Après avoir corrigé les liens pour pointer vers les bons fichiers. Comme on peut le voir, les formes sont correctes).

Voici l'image du navigateur :

Et voici ce que j'obtiens dans inkscape :


1 réponse 1

J'ai résolu ce problème ici http://jsfiddle.net/fktGL/1/, j'ai d'abord dû changer l'attribut svg de

car le svg n'était pas en cours de validation sur le service de validation du W3C et voici un stackoverflow expliquant qu'un changement est nécessaire.

J'ai ensuite dû ajouter des délais d'attente pour permettre au SVG de s'afficher correctement. Je comprends que c'est parce que l'image a été dessinée dans le canevas SVG &, mais les deux ont besoin de temps pour rendre l'image. Ma solution ne fonctionne pas parfaitement sur les appareils plus lents (une augmentation des délais d'attente aiderait), mais je ne connais pas d'autre moyen de contourner ce problème (bienvenue tout commentaire/amélioration).


C'est par conception de notre point de vue -- c'est comme utiliser une image .png dans les premières versions d'Internet Explorer, avant que le navigateur ne supporte encore ce format d'image.

Ainsi, lorsque vous créez un lien vers .svg en tant que <img>, sachez que vous limitez l'audience, car tous les navigateurs ne peuvent pas afficher ce contenu.

Je suggère de les convertir en fichiers image .png plus simples. Je l'ai fait pour le poste en question.

Il fonctionne dans les navigateurs prenant en charge SVG dans une balise IMG comme Chrome. Firefox a besoin que SVG soit dans une balise OBJECT. IE ne prend pas en charge SVG. Consultez http://en.wikipedia.org/wiki/Scalable_Vector_Graphics#Support_for_SVG_in_web_browsers pour référence.

SVG ressemble plus à un flash qu'à une image. La prise en charge dans les navigateurs s'est toujours faite via des plugins plutôt que d'essayer de l'utiliser directement comme image.

Google est parti seul sur celui-ci dans Chrome et il a donc été inclus dans HTML5. Cependant, ce n'est pas encore une norme.

Donc, en gros, n'utilisez pas d'images SVG encore

En ce qui concerne la confusion avec les visiteurs, je pense qu'il est rare qu'ils se retrouvent avec une image SVG à télécharger à moins qu'ils ne l'aient fait, auquel cas ils devraient savoir qu'il est nécessaire d'en faire un png pour une utilisation Web pour le moment.


5.1. Types de données PostGIS Géométrie/Géographie/Box

Cette section répertorie les types de données PostgreSQL personnalisés installés par PostGIS pour représenter les données spatiales.

Chaque type de données décrit son comportement de transtypage. Un transtypage de type convertit les valeurs d'un type de données en un autre type. PostgreSQL permet de définir le comportement de transtypage pour les types personnalisés, ainsi que les fonctions utilisées pour convertir les valeurs de type. Les moulages peuvent avoir automatique comportement, qui permet la conversion automatique d'un argument de fonction en un type pris en charge par la fonction.

Certains moulages ont explicite comportement, ce qui signifie que le transtypage doit être spécifié à l'aide de la syntaxe CAST(myval As sometype) ou myval::sometype . La conversion explicite évite le problème des conversions ambiguës, qui peuvent se produire lors de l'utilisation d'une fonction surchargée qui ne prend pas en charge un type donné. Par exemple, une fonction peut accepter un box2d ou un box3d, mais pas une géométrie. Étant donné que la géométrie a une conversion automatique dans les deux types de boîtes, cela produit une erreur de "fonction ambiguë". Pour éviter l'erreur, utilisez un transtypage explicite vers le type de boîte souhaité.

Tous les types de données peuvent être convertis en text , il n'est donc pas nécessaire de le spécifier explicitement.


Simplifier les fonctionnalités de la carte

Pour réduire la taille du fichier de votre SVG, Kartograph prend en charge la simplification préservant la topologie. L'algorithme par défaut est la simplification Visvalingam-Whyatt, qui a bien été expliquée par Mike Bostock.

Cependant, Kartograph inclut également deux autres algorithmes ( douglas-peucker et distance ) que vous pouvez utiliser en fournissant le dictionnaire suivant :

La signification de la tolérance varie entre les différents algorithmes, mais en général, plus la tolérance est élevée, plus la simplification est forte (et plus la taille du fichier est petite).


Répondre

En fin de compte, vous chercherez à convertir les données OSM en une base de données comme PostGIS/PostgreSQL ou en Esri Shapefiles . Ils sont assez proches des standards pour ce genre de choses. De nombreuses recommandations pour les logiciels en ligne viendront du côté scientifique/données. Il y a de la pertinence dans tout, mais si vous venez d'un milieu de conception, vous voudrez probablement regarder le plugin MAPublisher pour illustrateur. Je crois que beaucoup d'illustrateurs de cartes pour NatGeo, etc. l'utiliseraient de nos jours. Si vous êtes familiarisé avec les normes de conception Web, vous voudrez peut-être consulter la version héritée de Mapbox de Mapbox Studio. Il a encore une courbe d'apprentissage, mais une fois que vous avez vos données cartographiques, vous pouvez le styler comme CSS et exporter à des résolutions d'impression. C'est une version plus récente de Studio est en ligne uniquement et a presque abandonné la prise en charge de l'exportation à des résolutions d'impression (en se concentrant sur les utilisations Web).

Je suggère de mettre de côté un peu de temps pour rechercher tout ce qui précède. Il y a une courbe d'apprentissage vers la voie plus professionnelle pour le faire et, si le temps et la patience sont importants, peut-être qu'accepter un choix plus simple (exportation standard OSM) peut être le bon. Je vous préviens qu'il est facile de croire qu'exporter une carte en tant que forme vectorielle comme eps, svg ou ai peut sembler être la meilleure solution, mais vous pouvez rapidement vous heurter à une complexité de style à moins que votre carte ne soit relativement simple. Ne l'excluez pas, mais soyez simplement conscient de cela. Les bases de données SIG et les formats tels que les fichiers de formes aident en permettant aux styles d'être appliqués en fonction de règles et de filtres (un concept similaire aux styles CSS en html). Ceci est incroyablement utile pour communiquer visuellement des cartes où vous voudrez un langage visuel cohérent de ce que la carte représente en fonction du rendu d'entités similaires d'une manière similaire.


1 réponse 1

Overleaf utilise un "compilateur latex normal" (ils ont récemment mis à niveau vers TeX Live 2018) sur le backend. C'est-à-dire que la conversion de votre fichier .tex en PDF (en utilisant pdflatex ou xelatex ou autre) se produit sur les serveurs d'Overleaf. Après cela, le système envoie le PDF résultant à votre navigateur, où leur code frontal utilise pdf.js pour restituer le PDF dans un canevas HTML. Une partie du code source Overleaf/ShareLaTeX est disponible sur GitHub (le billet de blog original de 2014 était sur ce lien (maintenant redirigé)).

Outre Overleaf, en ce qui concerne « Je souhaite afficher une version compilée d'un document en latex […] sur mon site Web », une autre option consiste à produire du DVI (au lieu de PDF) sur le serveur, puis de le convertir en SVG à l'aide de dvisvgm .

L'autre approche possible consiste à exécuter le processus de compilation dans le navigateur de l'utilisateur à la place. Je connais deux projets qui visent à le faire jusqu'à présent, tous deux expérimentaux et plutôt lents :

Il existe texlive.js (voir démo) et xetex.js, qui compilent le code TeX Live en Javascript via Emscripten (pourrait également compiler vers WebAssembly à la place ces jours-ci).

Il y a aussi le travail récent de Jim Fowler voir la démo ici et ici, le code source ici/ici/ici, et l'article TUGboat dans Vol 40 (2019) Issue 1. Cela compile le code WEB/Pascal de TeX à l'aide d'un compilateur personnalisé dans WebAssembly, puis utilise un convertisseur DVI personnalisé pour le rendu en HTML.


Par exemple, étant donné un FEN en entrée (disons que nous sauvegardons notre script python sous le nom boardtosvg.py )

Utilisation de python3 et de la bibliothèque python-chess version 0.30.1

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

Commande pour exécuter votre script depuis le terminal :

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

Fichier enregistré (si vous ne pouvez pas ouvrir les SVG, vous pouvez au moins utiliser un navigateur tel que Chrome pour afficher le fichier):


Étape 4 : Téléchargez les données

En supposant que suffisamment de temps se soit écoulé, Repustate aura trouvé des données pour nous et nous pourrons les récupérer via l'API sociale :

Les données se présentent sous forme de CSV. Cela reste un exercice pour le lecteur de stocker les données dans un format que vous pouvez interroger et récupérer par la suite, mais supposons simplement que nous avons stocké nos données. La latitude et la longitude de chaque tweet(er) seront incluses dans ce vidage de données. Comment savons-nous si ce tweet(er) est à Toronto? Il y a plusieurs façons en fait.

Nous pourrions utiliser PostGIS, une extension incroyablement étonnante pour PostgreSQL qui vous permet de faire toutes sortes de requêtes intéressantes avec des données géographiques. Si nous empruntions cette voie, nous pourrions charger le fichier de formes d'origine dans une base de données compatible PostGIS, puis pour chaque tweet, utiliser la méthode ST_Contains pour vérifier quel(s) tweet(s) se trouvent à Toronto. Une autre façon de procéder consiste à parcourir votre ensemble de données et pour chacun, faites un point rapide dans le calcul du polygone dans la langue de votre choix. Les données de polygone peuvent être récupérées à partir du fichier GeoJSON que nous avons créé. Dans tous les cas, il n'est pas trop difficile de déterminer quelles données proviennent de Toronto, compte tenu des coordonnées lat/long spécifiées.


Données de mouvement en extra SIG : code de généralisation de trajectoire et exemples de données

Le post d'aujourd'hui est un suivi des données de mouvement dans le SIG n ° 3: visualisation d'ensembles de données de trajectoire massifs. Dans cet article, j'ai résumé un concept de généralisation de trajectoire. Maintenant, j'ai publié les scripts et les exemples de données dans mon référentiel QGIS-Processing-tools sur Github.

Pour ajouter les scripts de généralisation de trajectoire à votre boîte à outils de traitement, vous pouvez utiliser l'outil Ajouter des scripts à partir de fichiers :

Il convient de noter que l'ajout de scripts à partir de fichiers ne parvient pas à importer correctement les fichiers d'aide potentiels pour les scripts, mais ce n'est pas un problème cette fois-ci, car je n'ai pas encore écrit les fichiers d'aide.

Les scripts sont utilisés dans l'ordre suivant :

  1. Extraire des points de trajectoire caractéristiques
  2. Regrouper des points dans l'espace
  3. Calculer les flux entre les cellules à partir de trajectoires

L'exemple de projet contient des données d'entrée, ainsi que des couches de sortie des outils individuels. La seule entrée requise est une couche de trajectoires, où les trajectoires doivent être des caractéristiques LINESTRINGM (notez le M!):

Échantillon de trajectoire basé sur les données fournies par le projet GeoLife

Dans Extraire les points de trajectoire caractéristiques, les paramètres de distance sont spécifiés en mètres, la durée d'arrêt en secondes et les angles en degrés. Les points caractéristiques contiennent des emplacements de début et de fin, ainsi que des emplacements de virage et d'arrêt :

Les points caractéristiques sont ensuite regroupés. Dans cet outil, la distance doit être spécifiée en unités de couche, qui sont des degrés dans le cas des données d'échantillon.

Enfin, nous pouvons calculer les flux entre les cellules définies par ces clusters :

Lignes d'écoulement mises à l'échelle par force d'écoulement et centres de cellules mis à l'échelle par nombres

Si vous utilisez ces outils sur vos propres données, j'en serais heureux, alors voyez ce que vous proposez !