12. Modul KMLOUT - Google KML schreiben

12.1. Allgemeines

Mit dem Modul KMLOUT können Objekte in eine KML Datei geschrieben werden.

Der Modul KMLOUT wird mit:

|INCL \script\kmlout.mod

in einer ICS RUN1-Konfiguration verfügbar gemacht.

12.2. Abhängigkeiten von anderen Modulen

Keine Abhängigkeiten vorhanden.

12.3. Parametermap KMLOUT_PARAM

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

Parameterreq/optBeschreibung
TEMPLATErName der KML Templatedatei. Für die Templatedatei muss ein KML-File gemäss KML Spezifikationen angegeben werden. Das KML Templatefile beinhaltet alle Definitionen, auf die die zu schreibenden Objekte Bezug nehmen, wie zum Beispiel Style-Definitionen.
STATISTICSrON oder OFF, Default = OFF. Objektstatistik am Ender der .log Datei anzeigen.
STROKE_TOLr<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.

12.4. Objektmodell

Der Modul verlangt für jedes OUT-Objekt folgende Systemkomponenten:

Pro Objekttyp müssen ausserdem folgende Komonenten des OUT-Objekts gesetzt werden:

Allgemeine Komponenten für jedes OUT-Objekt
Komponentereq/optBeschreibung
OUT.FOLDER(s) o

KML Folder - Ordner - in das das Objekt geschrieben wird. Handelt es sich um einen Unterordner, so ist der Unterordner mit dem gesamten Ordnerpfad anzugeben, z.B. Bodenbedeckung.Gebäude.Nummer.

OUT.GEOM(g)oGeometrie des Objektes.
OUT.<Tag>(s) o

KML Tag. Definition weiterer KML Tags mit Werten für das Objekt. Die Tags und Werte richten sich nach dem Objekt und den KML Spezifikationen für das Objekt, z.B. styleUrl für eine Style-Definition des Objektes. Der Wert für das Tag kann auch eine ICS-Komponente sein, die den Wert beinhaltet. Ein Tag für ein Unterelement des Objektes muss der Tag-Pfad des Tags definiert werden, z.B. Polygon.extrude.

Dieses Objektmodell gilt für die Anwendung mit der Prozedur KMLOUT_WRITE_OBJECT0. Das OUT-Objekt muss mit Prozeduren aufbereitet werden.

12.5. Record Definitionen

Mit Record Definitionen können vereinfacht Objekte definiert werden. Die Record Definitionen werden von der Prozedur KMLOUT_WRITE_RECORD1 verarbeitet. Eine Record Definition sieht wie folgt aus.

MAP <name>
   FOLDER => <Folder-Name>
   GEOM => <Geometrie-Komponente>
   :
   <Tag> => <Value|Komponente mit Value>
   :
END_MAP

Die einzelnen Bestandteile einer Record-Definition sind:

RECORD_<name>

Eine Record Definition ist eine Map. Der Map-Name kann ein beliebiger Name sein.

FOLDER

Siehe Objektmodell.

<Tag>

Siehe Objektmodell.

Beispiel einer Record Definition.

MAP RECORD_POLYGON
   name                    => Gebäude
   styleUrl                => #polygonstyle
   Polygon.extrude         => 1
   Polygon.tessellate      => 1
   Polygon.altitudeMode    => relativeToGround
   GEOM                    => IN.GEOM
   FOLDER                  => Bodenbedeckung.Gebäude.Fläche
END_MAP

12.6. Folder Definitionen

Mit den Folder Definitionen können für die in den Record Definitionen verwendeten Folders KML Tags definiert werden. Die Folders Definition sieht wie folgt aus.

MAP FOLDERS
   <Folder-Path>.<Tag> => <Value>
   :
END_MAP

Die einzelnen Bestandteile einer Record-Definition sind:

FOLDERS

Die Folder Definition ist eine Map. Der Map-Name ist fix FOLDERS .

<Folder>-Path>

Definition des Foldernames. Handelt es sich um einen Unterordner, muss der ganze Path für den Folder definiert werden. Folders in einem Path werden durch einen Punkt separaiert.

Mit document für den Folder-Pfad können Tags für das Dokument definiert werden.

<Tag>

Tag für den Folder entsprechend den KML Spezifikationen.

<Value>

Wert für den Tag des Folders.

Zusätzlich zu den in der KML Spezifikation definierten Tags können folgende Modul-spezifischen Tags definiert werden.

<Tag>=ORDER

Tag für den Folder zum sortieren der Daten.

<Value>=ASCENDING|DESENDING[,NUMERIC]

Definiert wie die Daten sortiert werden sollen. ASCENDING: aufwärts, DESCENDING: abwärts. Zusätzlich kann mit NUMERIC definiert werden, ob die Werte als numerische Werte interpretiert werden sollen und nicht als textuelle Werte. Macht nur Sinn, wenn alle Werte numerisch sind.

