20. Modul SQLITEOUT - SQLite-Datenbank schreiben

20.1. Allgemeines

Mit dem Skriptmodul können Objekte in eine SQLite-Datenbank geschrieben werden.

Insbesondere werden die Spezifikationen von OGC Geopackages (Vektor-Geometrien) unterstützt.

Der Modul wird mit:

|INCL \script\sqliteout.mod

in einer ICS RUN1-Konfiguration verfügbar gemacht.

20.2. Parametermap SQLITEOUT_PARAM

Folgende Parameter können in der Map SQLITEOUT_PARAM für den Modul gesetzt werden:

Parameterreq/optBeschreibung
STATISTICSoON oder OFF, Default = OFF. Statistik anzeigen.
DATASEToON oder OFF, Default = OFF. Definiert, ob die in die Datenbank geschriebenen Daten als Datasets verwaltetet werden. Sie dazu mehr unter dem Kapitel Datasets.
SRIDo<STRING>. Die Nummer des EPSG Spatial Reference System. Die SRID muss in der Table gpkg_spatial_ref_sys enthalten sein. 2056 für LV95, 21781 für LV03.
STROKEo<real> . Stroke-Tolerance zur Auflösung von Kreisbögen in Liniensegmente. Als Stroke-Tolerance können dieselben Werte wie für die ICS-Methode ICS.STROKE verwendet werden (s.a. iG/Script Benutzer- und Referenzhandbuch). Mit OFF werden die Kreisbögen nicht aufgelöst.
ST_METADATAoON oder OFF, Default = OFF. Definiert, ob die ST_* Metadaten in der Datenbank erzeugt werden sollen.

20.3. Objektmodell

Der Modul verlangt pro OUT-Objekt folgende Systemkomponenten:

Komponentereq/optBeschreibung
OUT.TABLE(s)rTablename des OUT Objekts.
OUT.<Attribut>(s)oAttributname der Tabelle. Der Wert der Komponente beinhaltet den Wert für die Datenbank. Der Typ des Werts muss mit dem Typ des Attributs in der Datenbank übereinstimmen. Es können beliebig viele Attribute definiert werden.

Dieses Objektmodell gilt für die Anwendung mit der Prozedur SQLITEOUT_WRITE_OBJECT0. Die Tabellen mit den Attributen müssen in der Datenbank bereits bestehen oder in einer Konfiguration mit Prozeduren und Methoden vorgängig erzeugt werden. Falls die Datenbankstrukturen automatisiert mit dem Modul erstellt werden sollen, so beachten Sie das Kapitel mit den Record-Definitionen und die Prozedur SQLITEOUT_WRITE_RECORD1.

20.4. Record Definitionen

Mit Record Definitionen können nicht nur Objekte in die Datenbank geschrieben werden, sondern auch Datenbank-Tabellen automatisiert in der Datenbank angelegt werden. Die Record Definitionen werden von der Prozedur DBOUT_WRITE_RECORD1 verarbeitet. Eine Record Definition sieht wie folgt aus.

MAP RECORD_<n>
   TABLE => <Table-Name>
   :
   <Attribute-Name> => <Attribute-Type>,<Attribute-Value>
   :
END_MAP

Die einzelnen Bestandteile einer Record-Definition sind:

RECORD_<n>

Eine Record Definition ist eine Map. Der Map-Name muss mit dem Prefix RECORD_ beginnen und eine eindeutige Nummer <n> für die Record Definition beinhalten.

TABLE

Diese Komponente ist required und definiert die Datenbank-Tabelle.

<Table-Name>

Definiert als Wert der Komponente TABLE die Datenbank-Tabelle.

<Attribute-Name>

Definiert als Komponente einen Attribut-Namen der Tabelle. Es können beliebig viele Attribute als Komponenten definiert werden.

<Attribute-Type>

Definiert den Attribut-Type in der Datenbank. Im Normalfall können der Datenbank bekannt Typen verwendet werden. Spezialtypen einer Datenbank werden eventuell nocht nicht unterstützt. Solche Spezialtypen werden bei Bedarf und auf Anfrage implementiert. Bei den Typen ist auf folgendes zu achten.

Alle Datenbanken

CHAR(<length>)

Stringtypen sind immer als CHAR mit der Länge <length> zu definieren..

NUMBER(p,s)

Number-Type.

