Shapefile vs GeoPackage vs GeoJSON: Qual Usar

Resposta curta: colete e edite em GeoPackage, publique na web em GeoJSON e entregue um Shapefile apenas quando o outro lado insistir. O resto é evidência: um dataset convertido de três formas em 15 de setembro de 2026, oito perguntas feitas a cada cópia, o comando por trás de cada resposta.

O dataset é a malha de 2022 do IBGE com os 27 estados brasileiros: 27 polígonos, cinco campos. Ele chega como um zip de 13.717.460 bytes cujo SHA-256 é 282ec7f0f0beeeead45e6609f4ffffce161bda04cb8ee0afcad2316d1c841bcb; a listagem do diretório não imprime nenhuma linha de licença, então credite o IBGE e verifique os termos do portal antes de republicar.

Como as três cópias foram feitas

O zip contém cinco arquivos: BR_UF_2022.shp, .shx, .dbf, .prj e .cpg. O ogrinfo -so relata 27 polígonos em SIRGAS 2000, que o GDAL identifica como EPSG:4674 — não WGS 84, o que importa mais adiante. O GeoPackage veio de ogr2ogr -f GPKG uf.gpkg BR_UF_2022.shp, mantendo o CRS. O GeoJSON veio de ogr2ogr -f GeoJSON uf.geojson BR_UF_2022.shp -t_srs EPSG:4326 -lco RFC7946=YES, mais uma segunda cópia com -lco COORDINATE_PRECISION=6. Apenas o GeoJSON foi reprojetado, porque a RFC 7946 não deixa outra escolha: um GeoJSON "em SIRGAS 2000" não tem como dizer isso. GDAL 3.13.3 do início ao fim; cada conjunto solto foi então compactado com zip -9.

O comando simples de GPKG também avisa que um MULTIPOLYGON está sendo inserido em uma camada declarada como POLYGON: o formato Shapefile tem um único tipo de forma de polígono, então estados com múltiplas partes, como o Pará, chegam rotulados como polígonos simples. -nlt MULTIPOLYGON silencia o aviso e é a declaração correta.

Os oito critérios

Os mesmos três itens, na mesma ordem, sempre. Onde foi medido, o número é citado; onde é uma afirmação sobre a especificação, a frase de abertura diz isso.

Tamanho do arquivo

Solto é o número de bytes em disco; compactado é o mesmo conjunto de arquivos depois do zip -9. O tamanho solto do Shapefile é a soma de seus cinco arquivos.

  • Shapefile — 18.227.115 bytes soltos (17,38 MiB), dos quais 18.224.100 são do .shp e 2.543 do .dbf; 13.794.222 bytes compactados (13,16 MiB). O próprio zip do IBGE tem 13.717.460 bytes — os mesmos cinco arquivos, em um arquivo compactado diferente.
  • GeoPackage — 18.386.944 bytes soltos (17,54 MiB), 13.828.105 compactados (13,19 MiB). São 159.829 bytes a mais que o Shapefile solto e 33.883 a mais compactado: a estrutura de páginas do SQLite e o índice espacial custam mais do que o .shx que substituem. A sabedoria popular de que o GeoPackage economiza bytes não é verdade aqui.
  • GeoJSON — 29.108.343 bytes soltos no padrão de sete casas decimais da RFC 7946 (27,76 MiB) e 26.839.688 com seis casas (25,60 MiB); mas compactado é o menor dos três por cerca de 5 MiB — 8.457.365 bytes (8,07 MiB) e 7.132.808 (6,80 MiB). O texto comprime a 71–73%, as formas binárias a 24–25%. Seis casas decimais equivalem a cerca de 0,11 m no equador, então o primeiro vértice do Acre se movendo de [-68.7928173,-10.9995693] para [-68.792817,-10.999569] é invisível em qualquer zoom.

Nomes de campos

A tabela de atributos do Shapefile é um arquivo dBase, e o dBase limita o nome de um campo a dez caracteres. O arquivo do IBGE nunca atinge esse limite — seus cinco campos são CD_UF, NM_UF, SIGLA_UF, NM_REGIAO e AREA_KM2, o mais longo com nove caracteres — então induzimos o caso: um alias de 26 caracteres, -sql "SELECT *, NM_UF AS nome_da_unidade_federativa FROM BR_UF_2022", escrito em cada formato.

  • Shapefile — o GDAL imprimiu Warning 6: Normalized/laundered field name: 'nome_da_unidade_federativa' to 'nome_da_un' e a tabela saiu com uma coluna chamada nome_da_un. Um alias com exatamente dez caracteres não gerou aviso nenhum, então é o comprimento e mais nada.
  • GeoPackagenome_da_unidade_federativa sobreviveu intacto; o sqlite3 lista a coluna como TEXT(50).
  • GeoJSONnome_da_unidade_federativa também sobreviveu, como chave de propriedade em cada um dos 27 estados. Um nome de propriedade é uma string JSON, do tamanho que você quiser.