Beispiel einer Folder Definition.

MAP FOLDERS
   document.open                             => 1
   Bodenbedeckung.open                       => 1
   Bodenbedeckung.visibility                 => 1
   Bodenbedeckung.Gebäude.open               => 1
   Bodenbedeckung.Gebäude.visibility         => 1
   Bodenbedeckung.Gebäude.Nummer.open        => 0
   Bodenbedeckung.Gebäude.Nummer.visibility  => 1
   Bodenbedeckung.Gebäude.Nummer.ORDER       => ASCENDING,NUMERIC
   Bodenbedeckung.Gebäude.Fläche.open        => 0
   Bodenbedeckung.Gebäude.Fläche.visibility  => 1
END_MAP

12.7. KML Templates

Mit dem Parameter KMLOUT_PARAM.TEMPLATE muss ein KML-Template definiert werden. Das KML Templatefile beinhaltet alle Definitionen, auf die die zu schreibenden Objekte Bezug nehmen, wie zum Beispiel Style-Definitionen. Nachfolgend ein Beispiel.

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.2">
<Document>
   <name>template.kml</name>

   <!-- Begin Style Definitions -->

   <Style id="polygonstyle_normal">
      <PolyStyle>
         <color>ff0000aa</color>
      </PolyStyle>
   </Style>
   <Style id="polygonstyle_highlite">
      <PolyStyle>
         <color>ff0000ff</color>
      </PolyStyle>
   </Style>
   <StyleMap id="polygonstyle">
      <Pair>
         <key>normal</key>
         <styleUrl>#polygonstyle_normal</styleUrl>
      </Pair>
      <Pair>
         <key>highlight</key>
         <styleUrl>#polygonstyle_highlite</styleUrl>
      </Pair>
   </StyleMap>

   <!-- End Style Definitions -->

</Document>
</kml>    

12.8. Exportierte Prozeduren und Methoden

Prozeduren und Methoden

ProzedurKMLOUT_OPEN ! [s file][]
BeschreibungÖffnet den KMLOUT Modul auf der Outputdei <file>. Die Prozedur wird von RUN1 automatisch aufgerufen.
Beispiel
'c:\test.kml' KMLOUT_OPEN
ProzedurKMLOUT_WRITE_OBJECT0
Beschreibung

Schreibt aus aufbereitete Objekt OUT in die aktuelle Outputdatei.

Beispiel
... => KMLOUT_WRITE_OBJECT0
ProzedurKMLOUT_WRITE_RECORD1 ! record
Beschreibung

Schreibt das in record definierte Objekt in die aktuelle Outputdatei.

Beispiel
... => KMLOUT_WRITE_RECORD1,RECORD_PLOYGON
ProzedurKMLOUT_CLOSE ! [][]
BeschreibungSchliesst den Modul und gibt die durch den Modul belegten Resourcen wieder frei. Die Prozedur wird von RUN1 automatisch aufgerufen.
Beispiel
KMLOUT_CLOSE

Triggers Folder

ProzedurKMLOUT_FOLDER_PRE_OPEN ! [][]
BeschreibungTrigger der aufgefrufen wird, bevor ein Folder geöffnet wird. Der Folder steht in VAR.KML_FOLDER zur Verfügung.
Beispiel
PROCEDURE KMLOUT_FOLDER_PRE_OPEN
   ! code
END_PROCEDURE
ProzedurKMLOUT_FOLDER_POST_OPEN ! [][]
BeschreibungTrigger der aufgefrufen wird, nachdem ein Folder geöffnet wurde. Der Folder steht in VAR.KML_FOLDER zur Verfügung.
Beispiel
PROCEDURE KMLOUT_FOLDER_POST_OPEN
   IF VAR.KML_FOLDER = 'Bodenbedeckung.Gebäude' THEN

      '<Region>'                          KMLOUT_WRITE_LINE

      KMLOUT_TAB_INC
      '<LatLonAltBox>'                    KMLOUT_WRITE_LINE
      ! box
      '</LatLonAltBox>'                   KMLOUT_WRITE_LINE
      KMLOUT_TAB_DEC

      '</Region>'                         KMLOUT_WRITE_LINE
   END_IF
END_PROCEDURE
ProzedurKMLOUT_FOLDER_PRE_CLOSE ! [][]
BeschreibungTrigger der aufgefrufen wird, bevor ein Folder geschlossen wird. Der Folder steht in VAR.KML_FOLDER zur Verfügung.
Beispiel
PROCEDURE KMLOUT_FOLDER_PRE_CLOSE
   ! code
END_PROCEDURE
ProzedurKMLOUT_FOLDER_POST_CLOSE ! [][]
BeschreibungTrigger der aufgefrufen wird, nachdem ein Folder geschlossen wurde. Der Folder steht in VAR.KML_FOLDER zur Verfügung.
Beispiel
PROCEDURE KMLOUT_FOLDER_POST_CLOSE
   ! code
END_PROCEDURE

