Gangen fra UML-modell til faktiske data
Transcription
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&VERSION=2.0.0&REQUEST=DescribeFeatureType&OUTPUTFORMAT=application%2Fgml%2Bxml%3B+version%3D3.2&TYPENAME=app:Sektorlys &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."Lys""> <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."Lyssektor"" 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."Fundament""> <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