Métodos para convertir archivos .SVG a GeoJSON

12

Pregunta

¿Cómo convierto un archivo SVG al formato GeoJSON?

Resultado deseado:

Quiero hacer un mapa coroplético usando algo como D3.js, o cualquiera de las otras bibliotecas disponibles.

Desafío:

Tengo un archivo SVG que pude obtener del dominio público de las regiones administrativas para una provincia en particular de un país en particular. Creo que necesito convertir eso a GeoJSON antes de poder usarlo en las bibliotecas que conozco.

Michael Pell
fuente
2
¿Cuáles son exactamente las regiones administrativas de la provincia particular del país en particular? Podríamos ayudar a encontrar los archivos SHP o GeoJSON disponibles en lugar de luchar para resolver el problema incorrecto.
ThomasG77

Respuestas:

5

Acabo de escribir una biblioteca que convierte una imagen SVG en un GeoJSON (ligeramente incorrecto).

svg2geojson

Requiere que edite manualmente su SVG para agregar dos etiquetas XML que asocian una ubicación SVG con un lat / long, y proporciona una herramienta de línea de comandos para convertir el archivo. Incluso, si lo desea, tomará todos los grupos de nivel superior (que es a lo que Illustrator exporta sus capas) y los exportará como archivos separados.

Uso

# 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

Limitaciones

  • Utiliza una técnica de no proyección ingenua / incorrecta que asume que una región rectangular de la imagen corresponde a una región rectangular larga / larga. Por ejemplo, en un rectángulo de aproximadamente 1 milla de ancho por media milla de alto cerca de San Francisco, el borde inferior es aproximadamente 4 pulgadas más largo que el borde superior. Esto fue lo suficientemente cerca para mis necesidades.

  • Actualmente no es compatible con SVG que utiliza rutas con Bézier cuadrático o comandos de arco elíptico. (Estoy trabajando en agregar estos).

Phrogz
fuente
La versión de diciembre de 2017 en una solicitud de extracción de ese repositorio también funciona si desea / necesita georreferenciar con 3 puntos en lugar de 2. Todavía tuve problemas para entender qué lado está con ambas versiones, y mi polígono resultante se reflejó al revés. También habría tomado un poco más de trabajo unir las propiedades del SVG al GeoJSON. Sin embargo, espero usarlo en el futuro. Gracias por el módulo genial.
thadk
Probablemente esto no sea ideal, pero utilicé el complemento de georreferenciación QGIS en un PNG convertido de su SVG para ayudarlo a hacer una tabla de puntos y verificar si un desplazamiento rectangular lineal era incluso plausible, aunque no estoy seguro de cómo buscar el puntos en el espacio SVG correctamente.
thadk
He examinado la biblioteca. Entiendo que la conversión se produce a través de una transformación de los puntos SVG dentro de un rectángulo delimitador geocoordinado. Pero eso suma 4 puntos (es decir, leftLongitude = "0.1617178" topLatitude = "23.4999998" rightLongitude = "15.9990339" bottomLatitude = "11.694295"). Las dos etiquetas XML, en general, implican 8 bits de datos y la documentación para Prognoz me tiene completamente confundido. <p5:GeoItem Longitude="22.1471203091967" Latitude="44.2498454806746" X="0" Y="1" /> ¿Cómo pueden traducirse esas 4 geocoordenadas en este conjunto de datos de 8 elementos?
Jerome
4

Hay una herramienta de línea de comandos de Phrogz mencionada a continuación que no he revisado:

/gis//a/245085/35596


Para cualquiera que venga aquí, la respuesta es: "es bastante difícil (al menos para un programador experimentado pero cartógrafo inexperto)". Requiere una comprensión más que superficial de cómo funcionan los sistemas de referencia espacial (SRS). Más o menos necesita geocodificar su .SVG usando algo como QGIS. ¿Cómo se hace eso? Todavía no tengo idea. Pero la respuesta es:

"No puede simplemente convertir SVG a GeoJSON, ya que a SVG le faltan las referencias geográficas fundamentales".

Si desea continuar, comience a buscar cómo georreferenciar un archivo DXF.

¿Cómo calcular los parámetros para la transformación QGIS Affine?

La respuesta de Germán Carrillo allí es muy útil.

Michael Pell
fuente
1
Tal vez esta información debería incluirse en la pregunta, es decir, que el archivo svg no está georreferenciado. O tal vez la pregunta debería ser: ¿cómo puedo geocodificar un .SVG usando algo como QGIS?
user55937
¿Es posible la georreferenciación en el formato SVG?
Michael Pell
2
No lo se exactamente. Me parece que tiene un mapa en formato SVG que está a escala pero no en una srs. Por lo tanto, parece que necesitaría algunos puntos de control del suelo con coordenadas conocidas, y luego aplicar alguna transformación a los datos para georreferenciarlos en algún sistema de coordenadas real. ¿Quizás esto ayude ?: gis.stackexchange.com/questions/33208/… gisforthought.com/…
user55937
1

La herramienta de línea de comandos ogr2ogr debería poder hacerlo. Algo como:

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

Ambos formatos son compatibles con http://www.gdal.org/ogr_formats.html . Si no está familiarizado con ogr2ogr, la forma más fácil de descargarlo e instalarlo es probablemente a través de https://trac.osgeo.org/osgeo4w/ .

usuario55937
fuente
3
No es tan sencillo, el controlador OGR SVG solo admite un tipo especial de SVG creado por el "Cloudmade Vector Stream Server" y en EPSG: 3857.
AndrewHarvey
1

No necesita convertir de SVG a GeoJSON para usar la imagen para un coropthth en d3, aunque puede ser necesario para otras bibliotecas.

La información de ruta en el archivo SVG (debe haber al menos una ruta para cada estado / país / estado / subdivisión en su mapa) es suficiente para asignar datos a su imagen SVG en d3.

Permítanme decirlo de otra manera: si puede hacer un d3.select en su svg original que devolverá solo una ruta por estado / país / región, entonces puede usar d3 para construir un coropleth. Este suele ser el caso cuando tiene un mapa en SVG. En realidad, es más simple que usar un archivo GeoJSON, ya que no necesita preocuparse por la ubicación del espacio, la proyección, etc. Es posible que incluso desee modificar el SVG original para agregar información faltante (como nombres de estado, que puede agregar como ID de DOM o Clases) antes de usarlo con D3, pero eso generalmente no es necesario.

Por otro lado, como se dijo antes, SVG solo tiene información de ruta / líneas, no información geográfica / espacial, por lo que si desea convertir de SVG a GeoJSON, entonces necesita AGREGAR / MAP información de geolocalización a su imagen SVG. Por ejemplo, primero puede convertir de svg a JSON, luego calcular / agregar información de geolocalización (esto dependerá de la región que esté mapeando) y generar un GeoJSON a partir de eso. Sin embargo, hasta donde sé, no existe una herramienta lista para usar que haga este trabajo por usted.

Roberto Stelling
fuente
0

Intentaría obtener el formato de forma en lugar de SVG para la provincia que está buscando. Dado que los datos son de dominio público, es muy probable que pueda encontrarlos. Pruebe http://www.naturalearthdata.com/ o haga una pregunta aquí. Luego convierta de Shapefile a GeoJSON o TopoJSON; MapShaper es tu amigo. Desde este punto, D3 debería estar al alcance (excelente tutorial Hagamos un mapa )

wilkie mate
fuente