OnlineMapMaker logo

Visualizador de TopoJSON

Abra um arquivo .topojson em um mapa interativo. Cada objeto da topologia vira uma camada própria, você pode destacar as fronteiras que formas vizinhas compartilham, clicar em qualquer feição para ver seus atributos e exportar os dados como GeoJSON. Tudo roda no seu navegador. Abrir em ecrã inteiro ↗

Rate this tool:
Publicidade
Publicidade
Loading viewer…
Precisa de ajuda com o seu projeto de GIS?Conheça Nossos Serviços

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.

Publicidade
Publicidade

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.

AspectoTopoJSONGeoJSON
Fronteiras compartilhadasGuardadas uma vez como arco e referenciadas por cada forma que as usaGuardadas de novo em cada polígono que as toca
CoordenadasEm geral inteiros quantizados, escritos como pequenas diferenças (deltas)Longitude e latitude decimais completas em cada vértice
Tamanho do arquivoMuitas vezes bem menor para polígonos que se tocamMaior, mas simples de ler
CamadasVários objetos nomeados em um arquivoUma FeatureCollection por arquivo
TopologiaSabe quais formas são vizinhas, então as fronteiras podem ser simplificadas juntasNenhuma ligação entre as formas
SuporteD3.js, mapshaper, GDAL/QGIS (só leitura), este visualizadorQuase todo GIS e toda biblioteca de mapas web
PadrãoTopoJSON 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 countries e capitals. Cada um é uma geometria ou uma GeometryCollection, 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 scale e translate os 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 um id, 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 .topojson e .json com "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.mesh com a !== b) e pode desenhá-la por cima.
Atributos
Todas as properties aparecem na janela de informação. Um id do TopoJSON é adicionado como atributo id, 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_object que 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.

Visualizador de TopoJSON vazio com os botões Upload, Sample Data e Street/Sat sobre um mapa-múndi
1
Passo 1: Abra o visualizador

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

Países europeus e capitais carregados do arquivo TopoJSON de exemplo, com o painel File Info
2
Passo 2: Carregue um arquivo TopoJSON

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.

Painel Objects com os objetos countries e capitals, suas caixas de seleção, cores e links de download
3
Passo 3: Trabalhe com os objetos

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.

Fronteiras compartilhadas entre países europeus desenhadas como linhas escuras tracejadas sobre os países coloridos
4
Passo 4: Destaque as fronteiras compartilhadas

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.

Janela de informação sobre a Alemanha com id, nome, códigos ISO, área e população
5
Passo 5: Leia os atributos

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.

Painel Actions com o botão Download All as GeoJSON destacado
6
Passo 6: Exporte para GeoJSON

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.

Publicidade
Publicidade

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.

  1. Ler e conferir o JSON. O arquivo é lido como texto e analisado. Se o type do nível superior não for "Topology", ou se faltar objects ou arcs, você recebe um erro claro em vez de um mapa vazio.
  2. 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.
  3. Reconstruir cada objeto. Para cada objeto nomeado, topojson.feature junta 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.
  4. Montar a malha de fronteiras compartilhadas. Para objetos com polígonos, topojson.mesh com o filtro a !== b reúne cada arco que pertence a duas feições diferentes. Arcos usados por uma única feição, como os litorais, ficam de fora.
  5. 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.
  6. 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.

Publicidade
Publicidade

Quando um visualizador de TopoJSON ajuda

Estas são as situações em que eu recorro a um visualizador rápido de TopoJSON.

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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.

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.

Muhammad Gulraiz Khan, especialista em GIS e fundador da KONAKTIVE e do OnlineMapMaker.com

Sobre o Autor

Muhammad Gulraiz Khan

Especialista e Consultor em GIS · Fundador da KONAKTIVE

Muhammad Gulraiz Khan é um especialista em GIS com mais de uma década de experiência profissional fornecendo soluções geoespaciais para o setor de energia, incluindo projetos para o Banco Mundial, a Corporação Financeira Internacional (IFC) e a USAID. Ele criou o OnlineMapMaker.com para tornar ferramentas profissionais de mapeamento gratuitas e acessíveis para todos.

Publicidade
Publicidade