Méthodes pour convertir un fichier .SVG en GeoJSON

12

Question

Comment convertir un fichier SVG au format GeoJSON?

Résultat souhaité:

Je veux créer une carte choroplèth en utilisant quelque chose comme D3.js, ou n'importe quelle autre bibliothèque.

Défi:

J'ai un fichier SVG que j'ai pu obtenir du domaine public des régions administratives pour une province particulière d'un pays particulier. Je crois que je dois le convertir en GeoJSON avant de pouvoir l'utiliser dans les bibliothèques que je connais.

Michael Pell
la source
2
Quelles sont les régions administratives exactes de la province du pays concerné? Nous pourrions vous aider à trouver les fichiers disponibles SHP ou GeoJSON au lieu de vous battre pour résoudre le mauvais problème.
ThomasG77

Réponses:

5

Je viens d'écrire une bibliothèque qui convertit une image SVG en un GeoJSON (légèrement incorrect).

svg2geojson

Il nécessite que vous modifiez manuellement votre SVG pour ajouter deux balises XML qui associent un emplacement SVG à un lat / long, et il fournit un outil en ligne de commande pour convertir le fichier. Il prendra même, si vous le souhaitez, tous les groupes de niveau supérieur (c'est ainsi qu'Illustrator exporte ses calques) et les exportera en tant que fichiers séparés.

Usage

# First, install Node.js

$ npm install svg2geojson -g  # install globally for easy access to executable

$ svg2geojson -h
Usage: svg2geojson [options] file.svg

Options:
 -t, --tolerance=0.1 Distance (world meters) to sample curves to. (default: 0.1)
 -l, --layers        Split top-level groups into separate files. (default: one file)
 -o, --stdout        Output GeoJSON to stdout. (default: write files with names based on the SVG/layer)
 -m, --minimal       Make the GeoJSON as small as possible (not pretty).
 -p, --precision     Number of decimal places to format JSON numbers to. (default:6, as GeoJSON recommends)
 -d, --debug         Include ids for each SVG element in the features. (default: no properties)
 -v, --version       Output the version of svg2geojson as the first line on stdout (0.7.0).
 -h, --help          Show this help message.

$ svg2geojson my.svg
Wrote my.geojson

Limites

  • Utilise une technique de non-projection naïve / incorrecte qui suppose qu'une région rectangulaire de l'image correspond à une région rectangulaire lat / longue. Par exemple, sur un rectangle d'environ 1 mile de large par un demi-mile de haut près de San Francisco, le bord inférieur est environ 4 pouces plus long que le bord supérieur. C'était assez proche de mes besoins.

  • Actuellement, ne prend pas en charge SVG qui utilise des chemins avec des commandes quadratiques de Bézier ou d'arc elliptique. (Je travaille sur l'ajout de ceux-ci.)

Phrogz
la source
La version de décembre 2017 dans une demande de tirage de ce référentiel fonctionne également si vous voulez / devez géoréférencer avec 3 points au lieu de 2. J'ai toujours eu du mal à comprendre dans quelle direction se trouve les deux versions, et mon polygone résultant a été mis en miroir à l'envers. Il aurait également fallu un peu plus de travail pour joindre les propriétés du SVG dans le GeoJSON. Attendez-vous à l'utiliser à l'avenir. Merci pour le module cool.
Thadk
Ce n'est probablement pas idéal, mais j'ai utilisé le plugin de géoréférencement QGIS sur un PNG converti de votre SVG pour vous aider à créer un tableau de points et vérifier si un décalage rectangulaire linéaire était même plausible, bien que je ne sois pas sûr de savoir comment rechercher le points dans l'espace SVG correctement.
Thadk
J'ai examiné la bibliothèque. Je comprends que la conversion se produit via une transformation des points SVG dans un rectangle englobant géocoordonné. Mais cela fait 4 points (ie leftLongitude = "0.1617178" topLatitude = "23.4999998" rightLongitude = "15.9990339" bottomLatitude = "11.694295"). Les deux balises XML impliquent au total 8 bits de données et la documentation pour Prognoz m'a complètement confondu <p5:GeoItem Longitude="22.1471203091967" Latitude="44.2498454806746" X="0" Y="1" /> Comment ces 4 coordonnées géographiques peuvent-elles être traduites dans cet ensemble de données de 8 éléments?
Jérôme
4

