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

Foi útil?

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:

https://gis.stackexchange.com/questions/218443/ogr2ogr-encoding-on-windows-using-os4geo-shell-with-census-data

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top