Anleitung zu IOX-ILI



Ähnliche Dokumente
Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Einführung in die Programmierung

Arbeiten mit UMLed und Delphi

Database Exchange Manager. Infinqa IT Solutions GmbH, Berlin Stralauer Allee Berlin Tel.:+49(0) Fax.:+49(0)

Software Engineering Klassendiagramme Assoziationen

Einführung in die Java- Programmierung

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

Pakete dienen dazu, die Software eines Projektes in größere inhaltlich zusammengehörige Bereiche mit eigenem Namen einzuteilen (siehe Java API).

Zeichen bei Zahlen entschlüsseln

Übung: Verwendung von Java-Threads

Betriebshandbuch. MyInTouch Import Tool

Barcodedatei importieren

Schnittstelle Drittmeldepflicht Ab ImmoTop

Anwendungsbeispiele Sign Live! Secure Mail Gateway

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

ITF2XML. Transferservice. Version 1.1. Tel.: 044 / Fax: 044 / CH-8005 Zürich

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Anton Ochsenkühn. amac BUCH VERLAG. Ecxel für Mac. amac-buch Verlag

Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten

Design Patterns SS 2014 Hausaufgabe 5

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Programmierkurs Java

Version 0.3. Installation von MinGW und Eclipse CDT

Microsoft PowerPoint 2013 Folien gemeinsam nutzen

Professionelle Seminare im Bereich MS-Office

Erstellen einer PostScript-Datei unter Windows XP

Objektorientierte Programmierung

Wissensdatenbankeintrag zur Classic Line Version CL 4.4 und SNC >= 5.2 WDB Artikel:

Objektorientierte Programmierung

Upgrade-Leitfaden. Apparo Fast Edit 1 / 7

AcQuickPrint / AcSetPrinter Publizieren leicht gemacht / Drucker in Layouts tauschen

Adminer: Installationsanleitung

Informationen zu den regionalen Startseiten

Anleitung So klappt der Downloadschnitt

Import und Export von Übergängern

4D Server v12 64-bit Version BETA VERSION

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

EasyWk DAS Schwimmwettkampfprogramm

Programmieren in Java

Was ist PDF? Portable Document Format, von Adobe Systems entwickelt Multiplattformfähigkeit,

Zusatzmodul Lagerverwaltung

Novell Client. Anleitung. zur Verfügung gestellt durch: ZID Dezentrale Systeme. Februar ZID Dezentrale Systeme

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

ITF2XML. Transferservice. Version 1.0. infogrips GmbH, Zürich client10.doc, Revision 1.1. Tel.: 01 / Fax: 01 /

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

FORUM HANDREICHUNG (STAND: AUGUST 2013)

Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert

Um ein solches Dokument zu erzeugen, muss eine Serienbriefvorlage in Word erstellt werden, das auf die von BüroWARE erstellte Datei zugreift.

Übungen Programmieren 1 Felix Rohrer. Übungen

1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage:

Kleines Handbuch zur Fotogalerie der Pixel AG

Typo3 - Inhalte. 1. Gestaltung des Inhaltsbereichs. 2. Seitenunterteilung einfügen

Hilfe zur Urlaubsplanung und Zeiterfassung

Elexis-BlueEvidence-Connector

Grafstat Checkliste Internetbefragung

Anleitung zur Installation und Verwendung von eclipseuml 2.1.0

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

Installation OMNIKEY 3121 USB

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Internet Explorer Version 6

Java Einführung Collections

1 Einleitung. Lernziele. Symbolleiste für den Schnellzugriff anpassen. Notizenseiten drucken. eine Präsentation abwärtskompatibel speichern

Kurzskript Literaturverzeichnis Microsoft Office Word 2010

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Kennen, können, beherrschen lernen was gebraucht wird

INSTALLATIONSANLEITUNG

Qt-Projekte mit Visual Studio 2005

Artikel Schnittstelle über CSV

Anleitung - Archivierung

Erstellen von x-y-diagrammen in OpenOffice.calc

AutoCAD Dienstprogramm zur Lizenzübertragung

Installation von Druckern auf dem ZOVAS-Notebook. 1. Der Drucker ist direkt mit dem Notebook verbunden

ACHTUNG: Es können gpx-dateien und mit dem GP7 aufgezeichnete trc-dateien umgewandelt werden.

! " # $ " % & Nicki Wruck worldwidewruck

Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER

Kapiteltests zum Leitprogramm Binäre Suchbäume

Kurzanleitung. Toolbox. T_xls_Import

Kurzanleitung MAN E-Learning (WBT)

Anleitung zur Daten zur Datensicherung und Datenrücksicherung. Datensicherung

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank

Neuerungen in den SK-Programmen Version 3.1 Stand: Juni 2004

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.

Automatische Installation (wenn das SSO-Applet nicht vorhanden ist)! Abbildung 1:Auswahldialog für Installationslaufwerk

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

SICHERN DER FAVORITEN

Anzeige von eingescannten Rechnungen

Javakurs zu Informatik I. Henning Heitkötter

Modul Datenbanksysteme 2 Prüfung skizzenhaft SS Aug Name: Note:

TYPO3 Tipps und Tricks

Universal Dashboard auf ewon Alarmübersicht auf ewon eigener HTML Seite.

E Mail Versand mit der Schild NRW Formularverwaltung

Vorgehensweise bei der Installation Bob50SQL für einen unabhängigen PC.

Import des persönlichen Zertifikats in Outlook Express

Anwendungsbeispiele Buchhaltung

LDAP Konfiguration nach einem Update auf Version 6.3 Version 1.2 Stand: 23. Januar 2012 Copyright MATESO GmbH

How-to: Webserver NAT. Securepoint Security System Version 2007nx

Umzug der abfallwirtschaftlichen Nummern /Kündigung

Online Newsletter III

Transkript:

Anleitung zu IOX-ILI Diese Anleitung beschreibt die für INTERLIS 1 und INTERLIS 2 spezifische Realisierung der IOX Schnittstellen. Für IOX im Allgemeinen beachten sie bitte die Anleitung zu IOX. Konzept Das Hauptanliegen von IOX ist, eine Applikation vom Transferformat zu entkoppeln, so dass das Transferformat geändert werden kann, ohne dass dies Auswirkungen auf den Code der Applikation hat. IOX entkoppelt die Applikation vom Format. IOX hat aber nicht die Abbildung der internen auf die externe Datenstruktur zum Ziel. Da IOX nur Schnittstellen definiert, sind für ein konkretes Transferformat spezifische Realisierungen dieser Schnittstellen erforderlich. Diese Anleitung beschreibt solche Realisierungen für INTERLIS 1 und INTERLIS 2. Die wichtigsten Typen von IOX-ILI sind: ch.interlis.iom_j.itf.itfwriter INTERLIS 1 Daten schreiben ch.interlis.iom_j.itf.itfreader INTERLIS 1 Daten lesen ch.interlis.iom_j.xtf.xtfwriter INTERLIS 2 Daten schreiben ch.interlis.iom_j.xtf.xtfreader INTERLIS 2 Daten lesen INTERLIS-Modelle lesen Die INTERLIS Reader und Writer benötigen für die korrekte Funktionsweise das zu den Daten passende INTERLIS-Datenmodell. Um das Datenmodell zu Lesen, wird der INTERLIS-Compiler benötigt. Die wichtigsten Typen und Funktionen sind: ch.interlis.ili2c.metamodel.transferdescription ch.interlis.ili2c.config.configuration ch.interlis.ili2c.ili2c.runcompiler() ch.interlis.ilirepository.ilimanager.getconfig() ch.interlis.ilirepository.ilimanager.getconfigwithfiles() ch.interlis.ili2c.main.compileilifiles() Wurzel der Datenstruktur, die INTERLIS-Modelle repräsentiert aktuelle Dateien und Optionen für einen Compiler- Lauf Modelle kompilieren; liefert eine TransferDescription Funktion um ili-dateien zu ermitteln und evtl. downloaden (wenn Modell- Namen gegeben sind); liefert eine Configuration Funktion um ili-dateien zu ermitteln und evtl. downloaden (wenn ili- Dateinamen z.t. gegeben sind); liefert eine Configuration Funktion um ili-dateien zu Lesen (wenn Dateinamen gegeben sind); ohne download von Dateien Claude Eisenhut 2009-12-03,Seite 1

