Tool um mehrere xtf (mit gleichem Model) in eine xtf Datei zu mergen?

Guten Tag,

ich bin auf der Suche nach einem Tool, mit dem sich mehrere xtf Dateien (gleiches Interlis Modell) in eine gemeinsame xtf Datei zusammenfassen lassen.

  • bei infogrips gibt es itfcopy. dies scheint jedoch lediglich mit .itf Dateien zu funktionieren
  • Eine Suche ergab noch Hinweise auf ein „Interlis Toolbox Paket“ mit dem Programm ilmerge. Nur leider kann ich dieses Programm auch nach weiterer Suche nicht finden.

Anwendungsfall LKMap Zürich, eine Versorgung/Unternehmung beauftragt in Ihrem Versorgungsgebiet mehrere Unternehmungen ein Medium nachzuführen. Die Abgabe an den Kanton muss jedoch (nach meinem derzeitigen Wissenstand) in einer Datei (pro Medium) erfolgen.

Danke für Hinweise!
Adrian

Ich habe für diesen Zweck alle xtf in eine Datenbank geschrieben und dann von der DB wieder in eine XTF.
Dazu kannst du die Interlis-Tools verwenden (z.b. ili2gpkg) und mittels Batch alle xtf aus einem Verzeichnis automatisiert einlesen und anschliessend exportieren.

Tools: Index of / (interlis.ch)

Wichtig dabei ist aber, dass sich die Datenlieferanten an die eindeutigen IDs halten. Dies war bei mir leider nicht immer der Fall.

1 „Gefällt mir“

Vielen Dank für den Lösungsvorschlag!

Offenbar gibt es eine noch einfachere Lösung:

WSL bash: /mnt/c/temp/iltemp$ cat che*.xtf >> file_merged.xtf

Nach ersten Tests mit ilivalidator scheint dies zu funktionieren …

Es erstaunt mich, dass dies funktioniert. Dabei werden doch die Inhalte der Dateien in eine neue Datei kopiert, also inklusive dem Header. Aber der Header sollte doch in einer Interlis-Datei nur einmal vorkommen.

Naja, wenn es klappt, dann ist es ja gut.

Dasselbe gibt es übrigens auch in DOS:

copy *.xtf  alleDateien.xtf

Das schlichte mergen von xtf-Dateien scheint doch nicht richtig zu funktionieren (aufgrund der resultierenden Anzahl Elemente).
:point_right: der Ansatz von Thomas Marti via ili2gpkg erscheint doch erfolgversprechender.

1 „Gefällt mir“

Ich möchte das Thema nochmals aufgreifen; vielleicht ergibt sich hier eine Art „best-practice“.

Ich habe jetzt ein paar Kombinationen der LKMap-Dateien A und B ausprobiert, eindeutig sinnlose und fehlleitende und (anscheinend) richtige, geprüft mit ilivalidator. Erstellt mit Copy&Paste in UltraEdit; Ziel ist natürlich XSLT …

a) vollständiges mergen (Datei a plus Datei b):
Ergibt zwei vollständige Dateien mit zwei XML-Deklarationen in einer; ilival prüft nur die erste und ist zufrieden.

b) vollständiges mergen, aber händisches Löschen der zweiten Deklaration:
Validierung wie a)

c) Inhalt der Datasection A mit Inhalt der Datasection B ergänzen:
Alles wird geprüft; die Basket-ID ist gleich und die Validierung scheitert.

d) Inhalt der Datasection A mit Inhalt der Datasection B ergänzen und eine Basket-ID ändern
Alles wird geprüft; die Validierung zeigt zwei Baskets und ist erfolgreich.

e) Inhalt des Basket A mit Inhalt des Basket B ergänzen
Alles wird geprüft; die Validierung ist erfolgreich.

Somit scheiden a) und b) aus, weil die (falsche) Datenstruktur den Ilivalidator täuscht.
c) ergibt falsches Ergebnis, d) erfordert Handarbeit …

Bleibt Lösung e)

Bleibt die Frage: Ist das auch zulässig - technisch und formell? Oder produziert man da Datenmüll der Extraklasse?

Gemäss Referenzhandbuch (für INTERLIS 2.3, worum es hier vermutlich geht), besteht eine Transferdatei aus einer HeaderSection und einer DataSection:

Die DataSection kann keinen, einen oder mehrere Behälter (Basket) enthalten:

grafik

Es ist also nicht vorgesehen, mehrere DataSections in 1 Datei unterzubringen. Alle zusätzlichen DataSections werden von ilivalidator zurecht ignoriert, wie deine Tests zeigen.

Was hingegen möglich ist, ist, mehrere Behälter in der DataSection unterzubringen (wie oben in Kapitel 3.3.5 beschrieben). In Behältern werden die Inhalte von TOPICs transferiert.

Damit man sich nicht mit der Thematik des Transferformates herumschlagen muss, würde ich aber wärmstens die von @ThomasMarti propagierte Methode empfehlen: Nämlich das Einlesen der einzelnen Transferdatensätze in eine Datenbank oder ein Datenbankformat (mit ili2db) und anschliessend die Zusammenführung in der Datenbank. Das hat den Vorteil, dass die Daten vor dem Export noch in der DB validiert werden können. Und der Export liefert auf jeden Fall ein gültiges Transferformat; auch mit mehreren Baskes, falls gewünscht.

Damit kann man sich auch die Einarbeitung in XSLT sparen (und die gewonnene Zeit für die Einarbeitung in ili2db und SQL nutzen… :wink:)

1 „Gefällt mir“

e) Löst das Problem auch nicht immer. Du musst dich auch um die Eindeutigkeit der TID im Transfer kümmern? Oder gilt die nur für Baskets? @beistehen

Bisschen schade ist, dass das Importieren und Exportieren in eine DB die relativ teure Geometriebildung beinhaltet (also von XTF nach Simplefeature) inkl. Overlapbereinigung. Es ist also mehr als bloss ein Mergen.

1 „Gefällt mir“

Das mit der Eindeutigkeit der TIDs sollte via ili2db kein Problem sein.

Entweder sind sie gem. Modell schon global eindeutig (=OID bei allen Klassen und Topics).

Oder sie sind transient (kein OID bei Klasse und/oder Topic). Dann werden sie beim import durch ili2db eindeutig gemacht (in dem für jedes Objekt eine neue id generiert wird (Spalte t_id)), die beim export dann als TID verwendet wird.

1 „Gefällt mir“