Problemas de codificação com banco de dados ogr2ogr e Postgis/PostgreSQL
-
21-09-2019 - |
Pergunta
Em nossa organização, lidamos com conteúdo GIS em diferentes formatos de arquivo.Preciso colocar esses arquivos em um banco de dados PostGIS, e isso é feito usando ogr2ogr.O problema é que o banco de dados é codificado em UTF8 e os arquivos podem ter uma codificação diferente.
Encontrei descrições de como posso especificar a codificação adicionando um parâmetro de opções ao org2ogr, mas aparentemente isso não tem efeito.
ogr2ogr -f PostgreSQL PG:"host=localhost user=username dbname=dbname \
password=password options='-c client_encoding=latin1'" sourcefile;
O erro que recebo é:
ERROR 1: ALTER TABLE "soer_vd" ADD COLUMN "målsætning" CHAR(10) ERROR: invalid byte sequence for encoding "UTF8": 0xe56c73 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding". ERROR 1: ALTER TABLE "soer_vd" ADD COLUMN "påvirkning" CHAR(10) ERROR: invalid byte sequence for encoding "UTF8": 0xe57669 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding". ERROR 1: INSERT command for new feature failed. ERROR: invalid byte sequence for encoding "UTF8": 0xf8 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
Atualmente, meu arquivo de origem é um arquivo Shape e tenho certeza de que é codificado em Latin1.
O que estou fazendo de errado aqui e você pode me ajudar?
Atenciosamente, Cásper
Solução
Isso soa como se o cliente codificasse como Latin1. Exatamente que erro você recebe?
Apenas caso o OGR2OGR não o passasse corretamente, você também pode tentar definir a variável de ambiente PGCLIENTENCODING
para latin1
.
Eu sugiro que você verifique se eles são na verdade latim1. Simplesmente correndo file
nele dará uma boa ideia, assumindo que seja realmente consistente dentro do arquivo. Você também pode tentar enviá -lo iconv
para convertê -lo em latim1 ou utf8.
Outras dicas
Magnus está certo e discutirei a solução aqui.
Eu já vi a opção de informar o PostgreSQL sobre a codificação de personagens, options=’-c client_encoding=xxx’
, usou muitos lugares, mas não parece ter nenhum efeito. Se alguém souber como essa parte está funcionando, sinta -se à vontade para elaborar.
Magnus sugeriu definir a variável de ambiente PGCLIENTENCODING para latim1. Isso pode, de acordo com uma lista de e -mails que eu consultei, ser feita modificando a chamada para og2ogr:
ogr2ogr -–config PGCLIENTENCODING LATIN1 –f PostgreSQL
PG:”host=hostname user=username dbname=databasename password=password” inputfile
Isso não fez nada por mim. O que funcionou para mim foi, antes da chamada para OGR2OGR, para:
SET PGCLIENTENCODING=LATIN1
Seria ótimo ouvir mais detalhes de usuários experientes e espero que possa ajudar os outros :)
Atualmente, OGR a partir de Gdal não executa nenhuma recodificação dos dados do caractere durante a tradução entre os formatos vetoriais. A equipe preparou RFC 23.1: Suporte Unicode em OGR Documento que discute o apoio à recodificação para os drivers OGR. o RFC 23 foi adotado e a funcionalidade principal já foi lançada no GDAL 1.6.0. No entanto, a maioria dos motoristas OGR não foi atualizada, incluindo Driver de Shapefile.
Por enquanto, eu descreveria o OGR como codificando agnóstico e ignorante. Isso significa que o OGR pega o que recebe e o envia sem nenhum processamento. OGR usa o tipo de char para manipular dados textuais. É bom lidar com strings codificadas com vários bytes (como o UTF-8)-é apenas um fluxo simples de bytes armazenados como matriz de elementos de char.
Aconsece-se que os desenvolvedores de drivers OGR devam retornar seqüências codificadas do UTF-8 de valores de atributo, no entanto, essa regra não foi amplamente adotada entre os drivers OGR, tornando essa funcionalidade ainda não pronta para o usuário final.
Você precisa escrever sua linha de comando assim:
PGCLIENTENCODING=LATIN1 ogr2ogr -f PostgreSQL PG:"dbname=...
No Windows, um comando é
DEFINIR PGCLIENTENCODING=LATIN1
No linux
exportar PGCLIENTENCODING=LATIN1
ou
PGCLIENTENCODING=LATIN1
Além disso, esta discussão me ajuda:
Nas janelas
SET PGCLIENTENCODING=LATIN1 ogr2ogr...
não me dê nenhum erro, mas ogr2ogr não funciona... preciso alterar a variável do sistema (por exemploSistema -> Configurações avançadas do sistema -> Variáveis de ambiente -> Nova variável de sistema) reinicie o sistema e execute
ogr2ogr...
Eu resolvi esse problema usando este comando:
pg_restore --host localhost --port 5432 --username postgres --dbname {DBNAME} --schema public --verbose "{FILE_PATH to import}"
Não sei se essa é a solução certa, mas funcionou para mim.