Skip to content

Instantly share code, notes, and snippets.

@signedav
Last active November 16, 2023 13:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save signedav/fd2426650230e2c4eabf3958aee14cc9 to your computer and use it in GitHub Desktop.
Save signedav/fd2426650230e2c4eabf3958aee14cc9 to your computer and use it in GitHub Desktop.
OID (TID / BID) Generation

Generieren von OIDs (TID/BID) und Behälter (Basket) Manager

Hintergrund

Model Baker macht das Arbeiten mit INTERLIS Datenmodellen in QGIS einfach. Dennoch bedürfen gewisse Szenarien noch manueller Konfigurationen. Eines davon ist das Generieren von OID Werten und Behälter.

1. OID Generierung

Problem

Das Format der systemübergreifenden TID oder auch der BID (für Behälter) kann in INTERLIS Modellen OID AS definiert werden:

 ANYOID = OID ANY;
 I32OID = OID 0 .. 2147483647; !! positive in 4 Bytes speicherbare Integerwerte
 STANDARDOID = OID TEXT*16; !! gemäss Anhang D (nur Ziffern und Buchstaben erlaubt)
 UUIDOID = OID TEXT*36; !! gemäss ISO 11578

Oder auch Benutzerdefiniert:

 TypeID = OID TEXT*60;

Aktuell erstellt Model Baker Standardwerte für TIDs/BIDs mit dem OID Format UUIDOID (Universally Unique Identifier). Die anderen Formate sind nicht unterstützt.

Lösung

Das Erstellen einer Expression für den Standardwert der TIDs/BIDs soll im Wizard angeboten werden. Dafür sollen die Formate der existierenden OID Definitionen erkannt werden (ch.ehi.ili2db.oidDomain in t_ili2db_column_prop) und die nötigen Funktionalitäten (zum Beispiel: Laufnummer ab ... implementiert als Sequence oder in T_KEY_OBJECT) angeboten werden. Einige Informationen müssen vom Benutzer definiert werden. ZBs. der Prefix in der STANDARDOID.

V1

image

V2

image

Details

Der Wertebereich der Objektidentifikationen aller Objekte dieser Klasse kann explizit festgelegt werden (OID AS). Fehlt die Definition, gilt diejenige des Themas, es sei denn, es werde explizit festgelegt, dass keine Objektidentifikationen gefragt sind (NO OID). Es ist nicht möglich, eine bereits gemachte OID Definition zu erweitern, ausser dass ein geerbtes ANY durch eine konkrete Definition ersetzt wird. Ein geerbtes ANY kann jedoch nicht durch NO OID ersetzt werden. (vgl. Kapitel 2.8.9 Wertebereiche von Objektidentifikationen). ([1] Chap. 2.5.3)

Generell gilt, dass OIDs XML-ID sein sollen mit bestimmten Zulässigkeiten ("à la INTERLIS"):

XML-ID= XML-ValueDelimiter [XML-NcName ':' ] ( Letter | Digit | '_' ) { Letter | Digit | '_' | '-' | '.' } XML-ValueDelimiter.

([1] Chap. 3.3.1.) Also ist XML-NcName (das keine Digits als erstes Zeichen zulässt) optional.

STANDARDOID

image

([1] Anhang D)

Also soll diese ID aus 16 Zeichen bestehen, die aus Digits und Lettern bestehen. Benutzer soll Prefix definieren. Postfix soll während des Erfassens generiert werden können.

ili2db erstellt t_ili_tid character varying(200)

OID TEXT*60

OID-Werte von textlichen OID-Wertebereichen müssen die Regeln des XML-ID-Typs erfüllen: erstes Zeichen muss Buchstabe oder Unterstrich sein, dann folgen Buchstaben, Ziffern, Punkte, Minuszeichen, Unterstriche; keine Doppelpunkte (!), siehe www.w3.org/TR/REC-xml. ([1] Chap. 2.8.9)

Also sind keine Digits als erste Zeichen erlaubt. Siehe auch opengisch/QgisModelBaker#599 (comment)