Codificação

O texto de um Shapefile vive no .dbf, e o cabeçalho do .dbf deste arquivo não declara nenhuma codepage (seu byte de language-driver é 0). O único lugar em que diz UTF-8 é o arquivo lateral .cpg de cinco bytes, cujo conteúdo inteiro é UTF-8. Nós o removemos e pedimos os nomes dos estados de novo.

  • Shapefile — com o .cpg presente, o GDAL relata ENCODING_FROM_CPG=UTF-8 e imprime Pará, Amapá e Maranhão corretamente. Sem ele, o GDAL relata uma codificação de origem vazia e apenas repassa os bytes, então Amapá ainda parece certo em um terminal UTF-8 — sorte, não conhecimento. No momento em que um leitor assume a codepage que os Shapefiles carregaram por vinte anos, Latin-1 ou Windows-1252 (--config SHAPE_ENCODING ISO-8859-1 reproduz isso), os mesmos bytes aparecem como Amapá e São Paulo, e o mojibake vai para todo arquivo exportado a partir dele. Nenhuma interrogação apareceu em nenhuma execução: letras erradas, não letras faltando.
  • GeoPackage — UTF-8 por especificação; o file lê isso direto do cabeçalho do SQLite, e o ogrinfo imprime Pará, Amapá e Paraíba sem nenhum arquivo lateral para perder.
  • GeoJSON — UTF-8 por especificação, porque o JSON é; grep -c Amapá encontra o nome em ambas as cópias, bytes C3 A1.

CRS transportado

