Métodos para converter arquivos .SVG em GeoJSON

12

Questão

Como faço para converter um arquivo SVG para o formato GeoJSON?

Resultado desejado:

Eu quero fazer um mapa choropleth usando algo como D3.js, ou qualquer outra biblioteca existente.

Desafio:

Eu tenho um arquivo SVG que pude obter do domínio público das regiões administrativas de uma província em particular de um país em particular. Acredito que preciso convertê-lo em GeoJSON antes de poder usá-lo nas bibliotecas que conheço.

Michael Pell
fonte
2
Quais são as regiões administrativas exatas da província em particular do país em questão? Poderíamos ajudar a encontrar arquivos disponíveis SHP ou GeoJSON em vez de lutar para resolver o problema errado.
precisa saber é o seguinte

Respostas:

5

Acabei de escrever uma biblioteca que converte uma imagem SVG em um GeoJSON (ligeiramente incorreto).

svg2geojson

Ele exige que você edite manualmente seu SVG para adicionar duas tags XML que associam um local SVG a um lat / long e fornece uma ferramenta de linha de comando para converter o arquivo. Se preferir, ele pega todos os grupos de nível superior (como o Illustrator exporta suas camadas) e os exporta como arquivos 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

Limitações

  • Usa uma técnica de un-projeção ingênua / incorreta que pressupõe que uma região retangular da imagem corresponda a uma região retangular lat / long. Por exemplo, em um retângulo de cerca de 1 milha de largura por meia milha de altura perto de São Francisco, a borda inferior é cerca de 10 cm mais longa que a borda superior. Este foi perto o suficiente para as minhas necessidades.

  • Atualmente, não suporta SVG que usa caminhos com comandos quadráticos de Bézier ou arco elíptico. (Estou trabalhando para adicioná-los.)

Phrogz
fonte
A versão de dezembro de 2017 em uma solicitação pull desse repositório também funciona se você precisar / georreferenciar com 3 pontos em vez de 2. Eu ainda tive problemas para entender qual é o caminho das duas versões, e meu polígono resultante foi espelhado de cabeça para baixo. Também seria necessário um pouco mais de trabalho para associar as propriedades do SVG ao GeoJSON. Ansiosos para usar no futuro embora. Obrigado pelo módulo legal.
Thadk
Provavelmente, isso não é o ideal, mas usei o plug-in do georreferenciador QGIS em um PNG convertido do seu SVG para ajudá-lo a fazer uma tabela de pontos e verificar se um deslocamento retangular linear era plausível, embora não tenha certeza de como procurar o pontos no espaço SVG corretamente.
Thadk 30/07/19
Eu examinei a biblioteca. Entendo que a conversão ocorre por meio de uma transformação dos pontos SVG em um retângulo delimitador geocoordenado. Mas isso faz 4 pontos (ie leftLongitude = "0.1617178" topLatitude = "23.4999998" rightLongitude = "15.9990339" bottomLatitude = "11.694295"). As duas tags XML, no total, implicam 8 bits de dados e a documentação do Prognoz me deixou completamente confusa. <p5:GeoItem Longitude="22.1471203091967" Latitude="44.2498454806746" X="0" Y="1" /> Como esses 4 geocoordenados são traduzidos para esse conjunto de dados de 8 itens?
Jerome
4

Existe uma ferramenta de linha de comando da Phrogz mencionada abaixo que eu não fiz check-out:

/gis//a/245085/35596


Para quem vem aqui, a resposta é: "é bastante difícil (pelo menos para um programador experiente, mas cartógrafo inexperiente)". Requer uma compreensão mais do que superficial de como os Sistemas de Referência Espacial (SRS) funcionam. Você precisa mais ou menos codificar geograficamente seu .SVG usando algo como QGIS. Como isso é feito? Ainda não há pista. Mas a resposta é:

"Você não pode simplesmente converter SVG para GeoJSON, pois o SVG está sem as referências geográficas fundamentais."

Se você deseja continuar, comece a pesquisar sobre como georreferenciar um arquivo DXF.

Como calcular parâmetros para a transformação Affine do QGIS?

A resposta de Germán Carrillo é muito útil.

Michael Pell
fonte
1
Talvez essa informação deva ser incluída na pergunta, ou seja, que o arquivo svg não seja georreferenciado. Ou talvez a pergunta deva ser: como posso codificar geograficamente um .SVG usando algo como QGIS?
user55937
O georreferenciamento é possível no formato SVG?
Michael Pell
2
Não sei exatamente. Parece-me que você tem um mapa no formato SVG que está em escala, mas não em um srs. Parece que você precisaria de alguns pontos de controle de solo com coordenadas conhecidas e, em seguida, aplicaria alguma transformação aos dados para georreferenciá-los em algum sistema de coordenadas real. Talvez isso ajude?: Gis.stackexchange.com/questions/33208/… gisforthought.com/…
user55937
1

A ferramenta de linha de comando ogr2ogr deve ser capaz de fazer isso. Algo como:

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

Ambos os formatos são suportados http://www.gdal.org/ogr_formats.html . Se você não estiver familiarizado com ogr2ogr, a maneira mais fácil de fazer o download e instalar é provavelmente através de https://trac.osgeo.org/osgeo4w/ .

user55937
fonte
3
Não é tão simples assim: o driver OGR SVG suporta apenas um tipo especial de SVG criado pelo "Cloudmade Vector Stream Server" e no EPSG: 3857.
AndrewHarvey
1

Você não precisa converter de SVG para GeoJSON para usar a imagem de um choropleth no d3, embora isso possa ser necessário para outras bibliotecas.

As informações do caminho no arquivo SVG (deve haver pelo menos um caminho para cada estado / país / estado / subdivisão no seu mapa) são suficientes para mapear dados para sua imagem SVG em d3.

Deixe-me colocar de outra maneira: se você pode fazer um d3.select no seu svg original que retornará apenas um caminho por estado / país / região, então você pode usar o d3 para criar um coro. Geralmente é o caso quando você tem um mapa no SVG. Na verdade, é mais simples do que usar um arquivo GeoJSON, pois você não precisa se preocupar com a localização do espaço, projeção etc. Você pode até querer ajustar o SVG original para adicionar informações ausentes (como nomes de estado, que você pode adicionar como IDs de DOM ou Classes) antes de usá-lo com D3, mas isso geralmente não é necessário.

Por outro lado, como foi dito antes, os SVG têm apenas informações de caminho / linhas, não geográficas / espaciais, portanto, se você deseja converter de SVG para GeoJSON, precisa adicionar / mapear informações de localização geográfica à sua imagem SVG. Por exemplo, você pode converter primeiro de svg para JSON, depois calcular / adicionar informações de localização geográfica (isso dependerá da região que você está mapeando) e gerar um GeoJSON a partir disso. Até onde eu sei, não existe uma ferramenta pronta para fazer esse trabalho para você.

Roberto Stelling
fonte
0

Eu tentaria fonte o formato vez de SVG para a província que você está procurando. Como os dados são de domínio público, as chances são boas, você pode encontrá-lo. Tente http://www.naturalearthdata.com/ ou faça uma pergunta aqui. Em seguida, converta de Shapefile para GeoJSON ou TopoJSON; MapShaper é seu amigo. A partir deste ponto, o D3 deve estar ao seu alcance (excelente tutorial Vamos criar um mapa )

Matt Wilson
fonte