I32OID

Grundsätzlich 0 .. 2147483647

Wird aber irgendwie nicht von ili2db geprüft.

ANY oder gar nicht definiert

Wenn keine Definition mit OID AS besteht, wird in ili2db von TEXT ausgegangen und somit keine führenden Digits akzeptiert. Siehe opengisch/QgisModelBaker#599 (comment)

OID-Werte von textlichen OID-Wertebereichen müssen die Regeln des XML-ID-Typs erfüllen: erstes Zeichen muss Buchstabe oder Unterstrich sein, dann folgen Buchstaben, Ziffern, Punkte, Minuszeichen, Unterstriche; keine Doppelpunkte (!), siehe www.w3.org/TR/REC-xml.

2. Behälter Manager

Problem

Wenn ein Modell importiert und so die physische Datenbank erstellt wird, müssen für alle möglichen Daten Behälter erstellt werden. Im Moment wird für jede Schnittmenge Modell bzw. Topic mit Dataset ein Behälter erstellt. Dies führt zu einigen ungenutzten Behälter, die zu unnötigen Relationen führen und auch die Auswahl des korrekten Behälters erschweren.

Lösung

Da nicht automatisch erkannt werden kann, welche Behälter nicht genutzt werden bzw. welche Behälter erst mit dem Daten-Import erstellt werden, sollen Benutzer:innen dies steuern können. In diesem Zusammenhang soll dann auch die OID definiert werden.

V1

image

V2

image

Sourcen

[1] INTERLIS 2.3 Referenzhandbuch

opengisch/QgisModelBaker#340 opengisch/QgisModelBaker#599 opengisch/QgisModelBaker#718

Mockups: https://excalidraw.com/#json=LfBdQ8uffPcCG4zYwJWoM,LY_3TF23TIzINqqKseAxyw

@p1d1d1
Copy link

p1d1d1 commented Jan 3, 2023

  • TID and BID ([1] Chap. 3.3.6 and 3.3.7) are encoded as XML-ID «à la INTERLIS» ([1] Chap. 3.3.1): this is not a "proper" XML-ID-type
  • STANDARDOID: only numbers and letters are allowed ([1] Chap. 2.8.9)
  • UUIDOID: valid UUID according to ISO 11578 ([1] Chap. 2.8.9)
  • Numeric OID: only numbers are allowed
  • Text OID: "proper" XML-ID-type ([1] Chap. 2.8.9)

[1] INTERLIS 2.3 Referenzhandbuch

@signedav
Copy link
Author

signedav commented Jan 5, 2023

Thanks for your input @p1d1d1 This pretty much applies to the summary above. Only thing that confuses me is "proper" XML-ID vs. XML-ID "à la INTERLIS". What are the differences?

@p1d1d1
Copy link

p1d1d1 commented Jan 5, 2023

XML-ID "à la INTERLIS" may start with a digit. [XML-NcName ':' ] means XML-NcName is optional
XML-ID-Type cannot start with a digit (https://www.w3.org/TR/REC-xml/#id)

@signedav
Copy link
Author

signedav commented Jan 5, 2023

Ah now it's clear. Updated the file. Thanks.

@ltzur
Copy link

ltzur commented Jan 13, 2023

Kleine Ergänzung zu den Ausführungen von Pasquale Di Donato:

Wenn im Modell UUIDOID als OID TEXT36 modelliert wird, betrachtet der ilivalidator dies als Text OID und somit werden alle UUID mit einer beginnenden Ziffer als falsch reklamiert. Dass das nicht passiert, muss im Modell UUID als INTERLIS.UUIDOID definiert werden, dann werden alle nach ISO 11578 gültigen UUID akzeptiert (auch wenn INTERLIS.UUIDOID nach Anhang A, Referenzhandbuch ebenfalls als TEXT36 definiert ist).

@sjib
Copy link

sjib commented Feb 20, 2023

OID Präfix for STANDARDOID can be ordered here for Swizterland to make sure they are unique: https://www.interlis.ch/en/dienste/oid-bestellen

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment