Nome de coluna cortado em 10 caracteres (e o que fazer)

Resposta curta: a tabela de atributos de um Shapefile é um arquivo dBase, e o cabeçalho dBase guarda cada nome de campo em 11 bytes, um dos quais é um terminador — 10 caracteres é o teto. O GDAL avisa uma vez na exportação e corta o nome; todo leitor depois enxerga o nome curto, porque o longo nunca foi escrito. Desde o GDAL 3.13, um sidecar .shp.xml pode trazê-lo de volta, mas só quando o sidecar lista todos os campos, em ordem — e o visualizador no navegador não lê sidecar nenhum. A correção é escolher as abreviações você mesmo antes de exportar, ou abandonar o formato.

Tudo abaixo foi testado em 16 de setembro de 2026 com o GDAL 3.13.3 e o shapefile-viewer ao vivo em static-page-tools@442f8d8; o que cada ferramenta imprimiu está citado. O dataset é a malha do IBGE de 2022 dos 27 estados brasileiros, cujos cinco campos — CD_UF, NM_UF, SIGLA_UF, NM_REGIAO, AREA_KM2 — têm todos nove caracteres ou menos, então toda truncagem aqui é induzida com um alias -sql. O Guia de Shapefile explica o limite em "Nomes de campo são cortados em 10 caracteres"; este post é a reprodução, no GDAL e no navegador, e a correção.

O aviso, na íntegra

Exportando a malha com um alias de 26 caracteres, ogr2ogr -f "ESRI Shapefile" long/long.shp uf.gpkg -sql "SELECT *, NM_UF AS nome_da_unidade_federativa FROM BR_UF_2022", imprime uma linha: Warning 6: Normalized/laundered field name: 'nome_da_unidade_federativa' to 'nome_da_un'. O ogrinfo -so long/long.shp long então lista seis campos, o último deles nome_da_un: String (50.0) — a largura veio de NM_UF, o nome foi cortado em dez. O controle: o mesmo pipeline com um alias de exatamente dez caracteres, NM_UF AS nome_da_un, sai com código 0, sem aviso, e guarda o nome como foi dado. É o comprimento, nada mais.

Colisões: nome_da_un, nome_da__1, nome_da__2

Três nomes longos que compartilham os primeiros dez caracteres, exportados juntos (NM_UF AS nome_da_unidade_federativa, NM_REGIAO AS nome_da_unidade_regional, SIGLA_UF AS nome_da_unidade_sigla), geram três avisos e três nomes curtos diferentes:

  • nome_da_unidade_federativa virou nome_da_un — os primeiros dez caracteres, como no caso único.
  • nome_da_unidade_regional virou nome_da__1 — os primeiros oito caracteres mais _1; o underscore duplo está aí porque o oitavo caractere do prefixo já é _.
  • nome_da_unidade_sigla virou nome_da__2 — a mesma regra, próximo contador.

As larguras seguem a coluna de origem, não o alias: nome_da__1 é String (20.0) a partir de NM_REGIAO, nome_da__2 é String (2.0) a partir de SIGLA_UF. Quem abrir esse arquivo no mês que vem vê nome_da__2 e não tem como saber que era a sigla do estado. O observat_1 do guia é a mesma regra em outro dataset.

O sidecar .shp.xml: o GDAL 3.13 restaura o nome, com condições

O guia diz que o GDAL 3.13 e versões posteriores leem o .shp.xml para restaurar nomes de campo com mais de 10 caracteres e seus aliases. Testamos na 3.13.3, e se confirma — com duas condições que um teste ingênuo não pega.

O sidecar é o arquivo de metadados do ArcGIS, <basename>.shp.xml; o leitor percorre seus elementos <attr> em ordem, pareando o n-ésimo <attr> com o n-ésimo campo do .dbf. Com um long.shp.xml escrito à mão listando os seis campos na ordem do DBF, o sexto carregando <attrlabl>nome_da_unidade_federativa</attrlabl> e <attalias>Nome da UF</attalias>, o ogrinfo -al -so long/long.shp imprime nome_da_unidade_federativa: String (50.0), alternative name="Nome da UF". O nome de 26 caracteres é o nome do campo, não um alias de exibição: ogr2ogr -f GPKG alias.gpkg long/long.shp produz um GeoPackage cuja coluna é nome_da_unidade_federativa, com Nome da UF carregado junto como o nome alternativo. O .dbf era byte a byte idêntico antes e depois; só o sidecar fez a diferença.