Triggers Placemark (Objects)

ProzedurKMLOUT_PLACEMARK_PRE_OPEN ! [][]
BeschreibungTrigger der aufgefrufen wird, bevor ein Placemark geöffnet wird. Der Placemark steht in OUT zur Verfügung.
Beispiel
PROCEDURE KMLOUT_PLACEMARK_PRE_OPEN
   ! code
END_PROCEDURE
ProzedurKMLOUT_PLACEMARK_POST_OPEN ! [][]
BeschreibungTrigger der aufgefrufen wird, nachdem ein Placemark geöffnet wurde. Der Placemark steht in OUT zur Verfügung.
Beispiel
PROCEDURE KMLOUT_PLACEMARK_POST_OPEN
   ! code 
END_PROCEDURE
ProzedurKMLOUT_PLACEMARK_PRE_CLOSE ! [][]
BeschreibungTrigger der aufgefrufen wird, bevor ein PLACEMARK geschlossen wird. Der Placemark steht in OUT zur Verfügung.
Beispiel
PROCEDURE KMLOUT_PLACEMARK_PRE_CLOSE
   ! code
END_PROCEDURE
ProzedurKMLOUT_PLACEMARK_POST_CLOSE ! [][]
BeschreibungTrigger der aufgefrufen wird, nachdem ein Placemark geschlossen wurde. Der Placemark steht in OUT zur Verfügung.
Beispiel
PROCEDURE KMLOUT_PLACEMARK_POST_CLOSE
   ! code
END_PROCEDURE

Weitere Prozeduren

ProzedurKMLOUT_WRITE_LINE ! [s string][]
BeschreibungEine zusätzliche Zeile in das Output-File schreiben. Siehe Beispiel in KMLOUT_FOLDER_POST_OPEN.
Beispiel
'<Region>' KMLOUT_WRITE_LINE
ProzedurKMLOUT_TAB_INC ! [][]
BeschreibungDen Tabulatur für das Schreiben in das Output-File um einen Enschub erhöhen. Siehe Beispiel in KMLOUT_FOLDER_POST_OPEN.
Beispiel
KMLOUT_TAB_INC
ProzedurKMLOUT_TAB_DEC ! [][]
BeschreibungDen Tabulatur für das Schreiben in das Output-File um einen Einschub verkelinern. Siehe Beispiel in KMLOUT_FOLDER_POST_OPEN.
Beispiel
KMLOUT_TAB_DEC

12.9. Skriptbeispiel

! Diese ICS Konfiguration transferiert aus INTERLIS
! gelesenen Objekte mit KMLOUT in in eine .kml Datei.

|LICENSE \license\iltools.lic

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

MAP USER_INPUT2
   DIALOG => FILE
   MESSAGE => 'Enter .kml Output File'
   FILE_FILTER => kml
   FILE_EXISTS => FALSE
   OPT => output
END_MAP

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

MAP ILIN_TOPO
   Bodenbedeckung,BoFlaeche_Geometrie => AREA
   DEFAULT => OFF
END_MAP

MAP KMLOUT_PARAM
   TEMPLATE => \data\template.kml
   STATISTICS => ON
   STROKE_TOL => 0.001
   FENCE_MODE => OVERLAP
END_MAP

MAP FOLDERS
   Bodenbedeckung.Gebäude.Nummer.open        => 0
   Bodenbedeckung.Gebäude.Nummer.visibility  => 1
   Bodenbedeckung.Gebäude.Fläche.open        => 0
   Bodenbedeckung.Gebäude.Fläche.visibility  => 1
END_MAP

MAP RECORD_POINT
   name                    => IN.GebaeudenummerPos_von.Nummer
   styleUrl                => #pointstyle
   visibility              => 1
   Point.extrude           => 1
   Point.tessellate        => 1
   Point.altitudeMode      => relativeToGround
   GEOM                    => IN.Pos
   FOLDER                  => Bodenbedeckung.Gebäude.Nummer
END_MAP

MAP RECORD_POLYGON
   name                    => Gebäude
   styleUrl                => #polygonstyle
   Polygon.extrude         => 1
   Polygon.tessellate      => 1
   Polygon.altitudeMode    => relativeToGround
   GEOM                    => IN.GEOM
   FOLDER                  => Bodenbedeckung.Gebäude.Fläche
END_MAP

MAP INPUT_SOURCES
   I1 => ILTOPO,OPT.input
END_MAP

MAP INOUT
   I1 => IN.TOPIC,IN.TABLE
   I1,Bodenbedeckung,BoFlaeche_Area       => IN.Art
   I1,Bodenbedeckung,BoFlaeche_Area,0     => R_1,RECORD_POLYGON
   I1,Bodenbedeckung,GebaeudenummerPos    => R_1,RECORD_POINT
   I1,* => OFF
END_MAP

MAP MACRO
   R_1   => KMLOUT_WRITE_RECORD1
END_MAP

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