Encoding Probleme mit ogr2ogr und Postgis / PostgreSQL-Datenbank
-
21-09-2019 - |
Frage
In unserer Organisation behandeln wir GIS Inhalt in verschiedenen Dateiformaten. Ich brauche diese Dateien in eine PostGIS Datenbank zu setzen, und das ist mit ogr2ogr getan. Das Problem ist, dass die Datenbank UTF8 codiert, und die Dateien möglicherweise eine andere Codierung haben.
Ich fand Beschreibungen, wie ich die Codierung durch Hinzufügen eines Option Parameter org2ogr angeben kann, aber appearantly hat es keine Auswirkung hat.
ogr2ogr -f PostgreSQL PG:"host=localhost user=username dbname=dbname \
password=password options='-c client_encoding=latin1'" sourcefile;
Der Fehler Ich erhalte ist:
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".
Derzeit meine Quelldatei ist eine Form-Datei und ich bin mir ziemlich sicher, dass es Latin1 codiert werden.
Was mache ich falsch hier und können Sie mir helfen?
Mit freundlichen Grüßen Casper
Lösung
Das klingt wie es die Kodierung des Clients auf LATIN1 gesetzt würde. Genau das, was Fehler bekommen Sie?
Für den Fall, ogr2ogr es nicht zusammen richtig nicht passiert, können Sie auch versuchen, die Umgebungsvariable PGCLIENTENCODING
zu latin1
Einstellung.
Ich schlage vor, Sie überprüfen, dass sie tatsächlich LATIN1 sind. Einfach file
eine gute Idee, die darauf ausgeführt werden Sie, es ist tatsächlich konsistent innerhalb der Datei übernehmen. Sie können auch versuchen, es durch iconv
sendet es entweder LATIN1 oder UTF8 zu konvertieren.
Andere Tipps
Magnus ist richtig, und ich werde die Lösung hier diskutieren.
Ich habe die Option gesehen PostgreSQL über Zeichenkodierung, options=’-c client_encoding=xxx’
, verwendet viele Orte zu informieren, aber es scheint keine Wirkung zu haben. Wenn jemand weiß, wie dieser Teil funktioniert, fühlen Sie sich frei zu erarbeiten.
Magnus vorgeschlagen, um die Umgebungsvariable PGCLIENTENCODING auf LATIN1 einzustellen. Dies kann nach einer Mailing-Liste I abgefragt, durch Modifizieren der Aufruf an ogr2ogr getan werden:
ogr2ogr -–config PGCLIENTENCODING LATIN1 –f PostgreSQL
PG:”host=hostname user=username dbname=databasename password=password” inputfile
Das hat nichts für mich. Was für mich gearbeitet wurde, um, vor dem Aufruf von ogr2ogr, zu:
SET PGCLIENTENCODING=LATIN1
Es wäre toll, mehr Details von erfahrenen Benutzern zu hören, und ich hoffe, dass es andere helfen kann:)
Derzeit OGR von GDAL führt keine Umcodierung von Zeichendaten während der Übersetzung zwischen Vektorformate. Das Team hat bereit RFC 23.1: Unicode-Unterstützung in OGR Dokument, das für OGR Unterstützung Umkodierung diskutiert Fahrer. Die 23 RFC wurde angenommen und die Kernfunktionalität war bereits in GDAL 1.6.0 freigegeben. Allerdings haben die meisten von OGR-Treiber nicht aktualisiert worden ist, einschließlich Shape-Datei Treiber .
Zur Zeit ist, würde ich OGR beschreiben als kodieren, Agnostiker und unwissend. Es bedeutet, OGR nimmt was er bekommt und sendet sie ohne Verarbeitung aus. OGR verwendet char-Typ Textdaten zu manipulieren. Das ist gut Mehrbyte-codierte Zeichenfolge zu verarbeiten (wie UTF-8) -. Es ist nur ein einfacher Strom von Bytes als Array von char Elementen gespeichert
Es wird empfohlen, dass die Entwickler von OGR Treiber sollten UTF-8 kodierten Strings von Attributwerten zurückzukehren, aber diese Regel wurde nicht weit über OGR Fahrer angenommen, wodurch diese Funktionalität nicht Endabnehmer noch bereit.
Sie benötigen eine Befehlszeile wie folgt schreiben:
PGCLIENTENCODING=LATIN1 ogr2ogr -f PostgreSQL PG:"dbname=...
Ein Fenster ist ein Befehl
SET PGCLIENTENCODING = LATIN1
Unter Linux
export PGCLIENTENCODING = LATIN1
oder
PGCLIENTENCODING = LATIN1
Darüber hinaus diese Diskussion Hilfe mir:
Unter Windows
SET PGCLIENTENCODING = LATIN1 ogr2ogr ...
Sie gibt mir keine Fehler, aber ogr2ogr nicht funktioniert ... Ich muß die Systemvariable ändern (zB System -> Erweiterte Systemeinstellungen -> Umgebungsvariablen -> Neuer Systemvariable) das System neu starten und dann laufen
ogr2ogr ...
Ich löste dieses Problem mit diesem Befehl:
pg_restore --host localhost --port 5432 --username postgres --dbname {DBNAME} --schema public --verbose "{FILE_PATH to import}"
Ich weiß nicht, ob dies die richtige Lösung ist, aber es funktioniert für mich.