Nombre de columna cortado a 10 caracteres (y qué hacer al respecto)

Respuesta corta: la tabla de atributos de un Shapefile es un archivo dBase, y el encabezado dBase guarda cada nombre de campo en 11 bytes, uno de los cuales es un terminador — 10 caracteres es el techo. GDAL avisa una vez al exportar y corta el nombre; todo lector después ve el nombre corto, porque el largo nunca se escribió. Desde GDAL 3.13 un sidecar .shp.xml puede recuperarlo, pero solo cuando el sidecar lista todos los campos, en orden — y el visor del navegador no lee ningún sidecar. La solución es elegir vos mismo las abreviaturas antes de exportar, o dejar el formato.

Todo lo de abajo fue probado el 16 de septiembre de 2026 con GDAL 3.13.3 y el shapefile-viewer en vivo en static-page-tools@442f8d8; lo que imprimió cada herramienta está citado tal cual. El dataset es la malla 2022 del IBGE de los 27 estados brasileños, cuyos cinco campos — CD_UF, NM_UF, SIGLA_UF, NM_REGIAO, AREA_KM2 — tienen todos nueve caracteres o menos, así que cada truncamiento acá está inducido con un alias -sql. La guía de Shapefile explica el límite bajo "Los nombres de campo se cortan a 10 caracteres"; este post es la reproducción, en GDAL y en el navegador, y la solución.

La advertencia, tal cual

Exportando la malla con un 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 una línea: Warning 6: Normalized/laundered field name: 'nome_da_unidade_federativa' to 'nome_da_un'. ogrinfo -so long/long.shp long lista entonces seis campos, el último nome_da_un: String (50.0) — el ancho vino de NM_UF, el nombre se cortó en diez. El control: el mismo pipeline con un alias de exactamente diez caracteres, NM_UF AS nome_da_un, sale con 0 y sin advertencia, y guarda el nombre tal como está. Es el largo, nada más.

Colisiones: nome_da_un, nome_da__1, nome_da__2

Tres nombres largos que comparten sus primeros diez caracteres, exportados juntos (NM_UF AS nome_da_unidade_federativa, NM_REGIAO AS nome_da_unidade_regional, SIGLA_UF AS nome_da_unidade_sigla), generan tres advertencias y tres nombres cortos distintos:

  • nome_da_unidade_federativa se convirtió en nome_da_un — los primeros diez caracteres, como en el caso simple.
  • nome_da_unidade_regional se convirtió en nome_da__1 — los primeros ocho caracteres más _1; el guion bajo doble está ahí porque el octavo carácter del prefijo ya es _.
  • nome_da_unidade_sigla se convirtió en nome_da__2 — la misma regla, el siguiente contador.

Los anchos siguen la columna de origen, no el alias: nome_da__1 es String (20.0) de NM_REGIAO, nome_da__2 es String (2.0) de SIGLA_UF. Quien abra este archivo el mes que viene ve nome_da__2 y no tiene forma de saber que era la sigla del estado. El observat_1 de la guía es la misma regla en otro dataset.

El sidecar .shp.xml: GDAL 3.13 restaura el nombre, con condiciones

La guía dice que GDAL 3.13 en adelante lee .shp.xml para restaurar nombres de campo más largos que 10 caracteres y sus alias. Lo probamos en 3.13.3, y se confirma — con dos condiciones que una prueba ingenua se pierde.

El sidecar es el archivo de metadatos de ArcGIS, <basename>.shp.xml; el lector recorre sus elementos <attr> en orden, emparejando el n-ésimo <attr> con el n-ésimo campo del .dbf. Con un long.shp.xml escrito a mano que lista los seis campos en el orden del DBF, el sexto con <attrlabl>nome_da_unidade_federativa</attrlabl> y <attalias>Nome da UF</attalias>, ogrinfo -al -so long/long.shp imprime nome_da_unidade_federativa: String (50.0), alternative name="Nome da UF". El nombre de 26 caracteres es el nombre del campo, no un alias de presentación: ogr2ogr -f GPKG alias.gpkg long/long.shp produce un GeoPackage cuya columna es nome_da_unidade_federativa, con Nome da UF viajando como el nombre alternativo. El .dbf era idéntico byte a byte antes y después; la diferencia la hizo solo el sidecar.

