O que este visualizador faz
TopoJSON é um parente compacto do GeoJSON. Ele guarda cada fronteira compartilhada uma única vez e costuma escrever as coordenadas como números inteiros pequenos. Isso deixa os arquivos muito menores, e é por isso que mapas em D3.js, mapas eleitorais e muitos projetos de jornalismo de dados usam o formato. A desvantagem é que não dá para ler um arquivo TopoJSON a olho nu, e muitas ferramentas GIS e mapas web não conseguem abri-lo sem convertê-lo antes.
Este visualizador abre o arquivo diretamente. Arraste um arquivo .topojson ou .json para o mapa, e ele confere se é mesmo uma topologia, reconstrói cada forma a partir dos seus arcos e desenha cada objeto nomeado como uma camada separada, com cor própria. A barra lateral mostra quantos objetos, feições e arcos o arquivo tem, se ele é quantizado e quão fina é a sua grade, e quanto maiores seriam os mesmos dados em GeoJSON comum. Clique em uma feição para ler seus atributos, incluindo o id do TopoJSON.
Adicionei um recurso que você não encontra em um visualizador de GeoJSON comum: "Highlight shared borders". Ele desenha só os arcos que duas feições diferentes compartilham, direto da topologia. É o jeito mais rápido de conferir se um mapa de países, municípios ou distritos eleitorais tem mesmo fronteiras compartilhadas limpas, sem vãos nem sobreposições. Quando precisar dos dados em outra ferramenta, baixe um objeto ou todos como GeoJSON. Nada é enviado: o arquivo nunca sai do seu computador.
TopoJSON e GeoJSON comparados
Os dois formatos são JSON, e os dois descrevem pontos, linhas e polígonos com atributos. A diferença está na forma de guardar as coordenadas.
| Aspecto | TopoJSON | GeoJSON |
|---|---|---|
| Fronteiras compartilhadas | Guardadas uma vez como arco e referenciadas por cada forma que as usa | Guardadas de novo em cada polígono que as toca |
| Coordenadas | Em geral inteiros quantizados, escritos como pequenas diferenças (deltas) | Longitude e latitude decimais completas em cada vértice |
| Tamanho do arquivo | Muitas vezes bem menor para polígonos que se tocam | Maior, mas simples de ler |
| Camadas | Vários objetos nomeados em um arquivo | Uma FeatureCollection por arquivo |
| Topologia | Sabe quais formas são vizinhas, então as fronteiras podem ser simplificadas juntas | Nenhuma ligação entre as formas |
| Suporte | D3.js, mapshaper, GDAL/QGIS (só leitura), este visualizador | Quase todo GIS e toda biblioteca de mapas web |
| Padrão | TopoJSON Format Specification 1.0 (comunidade) | IETF RFC 7946 |
Minha regra prática: use TopoJSON quando você envia muitos polígonos que se tocam para um navegador, como países, estados ou distritos, e o tamanho importa. Use GeoJSON para todo o resto, principalmente quando outras pessoas ou ferramentas vão editar os dados.
O que tem dentro de um arquivo TopoJSON
Um arquivo TopoJSON é um único objeto JSON com o tipo "Topology". Estes são os seus membros principais:
- type
- Sempre
"Topology". Um arquivo que diz"FeatureCollection"é GeoJSON, não TopoJSON. - objects
- Um dicionário de objetos nomeados, por exemplo
countriesecapitals. Cada um é uma geometria ou umaGeometryCollection, e cada um vira uma camada neste visualizador. - arcs
- A lista compartilhada de linhas. Polígonos e linhas não guardam coordenadas próprias: eles listam os números dos arcos que os formam.
- transform
- Opcional. Quando existe, o arquivo é quantizado: as posições dos arcos são inteiros, e
scaleetranslateos transformam de volta em longitude e latitude. - bbox
- Opcional. O retângulo envolvente de todos os dados, como [mín x, mín y, máx x, máx y].
- properties, id
- Cada geometria pode ter
properties(os atributos) e umid, igual a uma feição GeoJSON.
Aqui está uma topologia completa e bem pequena, com dois campos quadrados que se tocam. É o mesmo exemplo que a seção de matemática mais abaixo resolve.
{
"type": "Topology",
"transform": { "scale": [0.001, 0.001], "translate": [-10, 40] },
"objects": {
"fields": {
"type": "GeometryCollection",
"geometries": [
{ "type": "Polygon", "arcs": [[0, 1]], "properties": { "name": "A" } },
{ "type": "Polygon", "arcs": [[2, -1]], "properties": { "name": "B" } }
]
}
},
"arcs": [
[[4000, 7000], [0, 1000]],
[[4000, 8000], [-1000, 0], [0, -1000], [1000, 0]],
[[4000, 7000], [1000, 0], [0, 1000], [-1000, 0]]
]
}O campo A usa os arcos 0 e 1. O campo B usa o arco 2 e depois o -1. Um índice negativo significa "use este arco ao contrário": -1 é o arco 0 invertido, porque o número é o complemento de um ~0. A fronteira entre os campos (arco 0) é escrita uma só vez.
Detalhes técnicos
Isto é exatamente o que o visualizador lê e mostra.
- Arquivos aceitos
- Arquivos
.topojsone.jsoncom"type": "Topology", até 100 MB. Um arquivo GeoJSON recebe uma mensagem clara que indica o Visualizador de GeoJSON. - Tipos de geometria
- Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon e GeometryCollection, incluindo geometrias null (elas são puladas).
- Objetos
- Cada objeto nomeado vira uma camada própria, com caixa de seleção, cor, tipo de geometria, número de feições e de campos, e um download em GeoJSON.
- Arquivos quantizados
- Suportados por completo. O visualizador lê o
transform, decodifica os inteiros codificados como deltas e mostra o tamanho de um passo da grade no terreno, em metros. - Fronteiras compartilhadas
- Para objetos com polígonos, o visualizador monta a malha de arcos usados por duas feições diferentes (
topojson.meshcoma !== b) e pode desenhá-la por cima. - Atributos
- Todas as
propertiesaparecem na janela de informação. Umiddo TopoJSON é adicionado como atributoid, para você vê-lo e para ele continuar na exportação. - Sistema de coordenadas
- O TopoJSON para mapas web normalmente está em longitude e latitude WGS84. Arquivos projetados antes da conversão (por exemplo, US Albers para um mapa em D3) não estão em graus e não podem ser colocados em um mapa-múndi.
- Exportação
- Cada objeto em um arquivo GeoJSON próprio, ou todos os objetos em um único GeoJSON com um atributo
topojson_objectque diz de onde veio cada feição. - Mapa base
- Mapa de ruas por padrão, com opção de satélite. Coloque a opacidade de preenchimento em 0 para ver só os contornos.
- Privacidade
- O arquivo é lido e decodificado no seu navegador. Nada é enviado a um servidor.
Como visualizar um arquivo TopoJSON, passo a passo
Este é o fluxo completo com o exemplo incluído: 50 países europeus do Natural Earth e 22 capitais, guardados como uma topologia quantizada com dois objetos.