Il y a un outil en ligne de commande par Phrogz mentionné ci-dessous que je n'ai pas vérifié:

/gis//a/245085/35596


Pour quiconque vient ici, la réponse est: "c'est assez difficile (au moins pour un programmeur expérimenté mais un cartographe inexpérimenté)". Cela nécessite une compréhension plus que superficielle du fonctionnement des systèmes de référence spatiale (SRS). Vous avez plus ou moins besoin de géocoder votre .SVG en utilisant quelque chose comme QGIS. Comment cela se fait-il? Toujours aucun indice. Mais la réponse est:

"Vous ne pouvez pas simplement convertir SVG en GeoJSON, car SVG manque les références géographiques fondamentales."

Si vous souhaitez continuer, commencez à rechercher comment géoréférencer un fichier DXF.

Comment calculer les paramètres de la transformation QGIS Affine?

La réponse de Germán Carrillo y est très utile.

Michael Pell
la source
1
Peut-être que ces informations devraient être incluses dans la question, c'est-à-dire que le fichier svg n'est pas géoréférencé. Ou peut-être que la question devrait être: comment puis-je géocoder un .SVG en utilisant quelque chose comme QGIS?
user55937
Le géoréférencement est-il possible au format SVG?
Michael Pell
2
Je ne sais pas exactement. Il me semble que vous avez une carte au format SVG qui est à l'échelle mais pas en srs. Il semble donc que vous auriez besoin de points de contrôle au sol avec des coordonnées connues, puis d'appliquer une transformation aux données pour les géoréférencer dans un système de coordonnées réel. Peut-être que cela vous aidera?: Gis.stackexchange.com/questions/33208/… gisforthought.com/…
user55937
1

L'outil de ligne de commande ogr2ogr devrait pouvoir le faire. Quelque chose comme:

ogr2ogr -f "GeoJSON" dst.json src.svg

Ces deux formats sont pris en charge http://www.gdal.org/ogr_formats.html . Si vous n'êtes pas familier avec ogr2ogr, le moyen le plus simple de le télécharger et de l'installer est probablement via https://trac.osgeo.org/osgeo4w/ .

user55937
la source
3
Ce n'est pas si simple, le pilote OGR SVG prend uniquement en charge un type spécial de SVG créé par le "Cloudmade Vector Stream Server" et dans EPSG: 3857.
AndrewHarvey
1

Vous n'avez pas besoin de convertir de SVG en GeoJSON pour utiliser l'image pour un choroplèth en d3, bien que cela puisse être nécessaire pour d'autres bibliothèques.

Les informations de chemin sur le fichier SVG (il doit y avoir au moins un chemin pour chaque état / pays / état / subdivision dans votre carte) sont suffisantes pour mapper les données à votre image SVG en d3.

Permettez-moi de le dire d'une autre manière: si vous pouvez faire un d3.select sur votre svg d'origine qui ne renverra qu'un seul chemin par état / pays / région, alors vous pouvez utiliser d3 pour construire un choroplèth. C'est généralement le cas lorsque vous avez une carte en SVG. C'est en fait plus simple que d'utiliser un fichier GeoJSON car vous n'avez pas à vous soucier de l'emplacement de l'espace, de la projection, etc. Avant de l'utiliser avec D3, mais ce n'est généralement pas nécessaire.

D'un autre côté, comme cela a été dit précédemment, les SVG ont juste des informations de chemin / lignes, pas des informations géographiques / spatiales, donc si vous voulez convertir de SVG en GeoJSON alors vous devez AJOUTER / MAP des informations de géolocalisation à votre image SVG. Par exemple, vous pouvez d'abord convertir de svg en JSON, puis calculer / ajouter des informations de géolocalisation (cela dépendra de la région que vous mappez) et générer un GeoJSON à partir de cela. Pour autant que je sache, il n'y a pas d'outil prêt à l'emploi pour faire ce travail pour vous.

Roberto Stelling
la source
0

J'essaierais de source le format au lieu de SVG pour la province que vous recherchez. Comme les données sont du domaine public, les chances sont bonnes, vous pouvez les trouver. Essayez http://www.naturalearthdata.com/ ou posez une question ici. Convertissez ensuite de Shapefile en GeoJSON ou TopoJSON; MapShaper est votre ami. A partir de là, D3 devrait être à portée de main (excellent tutoriel Créons une carte )

Matt Wilkie
la source