As condições: todo campo precisa estar listado, e na ordem do DBF. Um sidecar com um único <attr> para o campo longo — nosso controle negativo — é descartado e a camada continua lendo nome_da_un; e é descartado em silêncio, porque o caminho de menos campos no leitor não imprime nada nem sob ogrinfo --debug on. Duas outras rejeições falam: um sétimo <attr> imprime More fields in .shp.xml than in .dbf, e um rótulo longo cujos cinco primeiros caracteres diferem de um nome de dez caracteres no .dbf imprime For field at index 5, mismatch between .shp.xml name (unidade_federativa_nome) vs .dbf name (nome_da_un) (a verificação é pulada quando o nome no .dbf tem menos de dez caracteres — um campo curto rotulado com um nome longo é descartado tão silenciosamente quanto o sidecar parcial). Não existe uma opção para isso — o ogrinfo --format 'ESRI Shapefile' não lista nenhuma; o arquivo é lido sempre que está ali. O leitor foi feito para o arquivo de metadados que o ArcGIS escreve, que é de onde vêm esses aliases; uma exportação do GDAL não escreve nenhum (ls long/.dbf .prj .shp .shx).

O que o visualizador no navegador mostra

Solte o arquivo com o nome cortado dentro do shapefile-viewer como um zip — .shp, .shx, .dbf, .prj e até o .shp.xml completo dentro — e o painel de camadas lê 27 polígonos e 6 campos; o cabeçalho da tabela de atributos, depois de Número da linha e Tipo, é CD_UF, NM_UF, SIGLA_UF, NM_REGIAO, AREA_KM2, nome_da_un. A célula nome_da_un da primeira linha traz Acre, o mesmo valor do seu NM_UF: o dado passou, só o nome foi cortado. O parser do visualizador, o shpjs, nunca abre um sidecar (grep -c 'shp.xml' node_modules/shpjs/lib/index.js0), então o cabeçalho mostra o que o .dbf diz, seja lá o que o .shp.xml ao lado diga. As versões em inglês e em espanhol da ferramenta mostram o mesmo cabeçalho: nomes de coluna são suas chaves, ao pé da letra, em qualquer idioma.

Quando abandonar o Shapefile

O mesmo alias escrito nos outros dois formatos mantém o nome: ogr2ogr -f GPKGnome_da_unidade_federativa: String (50.0), e ogr2ogr -f GeoJSON"nome_da_unidade_federativa":"Acre" como chave de propriedade em cada um dos 27 estados, sem nome_da_un em lugar nenhum do arquivo. O post de comparação mediu os três formatos lado a lado em "Nomes de campos"; o guia de GeoPackage é por onde começar se o time puder migrar.

O fato final é a ida e volta. Convertendo o Shapefile com o nome cortado de volta com ogr2ogr -f GPKG back.gpkg long/long.shp — sem sidecar ao lado — dá um GeoPackage cujo campo continua nome_da_un, e grep -c 'nome_da_unidade_federativa' back.gpkg retorna 0. O nome não está escondido em algum lugar do arquivo; ele nunca foi escrito, e nenhuma conversão posterior consegue inventá-lo. Se você precisar entregar um Shapefile, renomeie os campos para dez caracteres ou menos antes de exportar, para que você escolha as abreviações, mantenha o GeoPackage como a cópia mestra, e trate o Shapefile como uma exportação com perdas.

Arquivos de teste que você pode usar

O dataset é a malha estadual do IBGE de 2022, 13.717.460 bytes, SHA-256 282ec7f0f0beeeead45e6609f4ffffce161bda04cb8ee0afcad2316d1c841bcb; a listagem do diretório não imprime nenhuma linha de licença, então credite o IBGE e confira os termos do portal antes de republicar.

Para fazer a variante quebrada, converta uma vez para GeoPackage (ogr2ogr -f GPKG uf.gpkg BR_UF_2022.shp) e exporte com o alias: ogr2ogr -f "ESRI Shapefile" long/long.shp uf.gpkg -sql "SELECT *, NM_UF AS nome_da_unidade_federativa FROM BR_UF_2022". Compacte os quatro arquivos em um zip e solte-os no visualizador.

Para times

Um nome de campo cortado em dez caracteres é um detalhe pequeno até o formulário construído em cima dele ter vinte deles e ninguém mais lembrar o que era nome_da__2. O Geodocs mantém os nomes de campo que seu time escreveu, com os acentos, em um mapa compartilhado onde o dado é coletado e revisado; a questão do Shapefile só aparece na exportação, quando você já sabe quais dez caracteres manter.

Artigos Relacionados

Navegação