O mapa abre com um mapa base de ruas. Use Upload, arraste um arquivo para o mapa ou clique em Sample Data.

O arquivo é decodificado no seu navegador, e cada objeto é desenhado com a sua cor. File Info mostra o número de objetos, feições e arcos, o passo de quantização e quão grande seriam os mesmos dados em GeoJSON.

O painel Objects lista cada objeto da topologia com seu tipo de geometria e número de feições. Desmarque um objeto para escondê-lo, ou clique no quadrado de cor para mudar a cor.

Marque "Highlight shared borders" para desenhar os arcos que duas feições diferentes compartilham, montados a partir da própria topologia. Os litorais não são compartilhados, então ficam sem destaque.

Clique em qualquer feição para abrir seus atributos. A janela também mostra o objeto ao qual ela pertence e o id do TopoJSON.

Use o link GeoJSON ao lado de um objeto para baixar só esse objeto, ou Download All as GeoJSON para tudo em um único arquivo.
Outras formas de abrir e converter TopoJSON
Este visualizador serve para olhar um arquivo rapidamente. Estas são as outras ferramentas que uso quando um arquivo TopoJSON precisa de trabalho de verdade.
mapshaper
O mapshaper (o site mapshaper.org ou a ferramenta de linha de comando) lê e grava TopoJSON, Shapefile, GeoJSON e CSV. É a melhor ferramenta para simplificar fronteiras mantendo-as compartilhadas, e para converter entre TopoJSON e outros formatos.
QGIS e GDAL
O GDAL tem um driver de TopoJSON só de leitura, então o QGIS abre um arquivo TopoJSON arrastando e soltando. Cada objeto aparece como uma camada separada. Para salvar, exporte a camada para GeoJSON ou GeoPackage. O ogr2ogr converte na linha de comando.
As ferramentas de linha de comando do topojson
O geo2topo (do topojson-server) monta uma topologia a partir de arquivos GeoJSON, o toposimplify (do topojson-simplify) e o topoquantize (do topojson-client) a deixam menor, e o topo2geo (também do topojson-client) transforma os objetos de volta em GeoJSON.
D3.js e Python
No navegador, topojson.feature transforma um objeto em GeoJSON para o D3 ou qualquer biblioteca de mapas, e topojson.mesh entrega as fronteiras compartilhadas. Em Python, o GeoPandas lê TopoJSON através do GDAL, um objeto (camada) por vez.
As mesmas tarefas em código
Estes comandos convertem um arquivo de países nas duas direções e o leem em JavaScript e em Python.
# mapshaper (npm install -g mapshaper) mapshaper countries.shp -o format=topojson quantization=1e5 countries.topojson mapshaper countries.topojson -o format=geojson countries.geojson # topojson-server / topojson-client command line tools geo2topo countries=countries.geojson > countries.topojson topo2geo countries=countries.geojson < countries.topojson # GDAL / OGR: each TopoJSON object becomes its own layer ogrinfo countries.topojson ogr2ogr -f GeoJSON countries.geojson countries.topojson countries
// D3.js + topojson-client in the browser
const topo = await d3.json("countries.topojson");
const countries = topojson.feature(topo, topo.objects.countries);
const borders = topojson.mesh(topo, topo.objects.countries, (a, b) => a !== b);
# Python: GeoPandas reads TopoJSON through GDAL, one object at a time
import geopandas as gpd
countries = gpd.read_file("countries.topojson", layer="countries")Minha opinião: mantenha seus dados principais em GeoJSON, GeoPackage ou Shapefile, e gere o TopoJSON como último passo para a web. Ele é fácil de gerar de novo, mas difícil de editar à mão.
Como o visualizador funciona
Isto é o que acontece entre soltar um arquivo e vê-lo no mapa. Cada passo roda no seu navegador.
- Ler e conferir o JSON. O arquivo é lido como texto e analisado. Se o
typedo nível superior não for"Topology", ou se faltarobjectsouarcs, você recebe um erro claro em vez de um mapa vazio. - Decodificar os arcos. Se o arquivo tem um
transform, cada arco é decodificado de inteiros codificados como deltas para longitude e latitude. Sem transform, as posições dos arcos são usadas como estão. - Reconstruir cada objeto. Para cada objeto nomeado,
topojson.featurejunta os arcos referenciados em anéis e linhas, inverte os arcos com índice negativo e devolve uma FeatureCollection GeoJSON com as properties e ids originais. - Montar a malha de fronteiras compartilhadas. Para objetos com polígonos,
topojson.meshcom o filtroa !== breúne cada arco que pertence a duas feições diferentes. Arcos usados por uma única feição, como os litorais, ficam de fora. - Medir o arquivo. O visualizador conta objetos, feições e arcos, calcula o tamanho de um passo de quantização em metros e mede quão grande seria o GeoJSON decodificado.
- Desenhar e enquadrar. Cada objeto vira uma camada do Leaflet com cor própria. Os pontos são desenhados como círculos. O mapa dá zoom em todos os dados visíveis.
A decodificação em si é feita pelo topojson-client, a biblioteca de referência escrita pelo criador do formato, então o visualizador lê os arquivos exatamente como os mapas em D3.
Como o TopoJSON deixa os arquivos menores
O TopoJSON economiza espaço de três formas: arcos compartilhados, quantização e codificação delta. Aqui está a matemática de cada uma, com a topologia de exemplo acima.
1. Arcos compartilhados
No GeoJSON, uma fronteira entre dois polígonos é escrita duas vezes, uma em cada polígono. O TopoJSON corta cada limite em arcos nos pontos onde três ou mais formas se encontram, guarda cada arco uma vez e deixa cada polígono listar os arcos que usa. Um índice negativo usa o arco ao contrário.
índice i ≥ 0 → arco i, do primeiro ao último ponto índice i < 0 → arco ~i = −i − 1, do último ao primeiro ponto Anel do campo A: [0, 1] = arco 0, depois arco 1 Anel do campo B: [2, −1] = arco 2, depois arco 0 invertido
Em um mapa de países, quase todo o comprimento de cada fronteira é compartilhado por exatamente dois países, então só este passo já remove perto da metade das coordenadas das fronteiras.
2. Quantização
A quantização encaixa cada coordenada em uma grade regular e escreve a célula como um inteiro. Com uma quantização q, o retângulo envolvente é dividido em q − 1 passos em cada eixo. O transform guarda o tamanho da grade (scale) e o canto da grade (translate).
scale_x = (x_max − x_min) / (q − 1) scale_y = (y_max − y_min) / (q − 1) longitude = x_inteiro · scale_x + translate_x latitude = y_inteiro · scale_y + translate_y
O arquivo de exemplo usa q = 100 000 sobre a Europa e o oeste da Rússia, cerca de 69° de longitude e 36° de latitude. Um passo mede cerca de 0,0007° de oeste a leste, uns 44 m a 55° norte, e cerca de 40 m de norte a sul. Isso é muito mais fino que os dados de origem na escala 1:50m, então nenhum detalhe visível se perde. O painel File Info mostra esse passo para os seus próprios arquivos.
3. Codificação delta
Dentro de cada arco, só a primeira posição é escrita como inteiro completo. Cada posição seguinte é escrita como a diferença em relação à anterior. Pontos vizinhos ficam perto uns dos outros, então as diferenças são números pequenos, com poucos dígitos.
arco guardado: [[4000, 7000], [0, 1000]] ponto 1: x = 4000 y = 7000 ponto 2: x = 4000 + 0 = 4000 y = 7000 + 1000 = 8000 com scale [0.001, 0.001] e translate [−10, 40]: ponto 1: (4000 · 0.001 − 10, 7000 · 0.001 + 40) = (−6, 47) ponto 2: (4000 · 0.001 − 10, 8000 · 0.001 + 40) = (−6, 48)
Então o arco 0 do exemplo é a linha de (−6, 47) até (−6, 48): a fronteira entre o campo A e o campo B. Decodificando os três arcos, você obtém os dois quadrados A = (−7…−6, 47…48) e B = (−6…−5, 47…48). É exatamente o caso que os testes do visualizador conferem, junto com a malha de fronteiras compartilhadas, que devolve só essa linha.
4. O resultado final
No exemplo deste visualizador, o GeoJSON original com 4 casas decimais tem cerca de 211 KB, e o TopoJSON cerca de 114 KB, mais ou menos a metade. Quando o visualizador decodifica o TopoJSON de volta para GeoJSON com números decimais completos, ele cresce para cerca de 500 KB, que é o número que o painel File Info mostra. Depois da compressão gzip, que todo servidor web usa, a diferença costuma diminuir, mas continua clara em mapas com muitas fronteiras compartilhadas.
Quando um visualizador de TopoJSON ajuda
Estas são as situações em que eu recorro a um visualizador rápido de TopoJSON.
- Conferir um arquivo antes de montar um mapa em D3. Veja quais objetos um arquivo TopoJSON baixado contém, como eles se chamam e quais atributos têm, para saber o que escrever em `topo.objects` antes de começar a programar.
- Conferir as fronteiras depois de simplificar. Depois de simplificar um mapa no mapshaper ou no toposimplify, ligue "Highlight shared borders" para confirmar que os vizinhos ainda compartilham uma fronteira limpa, sem vãos nem lascas.
- Tirar GeoJSON de um arquivo TopoJSON. Muitos mapas web e ferramentas GIS só aceitam GeoJSON. Baixe um objeto ou o arquivo inteiro como GeoJSON sem instalar nada.
- Revisar mapas eleitorais e de censo. Redações costumam publicar limites de distritos e municípios em TopoJSON. Abra o arquivo para conferir nomes, ids e cobertura antes de juntar seus resultados a ele.
- Comparar níveis de quantização. Abra o mesmo mapa gerado com quantizações diferentes e compare o tamanho do passo em metros e o tamanho do arquivo, para escolher o menor arquivo que ainda fica bom.
- Ensinar como a topologia funciona. A lista de objetos, o número de arcos e a visão das fronteiras compartilhadas facilitam mostrar aos alunos por que uma topologia é menor que o GeoJSON comum.
- Abrir arquivos dos pacotes world-atlas e us-atlas. Esses pacotes populares do npm trazem TopoJSON de países, estados e condados dos EUA. Abra-os aqui para ver exatamente o que contêm.
- Descobrir por que um arquivo não carrega. Se uma biblioteca de mapas falha com um arquivo, o visualizador diz se ele é mesmo TopoJSON, GeoJSON com a extensão errada ou um arquivo com referências quebradas a arcos.
Perguntas frequentes
1. O que é TopoJSON?
TopoJSON é uma extensão do GeoJSON que guarda a geometria como uma topologia. As fronteiras compartilhadas são guardadas uma vez como arcos, e as coordenadas costumam ser quantizadas como inteiros. Foi criado por Mike Bostock, o autor do D3.js, para deixar os arquivos de mapas para a web menores.
2. Como abro um arquivo TopoJSON?
Arraste-o para o mapa deste visualizador ou clique em Upload. No QGIS você pode arrastá-lo para a janela do mapa, porque o GDAL lê TopoJSON. Em código, use topojson.feature do topojson-client para transformar cada objeto em GeoJSON.
3. Qual é a diferença entre TopoJSON e GeoJSON?
O GeoJSON escreve as coordenadas completas de cada forma, então uma fronteira compartilhada aparece duas vezes. O TopoJSON escreve cada fronteira uma vez como um arco que as formas referenciam, e costuma guardar as coordenadas como inteiros pequenos. Arquivos TopoJSON são menores; arquivos GeoJSON são mais simples e suportados em quase todo lugar.
4. Como converto TopoJSON para GeoJSON?
Carregue o arquivo aqui e clique em Download All as GeoJSON, ou use o link GeoJSON ao lado de um objeto. Na linha de comando, topo2geo ou mapshaper -o format=geojson fazem o mesmo trabalho.
5. Meu arquivo tem vários objetos. O que acontece com eles?
Cada objeto vira uma camada própria, com cor e caixa de seleção próprias. Você pode baixar cada objeto como um arquivo GeoJSON separado, ou todos juntos. O arquivo combinado adiciona um atributo topojson_object a cada feição.
6. O que "Highlight shared borders" mostra?
Ele desenha os arcos usados por duas feições diferentes do mesmo objeto, por exemplo a fronteira entre dois países. Arcos usados por uma só feição, como os litorais, não são desenhados. É o mesmo que topojson.mesh(topology, object, (a, b) => a !== b) no D3.
7. O que significa "quantizado" no painel File Info?
Significa que o arquivo tem um transform, então suas coordenadas são inteiros em uma grade. O painel mostra o tamanho de um passo da grade no terreno. Um passo de poucos metros serve para um mapa de cidade; um passo de algumas centenas de metros serve para um mapa-múndi.
8. Por que meu mapa aparece no lugar errado ou muito pequeno?
Alguns arquivos TopoJSON, principalmente os feitos para mapas em D3 dos Estados Unidos, são projetados antes da conversão, então suas coordenadas são pixels de tela, não longitude e latitude. Um arquivo assim não pode ser colocado em um mapa-múndi. Use a versão não projetada dos dados.
9. Por que recebo uma mensagem dizendo que meu arquivo é GeoJSON?
Muitos arquivos TopoJSON usam a extensão .json, e os arquivos GeoJSON também. O visualizador confere o conteúdo, não o nome. Se o arquivo começa com "type": "FeatureCollection", é GeoJSON. Abra-o no Visualizador de GeoJSON deste site.
10. Meu arquivo é enviado para algum lugar?
Não. O arquivo é lido e decodificado no seu navegador com o topojson-client. Só os blocos do mapa base vêm da internet.
Bibliotecas e dados
Este visualizador é feito com software de código aberto e dados abertos. Muito obrigado às pessoas por trás destes projetos.
- topojson-client 3.1 · ISC · Mike BostockDecodifica a topologia: transforma os arcos de volta em coordenadas, reconstrói cada objeto como GeoJSON e monta a malha de fronteiras compartilhadas.
- Leaflet 1.9 · BSD-2-Clause · Volodymyr Agafonkin and contributorsDesenha o mapa interativo, as camadas e as janelas de informação.
- Natural Earth (1:50m Admin 0 countries) · Domínio público · Natural Earth contributorsFronteiras dos países usadas no arquivo de exemplo.
- OpenStreetMap, Protomaps (hosted by KONAKTIVE), CARTO, Esri World Imagery · ODbL e termos do provedor · OpenStreetMap contributors, Protomaps, KONAKTIVE, CARTO, EsriBlocos e imagens do mapa base.
Visualizadores de arquivos GIS relacionados
Os arquivos TopoJSON são lidos e decodificados no seu navegador. Nenhum arquivo é enviado a um servidor. O exemplo usa dados do Natural Earth (domínio público). Blocos do mapa © colaboradores do OpenStreetMap, desenhados com Protomaps (hospedado por KONAKTIVE), com CARTO como reserva. Imagens de satélite: Esri.
