Gangen fra UML-modell til faktiske data

Gangen fra UML-modell til faktiske data
Lars Eggan,
Norconsult Informasjonssystemer
Teknologiforum oktober 2015
1
Utgangspunkt
●
GeoSynkroniseringsprosjektet med utgangspunkt i
Lyktmerke synkronisering mellom Kystverket og
Sjødivisjonen i Kartverket.
●
Det ble laget en UML-modell basert på SOSI
standard.
Generert GML applikasjonsskjema
●
●
●
Testet WFS / GML
Testet WFS-T
2
Verktøy
●
●
●
Brukt Enterprise Architect for UML-modellering
ShapeChange plugin for å generere GML skjema
deegree som WFS-tjener
• Versjon 3.3.15/3.3.16 (OpenSource)
●
PostGIS som datalager for testdata.
3
Utfordringer
●
WFS / GML mht. assosiasjoner.
4
Assosiasjons-typer
●
Assosiasjon
•
Generell assosiasjon
benyttes mellom likestilte
objekttyper.
●
Aggregering
●
Komposisjon
5
Eksempler Assosiasjoner
●
Komposisjon:
•
●
sterk avhengighet med et
klart Parent-Child forhold.
Sektorlys eier Lyssektor.
Dersom Sektorlys slettes,
slettes også Lyssektor.
Aggregering
•
definerer et forhold, mellom
et "hele" og de respektive
"deler". LysFundament er en
del av
FastmerkeMedFundament.
6
Assosiasjoner
●
Assosiasjoner kan uttrykkes på 3 forskjellige måter
• Eksterne «byref»
• Interne «byref»
• «Inline»
●
Løses ved å angi type assosiasjon vha. Tagged
values på rollen.
• inlineOrByReference settes til inline eller
byReference
7
Assosiasjoner
●
I UML-modellen i EA:
• Bruk Tagged values inlineOrByReference
• inline eller inlineOrByReference
•
Gir Inline assosiasjoner
• Benytter man inlineOrByReference=byReference får
man interne byref dvs xlink:href.
●
Dette påvirker hvordan assosiasjonene blir utrykt i
GML applikasjonsskjema, og da også hvordan
dette blir i WFS/GML.
8
I Enterprise Architect:
9
Assosiasjoner - anbefalinger
●
Hva skal man bruke?
• byReference anbefalt for assosiasjoner mellom
objekttyper (features).
• Dersom det er assoiasjon mellom objekttype og
datatype, regnes dette som en komposisjon, og
det brukes inline.
●
INSPIRE
•
•
Recommendation 9 All navigable feature association roles should
be assigned a tagged value "inlineOrByReference" with the value
"byReference".
NOTE 1 The result of this particular recommendation is that features
are not embedded in other features in XML documents but that they
are all first level objects in a feature collection. An example where
this recommendation would in general be ignored are complex
spatial objects that own their parts.
10
WFS-T: wfs:Insert - byReference xlink:href
<?xml version="1.0" encoding="UTF-8"?>
<wfs:Transaction version="2.0.0" service="WFS" xmlns:wfs="http://www.opengis.net/wfs/2.0" xsi:schemaLocation="http://skjema.geonorge.no/standard/geosynkronisering/1.0/endringslogg
http://geosynkronisering.no/files/skjema/1.0/changelogfile.xsd http://skjema.geonorge.no/SOSI/produktspesifikasjon/maritimedata
http://skjema.geonorge.no/SOSI/produktspesifikasjon/maritimedata/lyktmerke.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:app="http://skjema.geonorge.no/SOSI/produktspesifikasjon/maritimedata" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink">
<wfs:Insert handle="100">
<app:Sektorlys gml:id="app.sektorlys.{00034AA0-2009-4C9B-8BF0-EE5B3F7DE24B}">
<app:identifikasjon>
<app:Identifikasjon>
<app:lokalId>b8ebe5fc-f58d-11e4-b9b2-1697f925ec7b</app:lokalId>
<app:navnerom>navnerom ikke gitt</app:navnerom>
<app:versjonId>versjonid ikke gitt</app:versjonId>
</app:Identifikasjon>
</app:identifikasjon>
<app:lystype>99</app:lystype>
<app:s57status>1</app:s57status>
<app:sektor xlink:href="#app.lyssektor.b8ebe836-f58d-11e4-b9b2-1697f925ec7b"></app:sektor>
<app:sektor xlink:href="#app.lyssektor.b8ebe976-f58d-11e4-b9b2-1697f925ec7b"></app:sektor>
</app:Sektorlys>
<app:Lyssektor gml:id="app.lyssektor.b8ebe836-f58d-11e4-b9b2-1697f925ec7b">
<app:lysfarge>1</app:lysfarge>
<app:sektorbeskrivelse>Lars sektorbeskrivelse1</app:sektorbeskrivelse>
<app:retningsektorlinje1>111.47599029</app:retningsektorlinje1>
<app:lengdesektorlinje1>1.53070902</app:lengdesektorlinje1>
<app:retningsektorlinje2>112.24830627</app:retningsektorlinje2>
<app:lengdesektorlinje2>0.45705183</app:lengdesektorlinje2>
<app:sektornr>5</app:sektornr>
<app:identifikasjon>
<app:Identifikasjon>
<app:lokalId>b8ebe836-f58d-11e4-b9b2-1697f925ec7b</app:lokalId>
<app:navnerom>navnerom ikke gitt</app:navnerom>
<app:versjonId>versjonid ikke gitt</app:versjonId>
</app:Identifikasjon>
</app:identifikasjon>
<app:sektorradius>0.4</app:sektorradius>
</app:Lyssektor>
<app:Lyssektor gml:id="app.lyssektor.b8ebe976-f58d-11e4-b9b2-1697f925ec7b">
<app:lysfarge>2</app:lysfarge>
<app:sektorbeskrivelse>Lars sektorbeskrivelse2</app:sektorbeskrivelse>
<app:retningsektorlinje1>111.47599029</app:retningsektorlinje1>
<app:lengdesektorlinje1>1.53070902</app:lengdesektorlinje1>
<app:retningsektorlinje2>112.24830627</app:retningsektorlinje2>
<app:lengdesektorlinje2>0.45705183</app:lengdesektorlinje2>
<app:sektornr>5</app:sektornr>
<app:identifikasjon>
<app:Identifikasjon>
<app:lokalId>b8ebe976-f58d-11e4-b9b2-1697f925ec7b</app:lokalId>
<app:navnerom>navnerom ikke gitt</app:navnerom>
<app:versjonId>versjonid ikke gitt</app:versjonId>
</app:Identifikasjon>
</app:identifikasjon>
<app:sektorradius>0.4</app:sektorradius>
</app:Lyssektor>
</wfs:Insert>
</wfs:Transaction>
11
WFS-T: wfs:GetFeature - (byReference)
<?xml version="1.0" encoding="UTF-8"?>
<wfs:FeatureCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd http://www.opengis.net/gml/3.2
http://schemas.opengis.net/gml/3.2.1/gml.xsd http://skjema.geonorge.no/SOSI/produktspesifikasjon/maritimedata
http://localhost:8080/services/gdb?SERVICE=WFS&amp;VERSION=2.0.0&amp;REQUEST=DescribeFeatureType&amp;OUTPUTFORMAT=application%2Fgml%2Bxml%3B+version%3D3.2&amp;TYPENAME=app:Sektorlys
&amp;NAMESPACES=xmlns(app,http%3A%2F%2Fskjema.geonorge.no%2FSOSI%2Fproduktspesifikasjon%2Fmaritimedata)" xmlns:wfs="http://www.opengis.net/wfs/2.0" timeStamp="2015-05-08T13:08:03Z"
xmlns:gml="http://www.opengis.net/gml/3.2" numberMatched="unknown" numberReturned="0">
<wfs:member>
<app:Sektorlys xmlns:app="http://skjema.geonorge.no/SOSI/produktspesifikasjon/maritimedata" gml:id="app.sektorlys.1612fc80-f4ac-11e4-b9b2-1697f925ec7b ">
<app:identifikasjon>
<app:Identifikasjon>
<app:lokalId>1612fc80-f4ac-11e4-b9b2-1697f925ec7b </app:lokalId>
<app:navnerom>navnerom ikke gitt</app:navnerom>
<app:versjonId>versjonid ikke gitt</app:versjonId>
</app:Identifikasjon>
</app:identifikasjon>
<app:lystype>99</app:lystype>
<app:fyrlistekarakter codeSpace="http://skjema.geonorge.no/SOSI/produktspesifikasjon/maritimedata/Fyrlistekarakter.xml"/>
<app:s57status>1</app:s57status>
<app:signalgruppe>signalgruppe finnes ikke i database</app:signalgruppe>
<app:sektor xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#app.lyssektor.1612fece-f4ac-11e4-b9b2-1697f925ec7b "/>
<app:sektor xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#app.lyssektor.1613000e-f4ac-11e4-b9b2-1697f925ec7b "/>
</app:Sektorlys>
</wfs:member>
<wfs:additionalObjects>
<wfs:SimpleFeatureCollection>
<wfs:member>
<app:Lyssektor xmlns:app="http://skjema.geonorge.no/SOSI/produktspesifikasjon/maritimedata" gml:id="app.lyssektor.1612fece-f4ac-11e4-b9b2-1697f925ec7b ">
<app:lysfarge>1</app:lysfarge>
<app:sektorbeskrivelse>Lars sektorbeskrivelse1</app:sektorbeskrivelse>
<app:retningsektorlinje1>111.47599029</app:retningsektorlinje1>
<app:lengdesektorlinje1>1.53070902</app:lengdesektorlinje1>
<app:retningsektorlinje2>112.24830627</app:retningsektorlinje2>
<app:lengdesektorlinje2>0.45705183</app:lengdesektorlinje2>
<app:sektornr>5</app:sektornr>
<app:identifikasjon>
<app:Identifikasjon>
<app:lokalId>1612fece-f4ac-11e4-b9b2-1697f925ec7b </app:lokalId>
<app:navnerom>navnerom ikke gitt</app:navnerom>
<app:versjonId>versjonid ikke gitt</app:versjonId>
</app:Identifikasjon>
</app:identifikasjon>
<app:sektorradius>0.4</app:sektorradius>
</app:Lyssektor>
</wfs:member>
<wfs:member>
<app:Lyssektor xmlns:app="http://skjema.geonorge.no/SOSI/produktspesifikasjon/maritimedata" gml:id="app.lyssektor.1613000e-f4ac-11e4-b9b2-1697f925ec7b ">
<app:lysfarge>2</app:lysfarge>
<app:sektorbeskrivelse>Lars sektorbeskrivelse2</app:sektorbeskrivelse>
<app:retningsektorlinje1>111.47599029</app:retningsektorlinje1>
<app:lengdesektorlinje1>1.53070902</app:lengdesektorlinje1>
<app:retningsektorlinje2>112.24830627</app:retningsektorlinje2>
<app:lengdesektorlinje2>0.45705183</app:lengdesektorlinje2>
<app:sektornr>5</app:sektornr>
<app:identifikasjon>
<app:Identifikasjon>
<app:lokalId>1613000e-f4ac-11e4-b9b2-1697f925ec7b </app:lokalId>
<app:navnerom>navnerom ikke gitt</app:navnerom>
<app:versjonId>versjonid ikke gitt</app:versjonId>
</app:Identifikasjon>
</app:identifikasjon>
<app:sektorradius>0.4</app:sektorradius>
</app:Lyssektor>
</wfs:member>
</wfs:SimpleFeatureCollection>
</wfs:additionalObjects>
</wfs:FeatureCollection>
12
Oppsett i deegree for assosiasjoner mellom
features - 0..* / 1..* (mot relasjonsdatabaser som
PostGIS, SQL Server, Oracle)
●
●
Man må lage en koblingstabell som tilsvarer rollen mellom
objekttypene, for å kunne utrykke en join.
Denne tabellen inneholder typisk 3 kolonner:
• parentfk - nøkkel til "parent"
• fk - nøkkel til "child"
• href - xlink:href til gml-id for "child"
●
●
Dersom eksisterende data, generes innhold vha. en sqlsetning
Vedlikeholdes f.eks. vha. triggere
13
Oppsett i deegree for assosiasjoner
mellom features - 0..* / 1..*
●
Mapping-fil deegree for rolle "sektor" mellom Sektorlys og
Lyssektor:
●
<FeatureTypeMapping name="app:Sektorlys" table="public.&quot;Lys&quot;">
<FIDMapping prefix="app.sektorlys.">
<Column name="globalid" type="string"/>
<UUIDGenerator/>
</FIDMapping>
…
…
<!-- 1..* assosiasjon mot Lyssektor via rolle sektor:
koblingstabell lys_lyssektor -->
<Complex path="app:sektor">
<Join table="public.lys_lyssektor" fromColumns="globalid" toColumns="parentfk">
</Join>
<Feature path=".">
<Join table="public.&quot;Lyssektor&quot;" fromColumns="fk" toColumns="globalid">
</Join>
<Href mapping="href"/>
</Feature>
</Complex>
…
</FeatureTypeMapping>
14
Oppsett i deegree for assosiasjoner
mellom features - 0..* / 1..*
●
Lys
●
lys_lyssektor
●
Lyssektor
15
Fungerer også dersom flere nivå
class Signalutstyr
●
●
«featureType»
FastmerkeMedFundament
Fundament kan ha 0 eller
flere Sektorlys
Sektorlys kan ha 1 eller flere
Lyssektor.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
førstedatafangstdato :DateTime [0..1]
merketype :MerkeMedFundamentType
sjømerkenummer :CharacterString
bygghøyde :Real [0..1]
klasse :FastmerkeFundamentKlasse
kopidata :Kopidata [0..1]
lysrefleks :Boolean [0..1]
opphav :CharacterString [0..1]
posisjon :Punkt
navn :CharacterString [0..1]
beliggenhet :CharacterString [0..1]
sted :CharacterString [0..1]
gyldigfra :DateTime [0..1]
eier :Objekteier [0..1]
s57status :Sjøstatus [0..1]
gyldigtil :DateTime [0..1]
kystverkregion :MaritimRegion [0..1]
datafangstdato :DateTime [0..1]
oppdateringsdato :DateTime [0..1]
kvalitet :Posisjonskvalitet [0..1]
beskrivelse :CharacterString [0..1]
nfsstatus :NFSstatus [0..1]
identifikasjon :Identifikasjon
uttaksdato :DateTime [0..1]
pillarkategori :Pillarkategori
«featureType»
Sektorlys
+sjomerke
1
Sjømerke_Signalutstyr
+
+
+utstyr +
+
0..*
+
+
+
+
+
+
+
identifikasjon :Identifikasjon
lystype :NavlysType
fyrlistekarakter :Fyrlistekarakter [0..1]
lyshøyde :Real [0..1]
rekkeviddehvit :Real [0..1]
rekkeviddegrønn :Real [0..1]
rekkeviddegul :Real [0..1]
lyskarakter :Navigasjonslyskarakter [0..1]
s57status :Sjøstatus
signalgruppe :CharacterString [0..1]
signalperiode :Integer [0..1]
1
+sektorlys
Sektorlys_Lyssektor
+sektor
1..*
«featureType»
Lyssektor
+
+
+
+
+
+
+
+
+
16
lysfarge :Sjømerkefarge [0..1]
sektorbeskrivelse :CharacterString [0..1]
retningsektorlinje1 :Real
lengdesektorlinje1 :Real
retningsektorlinje2 :Real
lengdesektorlinje2 :Real
sektornr :Integer
identifikasjon :Identifikasjon
sektorradius :Real
Multiplisitet på Datatyper
●
Multiplisitet på Datatyper
class Signalutstyr
• Dette er inLine (lik en komposisjon)
• Test med informasjon [0..*]
17
«featureType»
FastmerkeMedFundament
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
førstedatafangstdato :DateTime [0..1]
merketype :MerkeMedFundamentType
sjømerkenummer :CharacterString
bygghøyde :Real [0..1]
klasse :FastmerkeFundamentKlasse
kopidata :Kopidata [0..1]
lysrefleks :Boolean [0..1]
opphav :CharacterString [0..1]
posisjon :Punkt
navn :CharacterString [0..1]
beliggenhet :CharacterString [0..1]
sted :CharacterString [0..1]
gyldigfra :DateTime [0..1]
eier :Objekteier [0..1]
s57status :Sjøstatus [0..1]
gyldigtil :DateTime [0..1]
kystverkregion :MaritimRegion [0..1]
datafangstdato :DateTime [0..1]
oppdateringsdato :DateTime [0..1]
kvalitet :Posisjonskvalitet [0..1]
beskrivelse :CharacterString [0..1]
nfsstatus :NFSstatus [0..1]
identifikasjon :Identifikasjon
uttaksdato :DateTime [0..1]
pillarkategori :Pillarkategori
informasjon :CharacterString [0..*]
Oppsett i deegree for datatyper med
multiplisitet - 0..* / 1..*
●
Mapping-fil deegree for datatype informasjon
• Om datatypen er kompleks eller ikke spiller ingen rolle
●
<FeatureTypeMapping name="app:FastmerkeMedFundament" table="public.&quot;Fundament&quot;">
<FIDMapping prefix="app.fastmerkemedfundament.">
<Column name="globalid" type="string"/>
<UUIDGenerator/>
</FIDMapping>
…
…
<!-- Assosiasjon mot datatype (alltid inline), eksempelvis informasjon 0..*. Krever en join mot en annen tabell -->
<Primitive path="app:informasjon" mapping="informasjon" type="string">
<Join table="public.fundament_informasjon" fromColumns="globalid" toColumns="parentfk" orderColumns="num" numbered="true"/>
</Primitive>
…
</FeatureTypeMapping>
18
Oppsett i deegree for datatyper med
multiplisitet - 0..* / 1..*
●
Fundament
●
fundament_informasjon
19
Multiplisitet fra en Datatype til en
annen
●
●
Håndteres på samme måte som tidligere beskrevet, det blir
bare ett nivå til, men fører til økende kompleksitet.
Overføres inLine
20
Konklusjon
●
UML-modell med assosiasjoner OK
• Rollenavn er sentralt og obligatorisk
●
GML applikasjons skjema vi genererer med ShapeChange
plugin i EA er OK :
• Assosiasjoner håndteres med deegree som WFS-tjener (tilbyder)
• Kan også gjøre WFS-T transaksjoner mot deegree med
assosiasjoner (abonnent)
• Kan hente data med andre verktøy (f.eks. FME)
21
FME Data Inspector - FastmerkeMedFundament
22
FME Data Inspector - FastmerkeMedFundament
23