09 June 2015

Im letzten Beitrag habe ich gezeigt, wie man einfach und effizient mit einem Kommandozeilenbefehl und dem Java-Tool ili2pg aus INTERLIS-Modellen eine Datenbankstruktur anlegen kann.

Das Schöne an Java und an ili2pg ist, dass man diese Funktionalität jetzt auch in eigenen Java-Code und dementsprechend in einen eigenen Importprozess einbinden kann. Eventuell müssen ja vorgängig Daten bearbeiten werden oder nach dem Import müssen weitere Prozessierungen vorgenommen werden.

Wie das geht? Ganz einfach: Einzig die drei Jar-Dateien ili2c.jar, ili2pg.jar und postgresql-9.1-901.jdbc4.jar müssen im Klassenpfad sein. Mit einer IDE seiner/ihrer Wahl kein Problem. Das kann man sich sogar zusammenklicken.

Ein minimales Java-Programm zum Importieren einer ITF-Datei sieht wie folgt aus:

package org.catais.interlis;

import ch.ehi.ili2db.base.Ili2db;
import ch.ehi.ili2db.base.Ili2dbException;
import ch.ehi.ili2db.gui.Config;
import ch.ehi.ili2pg.converter.PostgisGeometryConverter;
import ch.ehi.sqlgen.generator_impl.jdbc.GeneratorPostgresql;


public class Ili2pgTest {

	public static void main(String[] args) {

        Config config = new Config();
        config.setDbdatabase("xanadu2");
        config.setDbhost("localhost");
        config.setDbport("5432");
        config.setDbusr("stefan");
        config.setDbpwd("ziegler12");
        config.setDbschema("test5");
        config.setModels("DM01AVCH24LV95D");
        config.setModeldir("/home/stefan/Downloads/");

        config.setGeometryConverter(PostgisGeometryConverter.class.getName());
        config.setDdlGenerator(GeneratorPostgresql.class.getName());
        config.setJdbcDriver("org.postgresql.Driver");

        config.setNameOptimization("topic");
        config.setMaxSqlNameLength("60");

        config.setDefaultSrsAuthority("EPSG");
        config.setDefaultSrsCode("2056");

        config.setXtffile("/home/stefan/Downloads/ch_lv95_254900.itf");

        String dburl = "jdbc:postgresql://" + config.getDbhost() + ":" + config.getDbport() + "/" + config.getDbdatabase();
        config.setDburl(dburl);

        try {
            Ili2db ili2pg = new Ili2db();
            ili2pg.runImport(config, "");
        } catch (Ili2dbException e) {
            e.printStackTrace();
        }
    }
}

Man benötigt lediglich zwei Klassen: eine Konfigurationsklasse Config und die eigentliche Importklasse Ili2db. Mittels der Konfigurationsklasse steuert man verschiedene Parameter und in welchen Datenbanktyp importiert werden soll. Dies ist nötig, um gewisse Unterschiede zwischen den Datenbanktypen abzufangen resp. anders zu behandeln.

Zeilen 1 - 22: Diese Zeilen sollten eigentlich selbsterklärend sein.

Zeilen 24 - 26: Hier wird der Konfigurationsklasse mitgeteilt, dass es sich bei der Datenbank um PostgreSQL/Postgis handelt. Dies hat Auswirkungen auf die Konvertierung der Geometrie und auf das Erstellen der SQL-Befehle.

Zeilen 28 - 29: Mit der Methode setNameOptimization("topic") werden die Datenbanktabellennamen zusammengesetzt aus Topic- und Klassennamen (verbunden mit einem Untertrich): topic_class. Mit der Methode setMaxSqlNameLength("60") wird die maximale Länge der SQL-Namen auf 60 Zeichen gesetzt. Das Setzen der maximalen Länge ist wichtig, da der Prozess sonst abbricht.

Zeilen 31 - 32: Wird was anderes als LV03 (EPSG:21781) importiert, muss das hier mittels EPSG-Code definiert werden.

Zeile 34: Hier wird die zu importierende Interlis-Datei angegeben.

Zeilen 36 - 37: Warum das manuelle Zusammensetzen der Datenbankurl noch nötig ist, ist mir nicht ganz klar. Eigentlich kennt die Konfigurationsklasse bereits alle angaben, die dazu benötig werden.

Zeilen 40 - 41: Zu guter Letzt kann die Importklasse instanziiert werden und der Importprozess kann gestartet werden.

Falls keine Fehlermeldungen in der Konsole erscheinen, sollten die Daten erfolgreich importiert worden sein:

pgadmin3

Posted by Stefan Ziegler. | INTERLIS , ili2pg , Java