INTEGER

Integer-Type.

GEOMETRY(<type>;<dimension>;<HASM>)

Geometrien müssen als Type GEOMETRY definiert werden. Dabei sind folgende weiteren Definitionen notwendig.

<type>

Type der Geometrie, einer der Werte: point|line|area.

<dimension>

Dimension der Geometrie, einer der Werte: 2D|3D.

<HASM>

Geometrie besitzt die Measure-Dimension, einer der Werte: TRUE|FALSE.

[Anmerkung]

SQLite OGC Geopackage erlaubt nur eine Geometrie-Definition pro Tabelle. Deshalb kann pro Record-Definition nur ein Geometrie-Attribut definiert werden.

[Anmerkung]

Um mögliche Einschränkungen von SDE zu umgehen, ist es empfehlenswert, den Geometrie-Attributen den Name SHAPE zu vergeben.

[Anmerkung]

HASM wir zur Zeit nicht unterstützt.

<Attribut-Value>

Definiert den Wert für das Attribut. Als Wert können absolute Werte oder ICS-Variablen, die einen Wert beinhalten - z.B. IN.OBJID - verwendet werden.

Beispiel einer Record Definition.

MAP RECORD_1
   TABLE => Bodenbedeckung_BoFlaeche_Area
   OBJID => CHAR(10),IN.OBJID
   Entstehung => CHAR(10),IN.Entstehung.OBJID
   Qualitaet => CHAR(30),IN.Qualitaet
   Art => INTEGER,IN.Art
   Art_TXT => CHAR(47),IN.Art_TXT
   Herkunft => CHAR(30),IN.Herkunft
   GEOM => GEOMETRY(area;2D),IN.GEOM
END_MAP

20.5. Datasets

Mit dem Parameter DBOUT_PARAM.DATASET => ON kann der Modul veranlasst werden, die Daten in Datasets zu verwalten. In der Regel werden verschiedene Datasets in einen Datenbank geschrieben. Die einzelnen Datasets können danach als Subset des Daten nachgeführt oder gelöscht werden. Typischerweise bildet ein INTERLIS-File ein solches Dataset. Falls der Dataset-Parameter eingeschaltet ist, wird in der Datenbank folgendes angelegt:

CREATE TABLE GS_FILE (
   FileID       INTEGER    -- Schlüssel für Dataset
   ModelName    CHAR(255)  -- Modellname (INTERLIS)
   FileName     CHAR(255)  -- Filenamen
   DateFile     INTEGER    -- YYYYMMDD Datum des Files
   DateUpload   INTEGER    -- YYYYMMDD Datum des lesen in die Datenbank 
   UserUpload   CHAR(255)  -- eventuell ein Username
);

CREATE TABLE <Data-Table> (
   GS_FileID    INTEGER    -- Fremdschlüssel für Dataset
   : 
);

Die Tabelle GS_FILE verwaltet die Datasets. Jedes Dataset erhält eine eindeutigen Schlüssel im Attribut FileID . Jede angelegte Tabelle für die Daten erhält ein Attribut GS_FileID, das den Fremdschlüssel des Datasets beinhalten.

Wird ein Dataset (File) das erste Mal in die Datenbank geschrieben (INSERT) , wird der Eintrag in GS_FILE generiert, und jeder Daten-Record erhält den Fremdschlüssel des Datasets.

Wird ein Dataset (File) ein nächstes Mal in die Datenbank geschrieben (UPDATE) , wird der Eintrag in GS_FILE mit den Daten nachgeführt, die bestehenden Daten des Datasets in der Datenbank gelöscht und die neuen Daten in die Datenbank geschrieben.

20.6. Datenbank Modellgenerierung mit CONFIG_PARAM.GENERATE_MODEL

Falls basierend auf den Record-Definitionen vor einem Datentransfer das gesamte Datenbankmodell erstellt werden soll, so ist der Parameter CONFIG_PARAM.GENERATE_MODEL auf ON zu setzten:

MAP CONFIG_PARAM
   GENERATE_MODEL => ON
END_MAP

Entsprechend den Record-Definitionen wird vor einem Datentransfer das Datenbankmodell angelegt, falls es nicht schon angelegt wurde.

20.7. Exportierte Prozeduren und Methoden

ProzedurSQLITEOUT_OPEN [s input][]
Beschreibung

