Suite

Méthodes pour convertir un fichier .SVG en GeoJSON


Question

Comment convertir un fichier SVG au format GeoJSON ?

Résultat souhaité:

Je souhaite créer une carte choroplèthe en utilisant quelque chose comme D3.js ou l'une des autres bibliothèques disponibles.

Défi:

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


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

Svg2geojson

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

Usage

# Tout d'abord, installez Node.js $ npm install svg2geojson -g # installez globalement pour un accès facile à l'exécutable $ svg2geojson -h Utilisation : svg2geojson [options] file.svg Options : -t, --tolerance=0.1 Distance (mètres mondiaux) à échantillons de courbes à. (par défaut : 0.1) -l, --layers Divise les groupes de niveau supérieur en fichiers séparés. (par défaut : un fichier) -o, --stdout Sortir GeoJSON sur stdout. (par défaut : écrire des fichiers avec des noms basés sur le SVG/couche) -m, --minimal Rendre le GeoJSON aussi petit que possible (pas joli). -p, --precision Nombre de décimales pour formater les nombres JSON. (par défaut : 6, comme le recommande GeoJSON) -d, --debug Inclure les identifiants pour chaque élément SVG dans les fonctionnalités. (par défaut : aucune propriété) -v, --version Affiche la version de svg2geojson comme première ligne sur stdout (0.7.0). -h, --help Affiche ce message d'aide. $ svg2geojson my.svg A écrit 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 lat/long rectangulaire. Par exemple, sur un rectangle d'environ 1 mile de large sur 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.

  • Ne prend actuellement pas en charge SVG qui utilise des chemins avec des commandes de Bézier quadratique ou d'arc elliptique. (Je travaille à les ajouter.)


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

https://gis.stackexchange.com/a/245085/35596


A tous ceux qui viennent ici, la réponse est : "c'est assez difficile (du moins pour un programmeur expérimenté mais cartographe inexpérimenté)." Cela nécessite une compréhension plus que superficielle du fonctionnement des systèmes de référence spatiale (SRS). Vous devez plus ou moins géocoder votre .SVG en utilisant quelque chose comme QGIS. Comment ça se fait ? Toujours aucune idée. Mais la réponse est :

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

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

Comment calculer les paramètres pour la transformation affine QGIS ?

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


Vous n'avez pas besoin de convertir de SVG en GeoJSON pour utiliser l'image pour un choroplèthe dans 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 dans d3.

Permettez-moi de le dire autrement : si vous pouvez faire un d3.select sur votre svg d'origine qui ne renverra qu'un seul chemin par état/pays/région, vous pouvez utiliser d3 pour créer un choroplèthe. 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. Classes) avant de l'utiliser avec D3, mais ce n'est généralement pas nécessaire.

D'un autre côté, comme il a été dit précédemment, SVG n'a que des informations de chemin/lignes, pas d'informations géographiques/spatiales, donc si vous voulez convertir de SVG en GeoJSON, 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 cartographiez) 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.


J'essaierais de rechercher le format de fichier de formes au lieu de SVG pour la province que vous recherchez. Étant donné que les données sont du domaine public, les chances sont bonnes que vous puissiez les trouver. Essayez http://www.naturalearthdata.com/ ou posez une question ici. Convertissez ensuite de Shapefile en GeoJSON ou TopoJSON ; MapShaper est votre ami. À partir de ce point, D3 devrait être à portée de main (excellent tutoriel Let's Make a Map)