ch.interlis.ili2c.main.compileilimodels() Funktion um ili-modelle zu Lesen (wenn Modell-Namen gegeben sind); ohne download von Dateien Modelle lesen mit Verwendung von Modell-Ablagen Möchte man die INTERLIS-Modelle aus dem Internet beziehen, sind folgende Schritte notwendig: Zugriff auf Modell-Ablage initialisieren Liste der Wurzel-Ablagen definieren Liste der Modelldateien ermitteln (inkl. download der Modell-Dateien) Modell-Dateien kompilieren Man verwendet z.b. den folgenden Code, um das Modell/die Modelle zu lesen: import ch.interlis.ili2c.ili2c; import ch.interlis.ili2c.config.configuration; import ch.interlis.ili2c.metamodel.transferdescription; // create repository manager IliManager manager=new IliManager(); // set list of repositories to search String repositories[]=new String[]{"http://models.interlis.ch/"; manager.setrepositories(repositories); // get list of ili-files for a given model ArrayList modelnames=new ArrayList(); modelnames.add("dm01"); Configuration config=manager.getconfig(modelnames,1.0); // 1.0=ili 1 modell // compile models TransferDescritpion td=ili2c.runcompiler(config); Stellt der Compiler im Modell Fehler fest (z.b. falsche Syntax), werden diese via EhiLogger ausgegeben. Die Anwendung des EhiLogger s ist in einer getrennten Anleitung beschrieben. Modelle lesen ohne Verwendung von Modell-Ablagen Kennt man den Dateinamen der INTERLIS-Modelldatei, verwendet man den folgenden Code, um das Modell zu lesen: String ilifile= dm01av.ili ; ArrayList ilifiles=new ArrayList(); ArrayList ilidirs=new ArrayList(); ilifiles.add(ilifile); TransferDescription td=ch.interlis.ili2c.main.compileilifiles( ilifiles, ilidirs, null); if(td==null){ System.err.println("ili-compiler failed"); Handelt es sich um ein INTERLIS 2-Modell, werden evtl. andere Modelle importiert (z.b. das Modell Units ). Die Funktionen suchen automatisch in den gegebenen Verzeichnissen (ilidirs) nach diesen Modellen. Kennt man den Modellnamen des INTERLIS-Modells, muss man auch das Verzeichnis kennen, indem sich die INTERLIS-Modelldateien befinden. Dann verwendet man den folgenden Code, um das Modell zu lesen: String ilimodel= DM01AV ; String ilidir= c:/interlis/modelle ; ArrayList ilimodels=new ArrayList(); Claude Eisenhut 2009-12-03,Seite 2