Öffnet eine Datenbank in Abhängigkeit von <input>. Existiert die Datenbank nicht, so wird diese kreiert.

Die Prozedur wird von RUN1 automatisch aufgerufen.

Beispiel
OPT.input SQLITEOUT_OPEN
ProzedurSQLITEOUT_WRITE_OBJECT0
Beschreibung

Schreibt ein Objekt in die Datenbank. Das OUT-Objekt muss gemäss dem Objektmodell gefüllt sein.

Beispiel
SQLITEOUT_WRITE_OBJECT0
ProzedurSQLITEOUT_WRITE_RECORD1 ! s recordname
Beschreibung

Schreibt ein Objekt definiert in <recordname> in die Datenbank. <recordname> ist der Name einer Record-Definition (siehe weiter oben). Je nach den gesetzten Parametern führt die Prozedur beim ersten Aufruf für eine Record-Definition folgende Aktionen auf der Datenbank aus:

  1. Die Tabelle wird erzeugt, falls definiert durch Parameter.

  2. Das Objekt wird in die Datenbank geschrieben.

Beispiel
... => SQLITEOUT_WRITE_RECORD1,RECORD_1
ProzedurSQLITEOUT_CLOSE [][]
BeschreibungSchliesst den Modul und gibt die durch den Modul belegten Resourcen wieder frei. Die Prozedur wird von RUN1 automatisch aufgerufen.
Beispiel
SQLITEOUT_CLOSE

20.8. Skriptbeispiel

! Diese ICS Konfiguration liest ein INTERLIS FIle,
! erzeugt eine Tabelle für LFP's in der Datenbank
! und schreibt die LFP's in die Tabelle.

|LICENSE \license\iltools.lic

MAP USER_INPUT1
   DIALOG        => FILE
   MESSAGE       => 'Enter INTERLIS Input File'
   FILE_FILTER   => itf
   FILE_EXISTS   => TRUE
   OPT           => input
END_MAP

MAP USER_INPUT2
   DIALOG        => FILE
   MESSAGE       => 'Enter SQLITE Output File'
   FILE_FILTER   => gpkg;db
   FILE_EXISTS   => FALSE
   OPT           => output
END_MAP

MAP ILIN_PARAM
   INTERLIS_DEF => '\models\DM01AVCH24LV95D.ili'
   STATISTICS   => ON
   CALC_SURFACE => ON
   ENUM_TO_TEXT => ON
   TRACE        => OFF
END_MAP

MAP ILIN_TOPO
   DEFAULT => OFF
END_MAP

MAP SQLITEOUT_PARAM
   STATISTICS      => ON
   DATASET         => ON
   SRID            => 2056 
END_MAP

MAP RECORD_1
   TABLE => FixpunkteKategorie1_LFP1
   OBJID => CHAR(32),IN.OBJID
   Entstehung => CHAR(32),IN.Entstehung.OBJID
   NBIdent => CHAR(12),IN.NBIdent
   Nummer => CHAR(12),IN.Nummer
   Geometrie => GEOMETRY(point;2D;FALSE),IN.Geometrie
   HoeheGeom => NUMBER(7,3),IN.HoeheGeom
   LageGen => NUMBER(4,1),IN.LageGen
   LageZuv => INTEGER,IN.LageZuv
   LageZuv_TXT => CHAR(4),IN.LageZuv_TXT
   HoeheGen => NUMBER(4,1),IN.HoeheGen
   HoeheZuv => INTEGER,IN.HoeheZuv
   HoeheZuv_TXT => CHAR(4),IN.HoeheZuv_TXT
   Begehbarkeit => INTEGER,IN.Begehbarkeit
   Begehbarkeit_TXT => CHAR(14),IN.Begehbarkeit_TXT
   Punktzeichen => INTEGER,IN.Punktzeichen
   Punktzeichen_TXT => CHAR(17),IN.Punktzeichen_TXT
END_MAP

MAP INPUT_SOURCES
   I1 => ILTOPO,OPT.input
END_MAP

MAP INOUT
   I1                          => IN.TOPIC,IN.TABLE
   I1,FixpunkteKategorie1,LFP1 => R_1,RECORD_1
   I1,*                        => OFF
END_MAP

|INCL \script\iltopo.mod
|INCL \script\sqliteout.mod
|INCL \script\run1.prg