Onde o arquivo diz em qual sistema de coordenadas seus números estão, e se com um código que uma máquina consegue consultar.

  • Shapefile — o .prj tem 151 bytes de WKT da ESRI começando com GEOGCS["GCS_SIRGAS_2000", e grep -c 'AUTHORITY\|EPSG' nele retorna 0: nenhum código de autoridade no arquivo. Quando o ogrinfo imprime ID["EPSG",4674], é o GDAL comparando o texto com seu próprio banco de dados, não lendo um número. Nosso guia de códigos EPSG explica por que "meu arquivo não tem código EPSG" é uma reclamação tão comum.
  • GeoPackage — o CRS é uma linha em gpkg_spatial_ref_sys com autoridade e código, EPSG / 4674, e gpkg_geometry_columns vincula a camada a ela. Duas linhas indefinidas e 4326 ficam ao lado porque a especificação exige isso.
  • GeoJSON — nada. grep -c '"crs"' retorna 0 em ambas as cópias. A RFC 7946 §4 fixa o CRS de todo GeoJSON como WGS 84, longitude primeiro, e é por isso que a conversão teve que reprojetar — e por que um GeoJSON ainda em SIRGAS 2000 ou em metros UTM é desenhado no lugar errado sem nenhum erro. Nosso guia de GeoJSON cobre esse caso.

Um arquivo ou vários

O que você precisa manter junto para os dados abrirem.

  • Shapefile — cinco arquivos vindos do IBGE: .shp, .shx, .dbf, .prj, .cpg. Três são obrigatórios para o formato abrir; os outros dois carregam o CRS e a codificação, e são os que mais se perdem. O IBGE não distribui índice .sbn/.sbx nem metadados .shp.xml.
  • GeoPackage — um único arquivo, uf.gpkg. O SQLite pode deixar um -journal ou -wal transitório ao lado dele durante a escrita; nenhum ficou aqui.
  • GeoJSON — um único arquivo, uf.geojson.

Limite de tamanho

Uma afirmação vinda da própria documentação de cada formato, não uma medição — o maior arquivo aqui tem 29 MB.

  • Shapefile — 2 GB por .shp e por .dbf. A página do driver Shapefile do GDAL coloca isso como "it is not recommended to use a file size over 2GB for both .SHP and .DBF files" (não é recomendado usar um tamanho de arquivo acima de 2 GB para os arquivos .SHP e .DBF) e documenta um aviso emitido quando o limite é atingido.
  • GeoPackage — o limite do SQLite, que a página de limites do próprio SQLite declara como "about 281 terabytes". Na prática, o disco.
  • GeoJSON — nenhum limite na RFC 7946. O limite prático é o que conseguir analisar o texto na memória: o visualizador gratuito abaixo não tem limite de bytes nem de feições, então a memória do navegador decide.

Editabilidade

Também uma afirmação, não uma medição — o que uma edição custa em cada formato.

  • Shapefile — editável no lugar por um GIS de desktop, mas toda edição reescreve .shp, .shx e .dbf juntos, porque o .shx é um índice de offsets para o .shp. Renomear um campo é limitado pelos dez caracteres citados acima, e uma edição de texto pela codepage.
  • GeoPackage — um banco de dados SQLite: edições são transações com rollback em caso de falha, leitores simultâneos são seguros, e qualquer cliente SQLite consegue atualizar um atributo sem precisar de um GIS. É aqui que o arquivo único recupera os bytes que custou.
  • GeoJSON — texto puro, então qualquer editor muda uma propriedade; mas não há índice nem transação, e um arquivo de 27 MiB é uma reescrita de 27 MiB para uma mudança de um caractere. Bom à mão, errado para um fluxo de trabalho.

Tempo de carregamento nos visualizadores gratuitos

Medido nas ferramentas em produção com um Chromium headless em 1280×1000, um navegador novo por execução, três execuções por arquivo, o arquivo local entregue ao input de arquivo da página; o cronômetro corre da entrega até o painel de camadas, expandido com um clique depois que o arquivo é registrado, listar os 27 estados — então cada número inclui esse clique e a sua re-renderização. Leia as medianas como "cerca de um segundo e meio" e "cerca de três segundos": uma máquina, uma tarde.

  • Shapefile — o zip (13.794.222 bytes) solto no shapefile-viewer: mediana de 1.621 ms (execuções 1.621 / 1.621 / 1.404).
  • GeoPackage — nenhum visualizador. O tools.geodocs.io tem oito visualizadores e nenhum abre um .gpkg, pelo motivo que o guia de GeoPackage explica: um banco de dados SQLite precisa de um motor SQLite. Abra no QGIS.
  • GeoJSON — o arquivo de sete casas decimais (29.108.343 bytes) solto no geojson-viewer: mediana de 3.559 ms (execuções 2.770 / 3.559 / 4.735). A mediana do arquivo de seis casas foi 2.740 ms, mas suas execuções variaram de 2.435 a 4.158 ms — tão largo quanto a diferença entre as precisões — então não afirmamos que seis casas carrega mais rápido. Ambos são cerca do dobro do Shapefile compactado.

Qual escolher, então

Se você coleta ou edita dados — uma equipe de campo, um levantamento, um inventário que muda toda semana — use GeoPackage. Um único arquivo, transações, o CRS guardado como um código, UTF-8 sem arquivo lateral, nomes de campo do tamanho que a coluna merecer. Custa 159.829 bytes a mais que o Shapefile aqui e compra tudo o mais nesta página. Sua única lacuna é o navegador: nenhum visualizador gratuito, então mantenha o QGIS por perto.

Se o destino é a web ou uma API — um mapa em uma página, um fetch a partir do JavaScript, um payload entre serviços — use GeoJSON. É o menor dos três na transmissão depois de compactado, abre no visualizador gratuito sem instalar nada, e toda biblioteca web sabe lê-lo. Reprojete para WGS 84 primeiro, porque o formato não tem como registrar outra coisa, e preste atenção ao tamanho solto: 29 MB em uma aba está bem, dez vezes isso é uma decisão.

Se o outro lado insistir em um Shapefile, envie um — todos os cinco arquivos em um zip, e diga a codificação e o CRS na mensagem, porque o .cpg e o .prj são os dois arquivos que mais se perdem e os dois cuja ausência gera um mapa errado em vez de um que falha. Nosso guia de Shapefile explica cada arquivo lateral.

Para times

Um formato é o que você entrega; o fluxo de trabalho é onde o tempo vai. O Geodocs é construído para o lado do fluxo de trabalho — coleta em campo com atributos que mantêm seus nomes e seus acentos, compartilhada por um time em um único mapa — então a questão do formato só aparece na exportação, o momento certo para isso.

Artigos Relacionados

Navegação