Formato Shapefile: O Guia Completo e Definitivo
Alguém te mandou "um shapefile" e é uma pasta com cinco arquivos de mesmo nome. Ou uma camada que você exportou do QGIS aparece no meio do Atlântico. Ou um colega abriu a sua tabela de atributos e todo acento virou é. Este guia é para quem precisa resolver isso hoje, e para o desenvolvedor a quem disseram para "simplesmente suportar Shapefiles" e que quer saber no que está se metendo. A versão curta primeiro: um Shapefile é o formato vetorial da ESRI dos anos 1990 — um .shp com a geometria, um .dbf com os atributos, um índice .shx e, na prática, um .prj com o sistema de coordenadas, todos com o mesmo nome-base.
Tudo o que é factual nesta página foi testado, não copiado. Construímos Shapefiles a partir de GeoJSON com o GDAL 3.13.3 "Iowa City", apagamos os arquivos-satélite um de cada vez, lemos os bytes do .dbf com um leitor hex, forçamos erros de encoding de propósito e citamos os erros exatos que o GDAL imprime. Quando uma afirmação vem da ESRI Shapefile Technical Description (julho de 1998) em vez do nosso terminal, a gente avisa. Tudo aqui foi verificado em 10 de setembro de 2026.
Uma coisa logo de cara: o Shapefile é um formato dos anos 1990 que continua sendo a forma mais amplamente aceita de trocar dados vetoriais, e a sua especificação está congelada, então nenhum dos seus problemas será corrigido. Este guia não está aqui para te dizer para parar de usá-lo. Está aqui para você saber exatamente quais dos seus dados ele vai destruir, e como tirar os dados de lá intactos.
O que é um Shapefile: os arquivos .shp, .shx, .dbf e .prj
Um Shapefile não é um arquivo. É um conjunto de arquivos que compartilham o mesmo nome-base e diferem pela extensão, e um leitor precisa de vários deles ao mesmo tempo. O Shapefile "quebrado" mais comum é um arquivo enviado sem os outros.
.shp— obrigatório. A geometria. Cada registro é um código de tipo de forma seguido de coordenadas. Não há dado de atributo aqui, nem sistema de coordenadas..shx— obrigatório. Um índice de largura fixa: para cada registro, o seu deslocamento em bytes dentro do.shp, para que um leitor possa pular direto para uma feição..dbf— obrigatório. A tabela de atributos, no formato dBASE. O registro n no.dbfpertence à forma n no.shp; nada além da posição os liga..prj— obrigatório na prática. Um arquivo de texto de uma linha com o sistema de referência de coordenadas em WKT. A especificação de 1998 não o menciona, motivo pelo qual tantos Shapefiles antigos são distribuídos sem ele e pelo qual "minha camada está no oceano" é a pergunta de suporte mais comum em GIS..cpg— opcional. Um arquivo de texto de uma linha nomeando o encoding do.dbf, por exemploUTF-8. Sem ele, os leitores chutam..sbne.sbx— opcional. O índice espacial da ESRI; o ArcGIS os escreve, ferramentas baseadas em GDAL os leem mas nunca os escrevem, então eles ficam desatualizados depois da primeira edição feita em outro lugar..qix— opcional. O índice espacial aberto escrito pelo GDAL, QGIS e MapServer. Criamos um comogrinfo src.shp -sql "CREATE SPATIAL INDEX ON src"e umsrc.qixapareceu ao lado do.shp..shp.xml— opcional. Metadados do ArcGIS (título, resumo, linhagem) em XML. O ArcGIS também guarda ali os aliases dos campos, e o GDAL 3.13 ou mais novo lê o.shp.xmlpara restaurar nomes de campo com mais de 10 caracteres e os aliases; um Shapefile escrito pelo GDAL não tem esse arquivo (nenhuma das nossas exportações produziu um)..aine.aih— opcional. Arquivos antigos de índice de atributos do ArcView. Você pode apagá-los.
Compacte-os juntos num zip e você tem um Shapefile portátil; o GDAL e o nosso visualizador leem o zip diretamente. Rodamos ogrinfo -so /vsizip/src.zip num zip contendo os cinco arquivos acima e ele listou 1: src (Point) exatamente como faz com os arquivos soltos.
Se o .shx estiver faltando
O GDAL recusa abrir a camada: ERROR 4: Unable to open src.shx or src.SHX. Set SHAPE_RESTORE_SHX config option to YES to restore or create it. O .shx pode ser reconstruído a partir do .shp, então a correção é o que a mensagem diz: ogrinfo -so src.shp --config SHAPE_RESTORE_SHX YES reconstruiu o índice, e depois disso havia um novo src.shx na pasta. Qualquer ferramenta baseada em GDAL, QGIS incluído, aceita a mesma opção.
Para as outras seis formas de um arquivo faltando quebrar um Shapefile, medidas no visualizador e no GDAL, leia Faltou o .shx ou o .dbf: por que o Shapefile não abre.
Se o .dbf estiver faltando
A camada ainda abre, e essa é a armadilha. Apagamos o .dbf e ogrinfo -al -so src.shp reportou Geometry: Point, Feature Count: 2 e o CRS completo, com zero campos. Formas no mapa, sem atributos, sem aviso. Se "os atributos sumiram", verifique o .dbf primeiro.
Se o .prj estiver faltando
A geometria abre, os atributos abrem, e o sistema de coordenadas é desconhecido. O GDAL imprime Layer SRS WKT: seguido de (unknown). Um GIS de desktop vai ou te perguntar por um CRS, assumir um, ou carregar a camada com um CRS desconhecido e um ponto de interrogação ao lado — o QGIS faz qualquer uma das três conforme as suas configurações — e se o arquivo está em metros UTM, uma camada tratada como graus não cai nem perto do mapa. A seção sobre o .prj abaixo é sobre esse caso.
Para o passo a passo — o que o GDAL, o QGIS e o nosso visualizador mostram para um arquivo sem .prj, como descobrir em qual CRS os números realmente estão, e a diferença entre atribuir e reprojetar — leia Shapefile no lugar errado: falta o .prj.
Se o .cpg estiver faltando
O arquivo abre e o texto pode estar errado. O cabeçalho do .dbf tem um byte de "language driver" no offset 29; o padrão do GDAL é 87, que ele trata como Latin-1 (o log de debug dele diz Treating as encoding 'ISO-8859-1'). Se os dados eram na verdade UTF-8, ou o leitor ignora o byte, os caracteres acentuados saem como mojibake. A seção do .dbf abaixo mostra os bytes.
Um tipo de geometria por arquivo
O cabeçalho do .shp carrega um tipo de forma para o arquivo inteiro, e cada registro precisa corresponder a ele. A especificação de 1998 define catorze códigos de tipo de forma: 0 para Null; 1, 3, 5 e 8 para Point, PolyLine, Polygon e MultiPoint; os mesmos quatro com Z (11, 13, 15, 18) e com M (21, 23, 25, 28); e 31 para MultiPatch, um tipo de superfície 3D da ESRI que quase nenhuma ferramenta aberta escreve. Na prática você encontra quatro tipos de arquivo — pontos, linhas, polígonos, multipontos — mais as suas variantes 3D.
Uma camada GeoJSON ou GeoPackage pode misturar pontos e linhas. Um Shapefile não pode. Convertemos um GeoJSON contendo um Point e uma LineString com ogr2ogr -f "ESRI Shapefile" out mixed.geojson. O GDAL criou um Shapefile de pontos a partir da primeira feição e então parou, imprimindo ERROR 1: Attempt to write non-point (LINESTRING) geometry to point shapefile., ERROR 1: Unable to write feature 1 from layer mixed. e Terminating translation prematurely after failed translation of layer mixed (use -skipfailures to skip errors). O código de saída foi 1 e a saída continha uma feição. Se você precisa dos dois, precisa de dois Shapefiles; se você só precisa que termine, -skipfailures ainda imprime o mesmo ERROR 1 para cada feição incompatível, mas a descarta e sai com 0, então leia o log antes de confiar na contagem.
Duas sutilezas que não parecem a regra, mas são:
- Um arquivo de polígonos guarda polígonos simples e multipartes lado a lado. O formato não tem um tipo MultiPolygon separado; um registro Polygon simplesmente tem mais de um anel. O GDAL lê os dois casos de volta como
POLYGONeMULTIPOLYGONna mesma camada, e é disso que o PostGIS e o QGIS reclamam como "tipos de geometria mistos" na importação. A correção éogr2ogr -f GPKG out.gpkg in.shp -nlt PROMOTE_TO_MULTI; rodamos e a camada do GeoPackage saiu comoMulti Polygondo início ao fim. - Formas Null são válidas em qualquer arquivo. Um registro com tipo de forma
0significa "atributos, sem geometria". Exportamos uma feição cuja geometria eranullpara um Shapefile de pontos e lemos o.shpbruto: o registro 1 tinha tipo de forma1, o registro 2 tinha tipo de forma0, e oogrinfolistou os dois, o segundo com atributos e semPOINT. Alguns visualizadores descartam essas linhas; conte as suas feições depois da importação.
As variantes Z e M guardam uma elevação e uma "medida" por vértice. O GDAL as escreve quando pedido: ogr2ogr -f "ESRI Shapefile" out in.geojson -nlt POINTZ produziu um arquivo que o ogrinfo reporta como src (3D Point). A maioria das ferramentas web achata o Z na leitura.
O .prj e a camada no oceano
O .prj é uma única linha de WKT no dialeto da ESRI para o formato 1.0. Para WGS 84, o GDAL escreve GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] — repare nos prefixos GCS_ e D_ e na ausência da cláusula AUTHORITY. Um .prj da ESRI não carrega o código EPSG; os leitores comparam os parâmetros com um banco de dados para recuperá-lo. Normalmente funciona; quando os parâmetros estão levemente errados, você recebe um "CRS customizado" com a forma certa e o nome errado.
O sintoma que todo mundo conhece: a camada carrega sem erro e aparece a milhares de quilômetros de distância, muitas vezes na latitude 0, longitude 0 na costa da África Ocidental — "no meio do oceano". Quase sempre as coordenadas são metros projetados com northings de sete dígitos, e o leitor está tratando-as como graus porque o .prj estava faltando ou errado.
Existem duas correções diferentes e elas não são intercambiáveis:
- Atribuir um CRS quando as coordenadas estão corretas e só falta o rótulo. Isso reescreve o
.prje não toca nas coordenadas.ogr2ogr -f "ESRI Shapefile" fixed in.shp -a_srs EPSG:31982— rodamos num arquivo sem.prje o ponto permaneceu emPOINT (-48.5 -27.6)enquanto o novo.prjdeclaravaSIRGAS_2000_UTM_Zone_22S. (O que, para uma coordenada em graus, agora é uma mentira. Atribuir o CRS errado é a segunda forma mais comum de colocar uma camada no oceano.) - Reprojetar quando as coordenadas estão corretas em um CRS e você precisa delas em outro. Isso transforma cada vértice.
ogr2ogr -f "ESRI Shapefile" out in.shp -s_srs EPSG:4326 -t_srs EPSG:31982— o mesmo ponto virouPOINT (746752.990849492 6944611.29529316), em metros.
No QGIS as mesmas duas operações são "Definir SRC da camada…" (atribuir) e "Exportar → Salvar feições como…" com um CRS diferente (reprojetar), e escolher a errada produz o mesmo desastre a partir do desktop. Se você não tem certeza de qual é o CRS de um arquivo, cole um dos seus pares de coordenadas no nosso conversor de coordenadas e teste sistemas candidatos até o ponto cair em algum lugar que você reconheça.
Datums regionais que você vai encontrar em arquivos .prj
Os nomes abaixo são o que o gdalsrsinfo reporta para cada código na nossa máquina; o .prj vai mostrar a grafia da ESRI, com underscores.
EPSG:4674— SIRGAS 2000, geográfico. O datum oficial do Brasil e da maior parte da América do Sul, mantido pelo IBGE; para fins práticos coincide com o WGS 84. É o código que você deve esperar ver em qualquer levantamento brasileiro recente.EPSG:31982— SIRGAS 2000 / UTM zona 22S, eEPSG:31983para a zona 23S. Juntas, essas duas cobrem a maior parte de São Paulo, Paraná, Santa Catarina e Rio de Janeiro; a série3197x/3198xcontinua pelas outras zonas do Brasil. São os dois códigos que você mais vai atribuir e reprojetar no dia a dia, porque boa parte dos dados de campo brasileiros nasce em uma dessas duas faixas.EPSG:4618— SAD69, geográfico. O datum brasileiro que o SIRGAS 2000 substituiu; Shapefiles municipais e de concessionárias mais antigos ainda estão nele, com as zonas UTMEPSG:29192(22S) eEPSG:29193(23S). SAD69 e SIRGAS 2000 diferem por dezenas de metros, então "está perto o suficiente" não é uma resposta válida.EPSG:4225— Córrego Alegre 1970-72, geográfico. O datum anterior ao SAD69; você o encontra em mapas cadastrais antigos e em Shapefiles digitalizados a partir deles. Entre SAD69, Córrego Alegre e o SIRGAS 2000 atual, um arquivo .prj sem AUTHORITY de uma prefeitura brasileira pode estar declarando qualquer um dos três, e é o IBGE quem mantém as tabelas de transformação entre eles.
Fora do Brasil, o EPSG:4326 (WGS 84, geográfico — o que receptores de GPS, GeoJSON e mapas web esperam; um .prj dizendo GCS_WGS_1984 é este), o EPSG:3857 (Pseudo-Mercator, a projeção dos tiles de mapa web) e o EPSG:4269 (NAD83, o padrão dos dados públicos dos Estados Unidos) aparecem com menos frequência nos seus dados, junto com as zonas UTM em WGS 84 — EPSG:32622 para a zona 22N e EPSG:32722 para a 22S, com as séries 326xx e 327xx cobrindo as demais.
Nos vizinhos latino-americanos:
EPSG:4686— MAGNA-SIRGAS, geográfico. O datum nacional da Colômbia.EPSG:9377— MAGNA-SIRGAS 2018 / Origen-Nacional. A projeção nacional única da Colômbia, substituindo as origens regionais mais antigas.EPSG:5340— POSGAR 2007, geográfico. O datum nacional da Argentina; as zonas projetadas vão deEPSG:5343aEPSG:5349(Argentina 1 a 7, Gauss-Krüger).EPSG:5360— SIRGAS-Chile 2002, geográfico. O Chile re-realiza o seu referencial a cada poucos anos, então arquivos mais recentes podem dizer SIRGAS-Chile 2010, 2013, 2016 ou 2021.EPSG:6365— Mexico ITRF2008, geográfico. O referencial nacional mexicano atual.
Se um .prj citar um destes e a camada ainda cair no oceano, o código errado provavelmente foi atribuído na exportação; teste os candidatos vizinhos antes de mexer nos dados.
O .dbf é onde dói
O lado da geometria de um Shapefile é apenas antigo. O lado dos atributos é onde os seus dados são danificados, silenciosamente, na saída. Empurramos um dataset pequeno — um campo chamado observation_notes, um valor UTF-8 de São João, um NULL, uma string vazia, uma nota de 300 caracteres e um timestamp ISO — através do ogr2ogr e lemos de volta o que sobreviveu.
Nomes de campo são cortados em 10 caracteres
O cabeçalho dBase guarda cada nome de campo em 11 bytes, um dos quais é um terminador. O GDAL avisa e então renomeia: Warning 6: Normalized/laundered field name: 'observation_notes' to 'observatio'. Quando dois nomes colidem, ele inventa um sufixo — observation_notes_final virou observat_1. Uma versão anterior deste guia dizia que Populacao_2026 vira Populaca_26; testamos isso, e está errado. O GDAL mantém os primeiros dez caracteres, então vira Populacao_. Seja o que for que a sua ferramenta faça, o ano se foi.
Isso é permanente. Converter o Shapefile de volta para GeoPackage nos deu campos ainda chamados observatio e observat_1. Os nomes não estão escondidos em lugar nenhum; eles nunca foram escritos.
Para a regra de colisão medida num segundo dataset, e o que um .shp.xml completo consegue e não consegue restaurar, leia Nome de coluna cortado em 10 caracteres.
Latin-1 por padrão, e o arquivo-satélite .cpg
Com um ogr2ogr -f "ESRI Shapefile" out in.geojson simples, o GDAL não escreveu nenhum arquivo .cpg, ajustou o byte de language driver no offset 29 para 87, e guardou São João como os bytes Latin-1 Jo\xe3o — a sequência UTF-8 não está em lugar nenhum do arquivo. O GDAL relê a própria saída corretamente porque ele respeita esse byte (a opção ENCODING do driver tem como padrão LDID/87). Um leitor que assume UTF-8 — a maioria do código web, a maioria dos scripts que abrem o .dbf diretamente — mostra Jo�o; uma ferramenta que recodifica o texto Latin-1 como UTF-8 e o exibe como Latin-1 mostra João, o dano estilo é em toda tabela de atributos latino-americana.
A correção do lado da escrita é uma opção: ogr2ogr -f "ESRI Shapefile" out in.geojson -lco ENCODING=UTF-8. A saída então inclui um src.cpg cujo conteúdo inteiro é UTF-8, o byte do cabeçalho é 0, e os bytes guardados são Jo\xc3\xa3o, UTF-8 genuíno. Do lado da leitura, quando alguém te entrega um arquivo Latin-1 cujo byte de cabeçalho não diz nada (0) e que não tem .cpg, diga ao GDAL: ogr2ogr -f GPKG out.gpkg in.shp --config SHAPE_ENCODING ISO-8859-1. Zeramos o byte de language driver do nosso próprio arquivo para reproduzir esse caso: sem a opção o GDAL leu S�o Jo�o, com ela São João voltou. (No arquivo como o GDAL o escreveu, byte de cabeçalho 87, a opção não muda nada — o GDAL já lê aquilo como Latin-1.)
Para as duas direções de mojibake reproduzidas no visualizador, mais a correção de uma linha com o .cpg, leia Acentos errados num Shapefile: .cpg, Latin-1 e UTF-8.
NULL e string vazia são a mesma coisa
O .dbf não tem marcador de NULL. Um campo de texto não definido é preenchido com espaços, e uma string vazia também. Escrevemos duas feições, uma com nota definida como null e outra com nota definida como ""; no .dbf os dois registros continham oitenta espaços, byte a byte idênticos, e o ogrinfo leu os dois de volta como (null). Depois de uma ida e volta pelo GeoPackage, o SQLite reportou typeof(nota) como null para os dois. "Não medido" e "medido, vazio" viraram um único valor, e a diferença não pode ser recuperada. Campos numéricos têm o mesmo problema de outra forma: alguns escritores guardam um número não definido como espaços em branco, outros como 0, e um leitor não consegue diferenciar o segundo de um zero de verdade.
254 caracteres de texto, datas sem hora, e números como texto
Um campo de caractere tem uma largura de um byte, então o teto é 254 caracteres. A nossa nota de 300 caracteres produziu Warning 1: Value '…' of field long_text has been truncated to 254 characters. This warning will not be emitted any more for that layer. — leia a última frase: a primeira truncagem é anunciada, toda truncagem seguinte é silenciosa. O campo voltou como String (254.0), contendo exatamente 254 caracteres.
Existe um tipo de data, D, e ele guarda uma data de calendário e nada mais. Um valor 2026-09-10 virou d: Date e sobreviveu. Um timestamp não: Warning 6: Field dt created as String field, though DateTime requested., e o campo virou String (29.0) — texto que toda ferramenta seguinte precisa parsear e torcer. Não há fuso horário e não há hora. Existe, sim, um booleano, apesar do que você já deve ter lido: o tipo lógico L existe, e um campo true/false que exportamos voltou como Integer(Boolean) com os valores 1 e 0. Essa reclamação específica é um mito.
Números são guardados como texto ASCII com uma largura e precisão fixas. Um campo de ponto flutuante voltou como Real (24.15) — 24 caracteres, 15 decimais — e o valor que escrevemos, 0.1234567890123456789, voltou como 0.123456789012346. Inteiros viram Integer (9.0) ou Integer64 (18.0), dependendo do tamanho. Isso é aceitável para medições e errado para identificadores que precisam corresponder exatamente.
2 GB, e o GDAL não vai te impedir
O .shp guarda os offsets como contagens de 32 bits de palavras de 16 bits e o .dbf não tem offset nenhum, então a própria spec não para nos 2 GB — esse teto é o que o software da ESRI e a maioria dos leitores impõem, e é o número para o qual todo mundo projeta. O que nós verificamos foi a atitude do GDAL: a opção de criação 2GB_LIMIT tem NO como padrão, então o GDAL escreve além do limite (com um único aviso ao cruzá-lo) e o próximo programa é quem falha — o ArcGIS, um MapServer antigo, um formulário de upload com limite de tamanho. Dados perto desse tamanho não deveriam ser um Shapefile. O nosso guia de GeoPackage cobre o formato que resolve todos os problemas desta seção, com os mesmos experimentos do lado oposto.
Como abrir um Shapefile sem o QGIS
Você não precisa de um GIS de desktop para olhar um Shapefile, ler os seus atributos ou descobrir em qual CRS ele está.
- Compacte os arquivos-satélite juntos. Selecione o
.shp,.shx,.dbfe.prj(e o.cpg, se houver), e compacte-os num único.zip. Não compacte a pasta que os contém; compacte os arquivos. Um.shpsozinho mostra formas sem atributos. - Arraste o zip para dentro do visualizador. Solte-o no nosso visualizador gratuito de Shapefile: ele aceita um
.zip, um.shpsozinho, ou o.shpmais.dbfmais.prjsoltos juntos, e desenha as feições num mapa. Clique numa feição para ler os seus atributos, área ou comprimento e copiar o seu WKT; abra a tabela de atributos para buscar e ordenar o arquivo inteiro; escolha uma coluna como rótulo do mapa. Até dez arquivos carregam lado a lado, que é a forma mais rápida de ver se duas camadas realmente se sobrepõem. - Exporte direto do navegador. O visualizador escreve GeoJSON, KML e CSV, então "converter esse Shapefile para GeoJSON" é um arrastar e um clique, sem nada instalado.
- Privacidade. Todo o parsing acontece no seu navegador. Nenhum arquivo é enviado a nenhum servidor; os seus arquivos nunca saem do seu dispositivo. É isso que torna a ferramenta usável em dados que você não tem permissão de enviar para lugar nenhum.
No terminal, ogrinfo -so in.shp lista a camada e o seu tipo de geometria, e ogrinfo -al -so in.shp acrescenta os campos, a extensão e o CRS sem imprimir nenhuma feição. Os dois vêm com o GDAL, um único pacote para instalar no Linux, macOS e Windows.
Convertendo a partir do Shapefile
Todo comando desta seção foi executado contra arquivos reais antes da publicação, com o GDAL 3.13.3.
- Shapefile para GeoPackage:
ogr2ogr -f GPKG out.gpkg in.shp. Os nomes de campo ficam como o.dbfos tem (já truncados), o texto vira UTF-8 de verdade, e os NULLs são o que quer que o Shapefile conseguisse expressar, que não é muito. O guia de GeoPackage cobre o que fazer a seguir. - Shapefile para GeoPackage quando a fonte está em Latin-1 (assuma que está, a não ser que exista um
.cpgdizendo o contrário):ogr2ogr -f GPKG out.gpkg in.shp --config SHAPE_ENCODING ISO-8859-1. - Shapefile para GeoJSON para a web — sempre reprojete, a especificação do GeoJSON exige WGS 84:
ogr2ogr -f GeoJSON -t_srs EPSG:4326 out.geojson in.shp. A saída declaraurn:ogc:def:crs:OGC:1.3:CRS84. Se a entrada não tiver.prj, o comando falha comERROR 1: Can't transform coordinates, source layer has no coordinate system. Use -s_srs to set one.— acrescente-s_srscom o CRS que você já estabeleceu. - Corrija polígonos simples e multipartes misturados de passagem:
ogr2ogr -f GPKG out.gpkg in.shp -nlt PROMOTE_TO_MULTI. - Shapefile para KML para o Google Earth:
ogr2ogr -f KML out.kml in.shp. O driver de KML reprojeta para WGS 84 sozinho — o nosso arquivo em UTM saiu com<coordinates>-48.5,-27.6— e escreve os atributos dentro de cada placemark. Um KMZ é o mesmo KML dentro de um zip; construir e abrir um está coberto no nosso guia de como visualizar KMZ online. - Escrevendo um Shapefile sem quebrar os acentos:
ogr2ogr -f "ESRI Shapefile" out_dir in.gpkg -lco ENCODING=UTF-8. Você ainda vai perder os nomes de campo além de dez caracteres e todo timestamp; a opção só corrige o encoding. - Só algumas feições:
ogr2ogr -f GPKG out.gpkg in.shp -where "status = 1"filtra por atributos, e-clipsrc xmin ymin xmax ymaxrecorta para uma caixa. - Reconstrua um arquivo de índice perdido:
ogr2ogr -f "ESRI Shapefile" fixed in.shp --config SHAPE_RESTORE_SHX YES. Rodamos numa pasta sem.shx; a cópia emfixedtinha um, e a pasta de origem também passou a ter depois — a opção restaura o índice no lugar.
A flag -nln nomeia a camada de saída em formatos que têm nomes de camada; pule-a e você herda o nome-base do Shapefile, o que é tranquilo até esse nome ser export (2) final.
Erros, decodificados
Cada entrada é sintoma, causa, correção. As mensagens são citadas do GDAL 3.13.3; o QGIS mostra o mesmo texto no seu painel de log.
"Unable to open .shx"
Sintoma: ERROR 4: Unable to open in.shx or in.SHX. Set SHAPE_RESTORE_SHX config option to YES to restore or create it. e a camada não carrega. Causa: o arquivo-satélite de índice não foi copiado junto com o .shp. Correção: ogrinfo -so in.shp --config SHAPE_RESTORE_SHX YES o reconstrói no lugar; depois copie o conjunto inteiro da próxima vez.
"Layer has no CRS" ou (unknown)
Sintoma: ogrinfo imprime Layer SRS WKT: e depois (unknown); o QGIS mostra um ponto de interrogação ao lado da camada ou pede um CRS. Causa: sem .prj. Correção: descubra o que são as coordenadas (dois dígitos antes do ponto são graus, EPSG:4326; eastings de seis dígitos com northings de sete dígitos no Brasil são uma zona 3198x), então atribua, não reprojete: ogr2ogr -f "ESRI Shapefile" fixed in.shp -a_srs EPSG:31982.
"Normalized/laundered field name"
Sintoma: Warning 6: Normalized/laundered field name: 'observation_notes' to 'observatio' na exportação, e um colega depois pergunta o que observat_1 significa. Causa: o limite de 10 caracteres. Correção: nenhuma dentro do .dbf; o ArcGIS guarda o nome longo como alias no .shp.xml, e o GDAL 3.13+ o lê de volta — um Shapefile escrito pelo GDAL não tem esse arquivo. Renomeie os campos para dez caracteres ou menos antes de exportar, para que você escolha as abreviações, ou mantenha um GeoPackage e trate o Shapefile como uma cópia com perdas.
Acentos aparecem como é ou �
Sintoma: São João aparece como São João ou S�o Jo�o. Causa: um .dbf em Latin-1 lido como UTF-8, ou o inverso; não há .cpg para resolver isso. Correção: na leitura, --config SHAPE_ENCODING ISO-8859-1 (ou UTF-8, o que quer que o arquivo realmente seja); na escrita, -lco ENCODING=UTF-8 para que um .cpg seja escrito e o próximo leitor não precise adivinhar.
"File too large" ou um .dbf que outros softwares rejeitam
Sintoma: o GDAL escreveu o arquivo, imprimindo um único aviso ao cruzar os 2 GB; o ArcGIS, um formulário de upload ou uma biblioteca mais antiga o recusa, ou lê lixo depois de alguma feição. Causa: um .shp ou .dbf além de 2 GB, o que o GDAL permite por padrão (2GB_LIMIT=NO). Correção: divida os dados, ou pare de usar Shapefile para isso — ogr2ogr -f GPKG out.gpkg in.shp não tem esse teto.
"Attempt to write non-point geometry to point shapefile"
Sintoma: ERROR 1: Attempt to write non-point (LINESTRING) geometry to point shapefile. seguido de Terminating translation prematurely, e uma saída com menos feições do que a entrada. Causa: a fonte mistura tipos de geometria e um Shapefile guarda um só. Correção: exporte um Shapefile por tipo com o filtro de geometria — ogr2ogr -f "ESRI Shapefile" points in.geojson -where "OGR_GEOMETRY='POINT'" e de novo com 'LINESTRING'; rodamos os dois e obtivemos uma camada Point e uma camada Line String sem erros. Ou mantenha os dados num formato que permita a mistura.
Feições não desenham, ou desenham no oceano
Sintoma: a camada carrega sem erro e fica invisível, ou fica na latitude 0, longitude 0. Causa: um .prj faltando ou errado, então metros projetados são lidos como graus ou o inverso. Correção: verifique ogrinfo -al -so in.shp procurando Layer SRS WKT; compare a linha Extent com o que os números deveriam parecer no CRS que você espera; atribua o CRS certo. Se a extensão estiver certa e a camada ainda estiver invisível, verifique o Feature Count — um arquivo de formas Null não tem nada para desenhar.
Shapefile vs GeoPackage vs GeoJSON
Sem tabela — só escolha a frase que corresponde à sua situação.
Shapefile ainda é a resposta certa quando o outro lado não aceita mais nada. Isso é real e comum: geoportais governamentais, sistemas municipais antigos, softwares de ativos de concessionárias, pacotes de topografia e um bom número de instalações do ArcGIS importam um Shapefile e nada mais, e é o formato com mais chance de abrir numa ferramenta da qual você nunca ouviu falar. Quando essa é a restrição, exporte com -lco ENCODING=UTF-8, escolha os seus nomes de campo de dez caracteres de propósito, envie o .prj junto, e mantenha o original num formato que não perdeu nada.
GeoPackage é a resposta certa quando os dados são seus para guardar: muitas camadas, tipos de geometria misturados, nomes de campo de verdade, NULLs de verdade, timestamps de verdade, um arquivo só com o CRS dentro dele. É o padrão correto para GIS de desktop e trabalho de campo, e o que um Shapefile deveria virar assim que chega.
GeoJSON é a resposta certa quando um navegador ou uma API vai lê-lo, ou um humano precisa abri-lo num editor de texto. Ele está preso ao WGS 84 por especificação, não tem índice e fica pesado depois de alguns megabytes — e nada disso importa para o caso de "mandar esses quarenta pontos para o frontend" para o qual ele existe.
E nenhum deles é certo quando várias pessoas precisam escrever ao mesmo tempo. Isso é um banco de dados, não um arquivo.
Para times que querem a versão medida dessa comparação — tamanhos, limites de nome de campo, encoding, CRS e tempo de carregamento num dataset real — leia Shapefile vs GeoPackage vs GeoJSON: qual usar.
Onde o Geodocs entra
A gente constrói o Geodocs, uma plataforma para times de dados de campo e de GIS, e escrevemos este guia porque boa parte do que os nossos usuários sobem é um Shapefile, e boa parte das conversas de suporte que vêm depois são um dos sete erros acima. Então a plataforma resolve: ela recebe um Shapefile zipado como um único upload, detecta o encoding do .dbf em vez de assumir um, lê o .prj e reprojeta para o mapa, e mantém os dados onde um nome de campo pode ter mais de dez caracteres e um NULL continua sendo um NULL. Se o seu time ainda está mandando pastas de cinco arquivos por e-mail e torcendo para o .prj ter chegado junto, esse é o problema que a gente existe para eliminar.
Encontrou um erro, ou uma armadilha que a gente deixou passar? Fala com a gente. A gente retesta esta página em vez de copiar e colar.
Última verificação: 10 de setembro de 2026, GDAL 3.13.3.