ilimodels.add(ilimodel); ArrayList ilidirs=new ArrayList(); ilidirs.add(ilidir); TransferDescription td=ch.interlis.ili2c.main.compileilimodels( ilimodels, ilidirs, null); if(td==null){ System.err.println("ili-compler failed"); INTERLIS 1 Für INTERLIS 1 stehen die folgenden Typen zur Verfügung: ch.interlis.iom_j.itf.itfwriter INTERLIS 1 Daten schreiben ch.interlis.iom_j.itf.itfreader INTERLIS 1 Daten lesen Ein INTERLIS 1 Reader wird mit folgendem Code erzeugt (wobei transferdescription das vorgängig gelesene Modell repräsentiert): ItfReader ioxreader=null; // open itf file ioxreader=new ItfReader(new java.io.file(itffilename)); ioxreader.setmodel(transferdescription); catch(ioxexception ex){ finally{ if(ioxreader!=null){ ioxreader.close(); catch(ioxexception ex){ ioxreader=null; Der Aufruf von setmodel() kann bis zum ersten StartBasketEvent verzögert werden. Ein INTERLIS 1 Writer wird mit folgendem Code erzeugt (wobei transferdescription das vorgängig gelesene Modell repräsentiert): ItfWriter ioxwriter=null; // create itf file ioxwriter=new ItfWriter( new java.io.file(itffilename),transferdescription ); catch(ioxexception ex){ finally{ if(ioxwriter!=null){ ioxwriter.close(); catch(ioxexception ex){ ioxwriter=null; Claude Eisenhut 2009-12-03,Seite 3

Bei Aufzählungen wird die Codierung gemäss INTERLIS 2 verwendet, d.h. es findet innerhalb des Readers eine Abbildung des numerischen Codes gem. INTERLIS 1 auf den Elementnamen gem. INTERLIS 2 statt. Und entsprechend beim Writer die umgekehrte Abbildung. ACHTUNG: Die Baskets (Instanzen der TOPICs) und Objekte (Instanzen der TABLEs) müssen in der richtigen Reihenfolge geschrieben werden. Der ItfWriter ordnet sie nicht! ACHTUNG: Der ItfReader führt keine Flächenbildung durch, d.h. die Geometrie für SURFACE und AREA Attribute wird als Linie in Objekten der Linientabelle geliefert (ItfReader). Entsprechend erwartet auch der ItfWriter diese Linientabellen. Referenzattribute Referenzen werden mit IOX als Teil eines strukturierten Werts repräsentiert. Zum Beispiel ist das folgende konzeptionelle Datenmodell in INTERLIS 1 gegeben: TABLE ClassA = attr10 : TEXT*20; NO IDENT TABLE ClassB = attr20 : TEXT*20; a : -> ClassA; NO IDENT END ClassB; Verweist nun ein Objekt der Klasse ClassB auf ein Objekt der Klasse ClassA, ergibt dies in IOX die folgende Struktur von Instanzen. ClassA ClassB attr10 objectref attr20 a REF Um auf die Referenz zuzugreifen, ist somit der folgende Code erforderlich: String objectref=null; IomObject refstruct=classbobj.getattrobj("a",0); if(refstruct!=null){ objectref=refstruct.getobjectrefoid(); Tabellendefinition (Modelldaten) zu einem Objekt ermitteln Die Objekte (IomObject) enthalten mit Absicht keinen direkten Verweis auf die entsprechenden Klassendefinitionen wie sie vom Compiler gelesen wurden. Die Zuordnung muss darum über eine Abbildungstabelle erfolgen. TransferDescription td=ch.interlis.ili2c.main.compileilimodels(); // Abbildungstabelle aufbauen Map tag2type=ch.interlis.iom_j.itf.modelutilities.gettagmap(td); IoxEvent event; IomObject iomobj=((objectevent)event).getiomobject(); Claude Eisenhut 2009-12-03,Seite 4

// qualifizierter Klassenname abbilden auf Klassendefinition AbstractClassDef tabledef=tag2type.get(iomobject.getobjecttag()); Attribute (Modelldaten) zu einer Tabelle ermitteln Welche Attribute eine Tabelle hat, ergibt sich aus dem Modell. Der Compiler übersetzt INTERLIS 1 Modelle intern in ein INTERLIS 2 Modell, d.h. aus einem INTERLIS 1-Referenzattribut entsteht somit eine Assoziation. Würde man das INTERLIS 1- Modell gem. den INTERLIS 2-Regeln transferieren, würde diese Assoziation bei der Klasse wo das INTERLIS 1-Referenzattribut definiert ist, eingebettet, d.h. die Liste der INTERLIS 1- Attribute umfasst die Attribute und Rollen. getattributesandroles() liefert allerdings für INTERLIS 1 nicht die richtige Reihenfolge! Darum gibt es eine Hilfsfunktion getili1attrlist(). Die Liste der Attribute zu einer INTERLIS 1-Tabelle kann somit mit folgendem Code durchlaufen werden: AbstractClassDef tabledef; ArrayList attrs=modelutilities.getili1attrlist(tabledef); Iterator attri=attrs.iterator(); while(attri.hasnext()){ ViewableTransferElement obj=(viewabletransferelement)attri.next(); if (obj.obj instanceof AttributeDef) { AttributeDef attr = (AttributeDef) obj.obj; if(obj.obj instanceof RoleDef){ RoleDef role = (RoleDef) obj.obj; if(obj.embedded){ // a role of an embedded association else if(!((associationdef)tabledef).islightweight()){ // a role in an association table else{ // a role in an association table; but embedded association // skip it INTERLIS 2 Für INTERLIS 2 stehen die folgenden Typen zur Verfügung: ch.interlis.iom_j.xtf.xtfwriter INTERLIS 2 Daten schreiben ch.interlis.iom_j.xtf.xtfreader INTERLIS 2 Daten lesen Ein INTERLIS 2 Reader wird mit folgendem Code erzeugt: XtfReader ioxreader=null; // open xtf file ioxreader=new XtfReader(new java.io.file(xtffilename)); catch(ioxexception ex){ finally{ if(ioxreader!=null){ ioxreader.close(); catch(ioxexception ex){ Claude Eisenhut 2009-12-03,Seite 5

ioxreader=null; Der XtfReader benötigt kein Datenmodell. Ein INTERLIS 2 Writer wird mit folgendem Code erzeugt (wobei transferdescription das vorgängig gelesene Modell repräsentiert): XtfWriter ioxwriter=null; // create xtf file ioxwriter=new XtfWriter( new java.io.file(itffilename),transferdescription ); catch(ioxexception ex){ finally{ if(ioxwriter!=null){ ioxwriter.close(); catch(ioxexception ex){ ioxwriter=null; Assoziationen Referenzen werden mit IOX als Teil eines strukturierten Werts repräsentiert. Je nach Art der Assoziation ist das sich ergebende Objektmodell unterschiedlich. Die Abbildung folgt dabei den Kodierungsregeln einer Assoziation. Im INTERLIS 2- Referenzhandbuch steht dazu: Beziehungen werden auf zwei Arten codiert: eingebettet oder nicht eingebettet. Eine eingebettete Beziehung wird als Sub-Element von einer, an der Assoziation beteiligten, Klasse codiert. Die Instanz einer nicht eingebetteten Beziehung (Link) wird wie eine Instanz einer Klasse codiert. Beziehungen werden immer eingebettet, ausser wenn sie mehr als zwei Rollen haben oder wenn bei beiden (Basis-)Rollen die maximale Kardinalität grösser 1 ist oder wenn für die Beziehung eine OID gefordert wird oder bei gewissen themenübergreifenden Beziehungen (s. unten). Falls bei einer der beiden (Basis-)Rollen die maximale Kardinalität grösser 1 ist, wird bei der Ziel-Klasse dieser Rolle eingebettet. Wenn diese Ziel-Klasse in einem anderen Topic definiert ist als die (Basis-)Assoziation, kann nicht eingebettet werden. Falls bei beiden (Basis-)Rollen die maximale Kardinalität kleiner gleich 1 ist, wird bei der Ziel- Klasse der zweiten Rolle eingebettet. Wenn diese Ziel-Klasse in einem anderen Topic definiert ist als die (Basis-)Assoziation und die Ziel-Klasse der ersten Rolle im selben Topic definiert ist wie die (Basis-)Assoziation, wird bei der Ziel-Klasse der ersten Rolle eingebettet (d.h., wenn die Ziel-Klassen der beiden Rollen in einem anderen Topic definiert sind als die (Basis- )Assoziation, kann nicht eingebettet werden). Claude Eisenhut 2009-12-03,Seite 6

Für eine eingebettete Beziehung würde das konzeptionelle Datenmodell in INTERLIS 2 wie folgt aussehen: CLASS ClassA = attr10 : TEXT*20; CLASS ClassB = attr20 : TEXT*20; END ClassB; ASSOCIATION = a -- {1 ClassA; b -- {0..* ClassB; END; Verweist nun ein Objekt der Klasse ClassB auf ein Objekt der Klasse ClassA, ergibt dies in IOX die folgende Struktur von Instanzen. ClassA ClassB attr10 objectref attr20 a REF Um auf die Referenz zuzugreifen, ist somit der folgende Code erforderlich: String objectref=null; IomObject refstruct=classbobj.getattrobj("a",0); if(refstruct!=null){ objectref=refstruct.getobjectrefoid(); Für eine nicht eingebettet Beziehung würde das Modell wie folgt aussehen: CLASS ClassA = attr10 : TEXT*20; CLASS ClassB = attr20 : TEXT*20; END ClassB; ASSOCIATION a2b = a -- {0..* ClassA; b -- {0..* ClassB; END a2b; Verweist nun ein Objekt der Klasse ClassB auf ein Objekt der Klasse ClassA, ergibt dies in IOX die folgende Struktur von Instanzen. Claude Eisenhut 2009-12-03,Seite 7

attr10 ClassA a2b attr20 ClassB objectref a b objectref REF REF Die Referenz vom Objekt ClassB zum Objekt ClassA ist also nicht mehr eine Eigenschaft von ClassB, sondern eine Eigenschaft des eigenständigen Objektes a2b. Um auf die Referenz zuzugreifen, ist somit der folgende Code erforderlich: String objectref=null; IomObject refstruct=a2bobj.getattrobj("a",0); if(refstruct!=null){ objectref=refstruct.getobjectrefoid(); Geometrien COORD Um COORD Geometrien zu repräsentieren, verwenden die INTERLIS Reader/Writer die im Folgenden dargestellte Struktur (IomObject ohne Identität). Beispiel INTERLIS 1 Model: TABLE ClassA = attr10 : COORD2 1.00 100.0 9.99 999.9; NO IDENT Beispiel INTERLIS 2 Model: CLASS ClassA = attr10 : COORD 1.00.. 9.99, 100.0.. 999.9; Claude Eisenhut 2009-12-03,Seite 8

Model Topic ClassA attr10 C1 C2 COORD Die Namen Model, Topic, ClassA und attr10 ergeben sich aus dem Datenmodell. Die übrigen Namen COORD, C1, C2 ergeben sich aus dem Datentyp COORD und dessen Abbildung durch die ItfReader/ItfWriter/XtfReader/XtfWriter. Gegeben ein IomObject der Klasse ClassA, kann mit folgendem Code auf die Koordinatenwerte des Attributes attr10 zugegriffen werden: if(objclassa.getattrvalue("attr10")==null){ IomObject coord= objclassa.getattrobj("attr10",0); String c1=coord.getattrvalue("c1"); String c2=coord.getattrvalue("c2"); POLYLINE Um POLYLINE Geometrien zu repräsentieren, verwenden die INTERLIS Reader/Writer die im Folgenden dargestellten Strukturen (IomObject ohne Identität). Beispiel INTERLIS 1 Model: DOMAIN Lkoord = COORD2 1.00 100.0 9.99 999.9; TABLE ClassA = attr10 : POLYLINE WITH (STRAIGHTS) VERTEX Lkoord; NO IDENT Beispiel INTERLIS 2 Model: DOMAIN Lkoord = COORD 1.00.. 9.99, 100.0.. 999.9; CLASS ClassA = attr10 : POLYLINE WITH (STRAIGHTS) VERTEX Lkoord; Claude Eisenhut 2009-12-03,Seite 9

ClassA attr10 POLYLINE sequence SEGMENTS segment C1 C2 COORD Die Namen ClassA und attr10 ergeben sich aus dem Datenmodell. Die übrigen Namen (POLYLINE, sequence, SEGMENTS, ) ergeben sich aus dem Datentyp POLYLINE und dessen Abbildung durch die ItfReader/ItfWriter/XtfReader/XtfWriter. Gegeben ein IomObject der Klasse ClassA, kann mit folgendem Code auf die Kurvenstücke des Attributes attr10 zugegriffen werden: IomObject polylineobj=objclassa.getattrobj("attr10",0); boolean clipped = polylineobj.getobjectconsistency()==iomconstants.iom_incomplete; for(int sequencei=0; sequencei<polylineobj.getattrvaluecount("sequence"); sequencei++){ if(!clipped && sequencei>0){ // an unclipped polyline should have only one sequence element throw new IllegalArgumentException(); IomObject sequence=polylineobj.getattrobj("sequence",sequencei); for(int segmenti=0; segmenti<sequence.getattrvaluecount("segment"); segmenti++){ IomObject segment=sequence.getattrobj("segment",segmenti); if(segment.getobjecttag().equals("coord")){ // COORD else if(segment.getobjecttag().equals("arc")){ // ARC else{ // custum line form Claude Eisenhut 2009-12-03,Seite 10

Mit der Funktion getobjectconsistency() kann abgefragt werden, ob es sich um eine vollständige oder unterteilte Linie handelt. Eine unterteilte Linie entsteht, wenn nur ein Ausschnitt aus einem Datensatz transferiert wird. Ob ein Basket vollständig ist oder nur ein Ausschnitt, lässt sich mit der Funktion getconsistency() auf dem StartBasketEvent überprüfen. Die Objektstruktur entspricht aus zwei Gründen nicht 1:1 der Elementstruktur in XML. 1. die Elementnamen sind z.t. sowohl Rollenname als auch Typname. 2. eine Schachtelung der Elementstruktur entfällt bei einer vollständigen Linie (bei einer die nicht wegen Ausschnittbildung unterteilt wurde) zugunsten von weniger Markup. Die Objektstruktur dagegen ist immer identisch. Bei einer vollständigen Linie gibt es genau ein Objekt SEGMENTS, bei einer Unterteilten Mehrere. SURFACE/AREA Um SURFACE bzw. AREA Geometrien zu repräsentieren, verwenden der INTERLIS 2 Reader/Writer die im Folgenden dargestellten Strukturen (IomObject ohne Identität). SURFACE und AREA werden nicht unterschieden, d.h. dieser Unterscheid ergibt sich nur aus dem Modell. ACHTUNG: Der ItfReader führt keine Flächenbildung durch, d.h. die Geometrie für SURFACE und AREA Attribute wird als Linie in Objekten der Linientabelle geliefert (ItfReader). Entsprechend erwartet auch der ItfWriter diese Linientabellen. Beachten Sie darum das vorgängige Kapitel zum Thema POLYLINE. Beispiel INTERLIS 2 Model für SURFACE: DOMAIN Lkoord = COORD 1.00.. 9.99, 100.0.. 999.9; CLASS ClassA = attr10 : SURFACE WITH (STRAIGHTS,ARCS) VERTEX Lkoord; Beispiel INTERLIS 2 Model für AREA: DOMAIN Lkoord = COORD 1.00.. 9.99, 100.0.. 999.9; CLASS ClassA = attr10 : AREA WITH (STRAIGHTS,ARCS) VERTEX Lkoord; Claude Eisenhut 2009-12-03,Seite 11

ClassA attr10 MULTISURFACE surface SURFACE boundary BOUNDARY polyline POLYLINE sequence SEGMENTS segment C1 C2 COORD Die Namen ClassA und attr10 ergeben sich aus dem Datenmodell. Die übrigen Namen (MULTISURFACE, surface, SURFACE, boundary, ) ergeben sich aus dem Datentyp SURFACE oder AREA und dessen Abbildung durch den XtfReader/XtfWriter. Gegeben ein IomObject der Klasse ClassA, kann mit folgendem Code auf die Linien der Ränder des Attributes attr10 zugegriffen werden: IomObject surfaceobj=objclassa.getattrobj("attr10",0); assert(surfaceobj.getobjecttag().equals("multisurface")); boolean clipped = Claude Eisenhut 2009-12-03,Seite 12

surfaceobj.getobjectconsistency()==iomconstants.iom_incomplete; for(int surfacei=0; surfacei< surfaceobj.getattrvaluecount("surface"); surfacei++){ if(!clipped && surfacei>0){ // unclipped surface with multi 'surface' elements throw new IllegalArgumentException(); IomObject surface= surfaceobj.getattrobj("surface",surfacei); int boundaryc=surface.getattrvaluecount("boundary"); for(int boundaryi=0;boundaryi<boundaryc;boundaryi++){ IomObject boundary=surface.getattrobj("boundary",boundaryi); if(boundaryi==0){ // shell else{ // hole for(int polylinei=0; polylinei<boundary.getattrvaluecount("polyline"); polylinei++){ IomObject polyline=boundary.getattrobj("polyline",polylinei); // add line to shell or hole // add shell or hole to surface //. Modellname aus Transferdatei ermitteln Kennt man das Modell nicht, kann man es aus der Transferdatei ermitteln, indem man bis zum ersten Basket liest. Der folgende Code zeigt wie das geht für INTERLIS 1, es funktioniert aber identisch für INTERLIS 2 (mit dem XtfReader statt dem ItfReader). ItfReader ioxreader=null; // open itf file ioxreader=new ItfReader(new java.io.file(itffilename)); // get first basket IoxEvent event; StartBasketEvent be=null; do{ event=ioxreader.read(); if(event instanceof StartBasketEvent){ be=(startbasketevent)event; break; while(!(event instanceof EndTransferEvent)); ioxreader.close(); ioxreader=null; // no baskets? if(be==null){ // no models! throw new IllegalArgumentException("no baskets in transfer-file"); String namev[]=be.gettype().split("\\."); String model=namev[0]; catch(ioxexception ex){ finally{ Claude Eisenhut 2009-12-03,Seite 13

if(ioxreader!=null){ ioxreader.close(); catch(ioxexception ex){ ioxreader=null; Fehlermeldungen Bei Datenfehlern die eine Weiterverarbeitung nicht ausschliessen (z.b. falscher Code bei einem Aufzählattribut), wird die Fehlermeldung via EhiLogger ausgegeben. Bei Datenfehlern (z.b. falsche Folge von TABL, OBJE, ETAB in INTERLIS 1) die eine Weiterverarbeitung behindern/ausschliessen, wird eine IoxException ausgelöst. Benötigte JAR-Dateien iox-api.jar iox-ili.jar ili2c.jar IOX API (Interfaces) INTERLIS 1+2 Reader/Writer INTERLIS-Compiler (beinhaltet EhiLogger) Claude Eisenhut 2009-12-03,Seite 14