| Created: | 02/05/2012 11:47:09 AM |
| Modified: | 29/04/2016 9:21:16 PM |
Project: |
|
Advanced: |
|
| Attribute | ||
|
Public TAFReportStatus status |
||
Details:
|
||
|
Public TM_Instant issueTime |
||
Details:
|
||
|
Public TM_Period validTime |
||
Details:
|
||
|
Public OM_Observation baseForecast |
||
Details:
|
||
|
Public OM_Observation changeForecast |
||
Details:
|
||
|
Public AirportHeliport previousReportAerodrome |
||
Details:
|
||
|
Public TM_Period previousReportValidPeriod |
||
Details:
|
| Tag | Value |
| byValuePropertyType | false |
Details:
Values: true | false
Default: false Description: Create a property type that requires that the instance is encoded inline (applies to ISO 19136:2007 encoding rule). |
|
| isCollection | false |
Details:
Values: true | false
Default: false Description: Identifies the feature type as a feature collection. |
|
| noPropertyType | false |
Details:
Values: true | false
Default: false Description: Surpress creation of a standard property type that supports inline or by-reference encoding (applies to ISO 19136:2007 encoding rule). |
|
| Constraint | Type | Status |
| forAll( self.forecastConditions.temperature == null ) | Invariant | Approved |
Details:
Pattern ID: TAF.TAF1<br/>Description: Forecast conditions cannot include temperature information. They are otherwise identical to the prevailing conditions<br/>Assertion: (if(//iwxxm:MeteorologicalAerodromeForecastRecord/@changeIndicator) then(empty(iwxxm:MeteorologicalAerodromeForecastRecord/iwxxm:temperature)) else(true()))<br/>
|
||
| if( status == NORMAL ) previousReportValidPeriod == null | Invariant | Approved |
Details:
Pattern ID: TAF.TAF2<br/>Description: previousReportValidPeriod must be null unless this cancels, corrects or amends a previous report<br/>Assertion: (if( @status = 'NORMAL' ) then (empty(iwxxm:previousReportValidPeriod)) else (true()))<br/>
|
||
| if( status == AMENDED ) previousReportValidPeriod != null | Invariant | Approved |
Details:
Pattern ID: TAF.TAF3<br/>Description: An amended report must also include the valid time of the amended report<br/>Assertion: (if( @status = 'AMENDMENT' ) then (exists(iwxxm:previousReportValidPeriod)) else (true()))<br/>
|
||
| if( status == CANCELLED ) previousReportValidPeriod != null | Invariant | Approved |
Details:
Pattern ID: TAF.TAF4<br/>Description: A cancelled report must also include the valid time of the cancelled report<br/>Assertion: (if( @status = 'CANCELLATION' ) then (exists(iwxxm:previousReportValidPeriod)) else (true()))<br/>
|
||
| if( status == CORRECTION ) previousReportValidPeriod != null | Invariant | Approved |
Details:
Pattern ID: TAF.TAF5<br/>Description: A corrected report must reference<br/>Assertion: (if( @status = 'CORRECTION' ) then (exists(iwxxm:previousReportValidPeriod)) else (true()))<br/>
|
||
| self.changeForecasts.forAll( self.baseForecast.resultTime == self.resultTime ) | Invariant | Approved |
Details:
Pattern ID: TAF.TAF6<br/>Description: resultTime for the baseForecast and the changeForecasts must match<br/>Assertion: (empty(distinct-values(for $change-forecast in iwxxm:changeForecast return($change-forecast/om:OM_Observation/om:resultTime//gml:timePosition/text()=iwxxm:baseForecast/om:OM_Observation/om:resultTime//gml:timePosition/text())or($change-forecast/om:OM_Observation/om:resultTime/@xlink:href=iwxxm:baseForecast/om:OM_Observation/om:resultTime/@xlink:href))[.=false()]))<br/>
|
||
| self.issueTime == baseForecast.resultTIme | Invariant | Approved |
Details:
Pattern ID: TAF.TAF7<br/>Description: TAF issue time must match the baseForecast resultTime<br/>Assertion: (if(exists(iwxxm:baseForecast)) then(empty(distinct-values((iwxxm:issueTime//gml:timePosition/text()=iwxxm:baseForecast/om:OM_Observation/om:resultTime//gml:timePosition/text())or(concat( '#', iwxxm:issueTime//@gml:id )=iwxxm:baseForecast/om:OM_Observation/om:resultTime/@xlink:href))[.=false()])) else( true() ))<br/>
|
||
| self.baseForecast.changeIndicator == null | Invariant | Approved |
Details:
Pattern ID: TAF.TAF8<br/>Description: Base conditions may not have a change indicator<br/>Assertion: (empty(iwxxm:baseForecast//iwxxm:MeteorologicalAerodromeForecastRecord/@changeIndicator) )<br/>
|
||
| if( status == MISSING ) baseForecast.result includes nilReason AND validTime == NULL AND previousReportValidPeriod == NULL AND changeForecast == NULL | Invariant | Approved |
Details:
Pattern ID: TAF.TAF9<br/>Description: Missing TAF reports only include aerodrome information and issue time information<br/>Assertion: (if( @status = 'MISSING' ) then( (exists(iwxxm:baseForecast//om:result/@nilReason)) and ((empty(iwxxm:validTime)) and ((empty(iwxxm:previousReportValidPeriod)) and (empty(iwxxm:changeForecast))))) else( true()))<br/>
|
||
| let exclTerm : Set(String) = Set{'FROM', 'BECOMING'} in self.changeForecast->asSequence()->forAll(cf | self.changeForecast->asSequence()->indexOf(cf) > 1 implies cf.changeIndicator.substring(1, 11) = 'PROBABILITY' implies exclTerm->exclude | Invariant | Approved |
Details:
Pattern ID: TAF.TAF10<br/>Description: PROB30/PROB40 never follows a FROM or BECOMING group<br/>Assertion: ( if(count(iwxxm:changeForecast) gt 1) then( empty(iwxxm:changeForecast//iwxxm:MeteorologicalAerodromeForecastRecord[ (starts-with(./@changeIndicator, 'PROBABILITY')) and ((./../../../preceding-sibling::node()//iwxxm:MeteorologicalAerodromeForecastRecord/@changeIndicator = 'FROM') or (./../../../preceding-sibling::node()//iwxxm:MeteorologicalAerodromeForecastRecord/@changeIndicator = 'BECOMING') ) ]) ) else(true()) )<br/>
|
||
| if(status != MISSING) validTime != NULL | Invariant | Approved |
Details:
Pattern ID: TAF.TAF11<br/>Description: Non-missing TAF reports must contains validTime<br/>Assertion: (if( @status ne 'MISSING') then(exists(iwxxm:validTime)) else(true()))<br/>
|
||
| self.baseForecast.validTime.oclIsTypeOf( TM_Period ) | Invariant | Approved |
Details:
Pattern ID: TAF.TAF12<br/>Description: The O&M validTime of baseForecast must be a time period for TAF forecasts<br/>Assertion: (if((exists(//iwxxm:baseForecast/om:OM_Observation)) and (empty(//iwxxm:baseForecast/om:OM_Observation/om:result/@nilReason))) then((exists(//iwxxm:baseForecast/om:OM_Observation/om:validTime/gml:TimePeriod))or(concat( '#', //iwxxm:validTime/gml:TimePeriod/@gml:id ) = //iwxxm:baseForecast/om:OM_Observation/om:validTime/@xlink:href)) else(true()))<br/>
|
||
| self.changeForecast.validTime.oclIsTypeOf( TM_Period ) | Invariant | Approved |
Details:
Pattern ID: TAF.TAF13<br/>Description: The O&M validTime of changeForecast must be a time period for TAF forecasts<br/>Assertion: (if((exists(//iwxxm:changeForecast/om:OM_Observation)) and (empty(//iwxxm:changeForecast/om:OM_Observation/om:result/@nilReason))) then((exists(//iwxxm:changeForecast/om:OM_Observation/om:validTime/gml:TimePeriod))or(concat( '#', //iwxxm:validTime/gml:TimePeriod/@gml:id ) = //iwxxm:changeForecast/om:OM_Observation/om:validTime/@xlink:href)) else(true()))<br/>
|
||
| self.baseForecast.featureOfInterest.sampledFeature.oclIsKindOf( Aerodrome) | Invariant | Approved |
Details:
Pattern ID: TAF.TAF14<br/>Description: The sampled feature of baseForecast is always an aerodrome<br/>Assertion: ( if(exists(//iwxxm:baseForecast/om:OM_Observation)) then ( ( (exists(//iwxxm:baseForecast/om:OM_Observation/om:featureOfInterest//sf:sampledFeature/aixm:AirportHeliport)) or (contains(string(//iwxxm:baseForecast/om:OM_Observation/om:featureOfInterest//sf:sampledFeature/@xlink:href), 'aerodrome')) ) and ( if(exists(//iwxxm:baseForecast/om:OM_Observation/om:featureOfInterest/@xlink:href)) then (concat( '#', //iwxxm:baseForecast/om:OM_Observation//sams:SF_SpatialSamplingFeature/@gml:id ) = //iwxxm:baseForecast/om:OM_Observation/om:featureOfInterest/@xlink:href) else(true()) ) ) else(true()) )<br/>
|
||
| self.changeForecast.featureOfInterest.sampledFeature.oclIsKindOf( Aerodrome) | Invariant | Approved |
Details:
Pattern ID: TAF.TAF15<br/>Description: The sampled feature of changeForecast is always an aerodrome<br/>Assertion: ( if(exists(//iwxxm:changeForecast/om:OM_Observation)) then ( ( (exists(//iwxxm:changeForecast/om:OM_Observation/om:featureOfInterest//sf:sampledFeature/aixm:AirportHeliport)) or (contains(string(//iwxxm:changeForecast/om:OM_Observation/om:featureOfInterest//sf:sampledFeature/@xlink:href), 'aerodrome')) ) and ( if(exists(//iwxxm:changeForecast/om:OM_Observation/om:featureOfInterest/@xlink:href)) then (concat( '#', //iwxxm:changeForecast/om:OM_Observation//sams:SF_SpatialSamplingFeature/@gml:id ) = //iwxxm:changeForecast/om:OM_Observation/om:featureOfInterest/@xlink:href) else(true()) ) ) else(true()) )<br/>
|
||