Вопрос

В нашей организации мы обрабатываем содержимое ГИС в различных форматах файлов.Мне нужно поместить эти файлы в базу данных PostGIS, и это делается с помощью ogr2ogr.Проблема в том, что база данных имеет кодировку UTF8, и файлы могут иметь другую кодировку.

Я нашел описания того, как я могу указать кодировку, добавив параметр options в org2ogr, но, похоже, это не имеет эффекта.

ogr2ogr -f PostgreSQL PG:"host=localhost user=username dbname=dbname \
password=password options='-c client_encoding=latin1'" sourcefile;

Ошибка, которую я получаю, заключается в следующем:

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".

В настоящее время мой исходный файл представляет собой файл формы, и я почти уверен, что он закодирован Latin1.

Что я здесь делаю не так, и вы можете мне помочь?

С уважением, Каспер

Это было полезно?

Решение

Похоже, это приведет к установке кодировки клиента на LATIN1.Какую именно ошибку вы получаете?

На случай, если ogr2ogr не передает его должным образом, вы также можете попробовать установить переменную среды PGCLIENTENCODING к latin1.

Я предлагаю вам дважды проверить, что они на самом деле LATIN1.Просто бег file об этом даст вам хорошее представление, если предположить, что он действительно согласован в файле.Вы также можете попробовать отправить его через iconv чтобы преобразовать его в LATIN1 или UTF8.

Другие советы

Магнус прав, и я обсужу решение здесь.

Я видел возможность сообщить PostgreSQL о кодировке символов, options=’-c client_encoding=xxx’, использовал много где, но эффекта вроде нет.Если кто-то знает, как работает эта часть, не стесняйтесь рассказать подробнее.

Магнус предложил установить для переменной среды PGCLIENTENCODING значение LATIN1.Согласно списку рассылки, который я запросил, это можно сделать, изменив вызов ogr2ogr:

ogr2ogr -–config PGCLIENTENCODING LATIN1 –f PostgreSQL 
PG:”host=hostname user=username dbname=databasename password=password” inputfile

Для меня это ничего не дало.Что мне помогло, так это перед вызовом ogr2ogr:

SET PGCLIENTENCODING=LATIN1

Было бы здорово услышать более подробную информацию от опытных пользователей, и я надеюсь, что это поможет другим :)

В настоящее время, ОГР От GDAL не выполняет никакого перекодирования символьных данных при переводе между векторными форматами.Команда подготовилась RFC 23.1:Поддержка Unicode в OGR документ, в котором обсуждается поддержка перекодирования для драйверов OGR.Тот самый Был принят RFC 23 а основная функциональность уже была выпущена в GDAL 1.6.0.Однако большинство драйверов OGR не были обновлены, включая Драйвер шейп-файла.

На данный момент я бы описал OGR как кодирующего агностика и невежду.Это означает, что OGR действительно берет то, что получает, и отправляет это без какой-либо обработки.OGR использует тип char для манипулирования текстовыми данными.Это прекрасно подходит для обработки многобайтовых строк в кодировке (например, UTF-8) - это просто обычный поток байтов, хранящихся в виде массива элементов char.

Рекомендуется, чтобы разработчики драйверов OGR возвращали строки значений атрибутов в кодировке UTF-8, однако это правило не получило широкого распространения в драйверах OGR, что делает эту функциональность еще не готовой для конечного пользователя.

Вам нужно написать командную строку следующим образом:

PGCLIENTENCODING=LATIN1 ogr2ogr -f PostgreSQL PG:"dbname=...

В Windows команда

SET PGCLIENTENCODING=LATIN1

В Linux

экспорт PGCLIENTENCODING=LATIN1

или

PGCLIENTENCODING=LATIN1

Более того, это обсуждение помогает мне:

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

На окнах

SET PGCLIENTENCODING=LATIN1 ogr2ogr...

не выдавайте мне никаких ошибок, но ogr2ogr не работает... Мне нужно изменить системную переменную (например.Система -> Расширенные настройки системы -> Переменные среды -> Новая системная переменная) перезагрузите систему и запустите.

огр2огр...

Я решил эту проблему с помощью этой команды:

pg_restore --host localhost --port 5432 --username postgres --dbname {DBNAME} --schema public --verbose "{FILE_PATH to import}"

Не знаю, правильное ли это решение, но у меня оно сработало.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top