Las condiciones: hay que listar todos los campos, y en el orden del DBF. Un sidecar con un solo <attr> para el campo largo — nuestro control negativo — se descarta y la capa sigue leyendo nome_da_un; y se descarta en silencio, porque el camino de menos campos en el lector no imprime nada ni siquiera con ogrinfo --debug on. Otros dos rechazos sí hablan: un séptimo <attr> imprime More fields in .shp.xml than in .dbf, y una etiqueta larga cuyos primeros cinco caracteres difieren de un nombre de diez caracteres en el .dbf imprime For field at index 5, mismatch between .shp.xml name (unidade_federativa_nome) vs .dbf name (nome_da_un) (la verificación se salta cuando el nombre en el .dbf tiene menos de diez caracteres — un campo corto etiquetado con un nombre largo se descarta tan silenciosamente como el sidecar parcial). No hay ningún interruptor para esto — ogrinfo --format 'ESRI Shapefile' no lista ninguna opción; el archivo se lee cada vez que está presente. El lector está hecho para el archivo de metadatos que escribe ArcGIS, que es de donde salen esos alias; una exportación de GDAL no escribe ninguno (ls long/.dbf .prj .shp .shx).

Qué muestra el visor del navegador

Soltá el archivo con el nombre ya normalizado en el shapefile-viewer como zip — .shp, .shx, .dbf, .prj y hasta el .shp.xml completo adentro — y el panel de capas lee 27 polígonos y 6 campos; el encabezado de la tabla de atributos, después de Número de fila y Tipo, es CD_UF, NM_UF, SIGLA_UF, NM_REGIAO, AREA_KM2, nome_da_un. La celda nome_da_un de la primera fila dice Acre, el mismo valor que su NM_UF: el dato llegó, solo se cortó el nombre. El parser del visor, shpjs, nunca abre un sidecar (grep -c 'shp.xml' node_modules/shpjs/lib/index.js0), así que el encabezado muestra lo que dice el .dbf, sea lo que sea lo que diga el .shp.xml al lado. Las versiones en inglés y portugués de la herramienta muestran el mismo encabezado: los nombres de columna son tus claves, tal cual, en cualquier idioma.

Cuándo dejar Shapefile

El mismo alias escrito en los otros dos formatos conserva el nombre: ogr2ogr -f GPKG da nome_da_unidade_federativa: String (50.0), y ogr2ogr -f GeoJSON da "nome_da_unidade_federativa":"Acre" como clave de propiedad en cada uno de los 27 estados, sin ningún nome_da_un en el archivo. El post de comparación midió los tres formatos lado a lado bajo "Nombres de campo"; la guía de GeoPackage es por dónde empezar si el equipo puede migrar.

El dato final es la vuelta completa. Convertir el Shapefile normalizado de vuelta con ogr2ogr -f GPKG back.gpkg long/long.shp — sin sidecar al lado — da un GeoPackage cuyo campo sigue siendo nome_da_un, y grep -c 'nome_da_unidade_federativa' back.gpkg devuelve 0. El nombre no está escondido en algún lugar del archivo; nunca se escribió, y ninguna conversión posterior puede inventarlo. Si tenés que entregar un Shapefile, renombrá los campos a diez caracteres o menos antes de exportar para elegir vos las abreviaturas, mantené el GeoPackage como copia maestra, y tratá el Shapefile como una exportación con pérdida.

Archivos de prueba que podés usar

El dataset es la malla estatal 2022 del IBGE, 13.717.460 bytes, SHA-256 282ec7f0f0beeeead45e6609f4ffffce161bda04cb8ee0afcad2316d1c841bcb; el listado del directorio no imprime ninguna línea de licencia, así que dale crédito al IBGE y revisá los términos del portal antes de republicar.

Para armar la variante rota, convertí una vez a GeoPackage (ogr2ogr -f GPKG uf.gpkg BR_UF_2022.shp) y exportá con el alias: ogr2ogr -f "ESRI Shapefile" long/long.shp uf.gpkg -sql "SELECT *, NM_UF AS nome_da_unidade_federativa FROM BR_UF_2022". Zipeá los cuatro archivos y soltalos en el visor.

Para equipos

Un nombre de campo cortado a diez caracteres es un detalle menor hasta que el formulario armado sobre eso tiene veinte de ellos y nadie se acuerda de qué era nome_da__2. Geodocs mantiene los nombres de campo que escribió tu equipo, con sus tildes, en un mapa compartido donde el dato se recolecta y se revisa; la pregunta del Shapefile aparece recién en la exportación, cuando ya sabés qué diez caracteres conservar.

Artículos Relacionados

Navegação