<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns:gml="http://www.opengis.net/gml" targetNamespace="http://www.opengis.net/gml"
        xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.0">
  <annotation>
    <appinfo source="urn:ogc:specification:gml:schema-xsd:temporal:3.2.0">temporal.xsd</appinfo>
    <documentation>See ISO/DIS 19136 15.2.
      The GML temporal schemas include components for describing temporal geometry and topology,
      temporal reference systems, and the temporal characteristics of geographic data. The model
      underlying the representation constitutes a profile of the conceptual schema described in ISO
      19108. The underlying spatiotemporal model strives to accommodate both feature-level and
      attribute-level time stamping; basic support for tracking moving objects is also included.
      Time is measured on two types of scales: interval and ordinal. An interval scale offers a
      basis for measuring duration, an ordinal scale provides information only about relative
      position in time.
      Two other ISO standards are relevant to describing temporal objects: ISO 8601 describes
      encodings for time instants and time periods, as text strings with particular structure and
      punctuation; ISO 11404 provides a detailed description of time intervals as part of a general
      discussion of language independent datatypes.
      The temporal schemas cover two interrelated topics and provide basic schema components for
      representing temporal instants and periods, temporal topology, and reference systems; more
      specialized schema components defines components used for dynamic features. Instances of
      temporal geometric types are used as values for the temporal properties of geographic
      features.
    </documentation>
  </annotation>
  <include schemaLocation="gmlBase.xsd"/>
  <element name="AbstractTimeObject" type="gml:AbstractTimeObjectType" abstract="true"
           substitutionGroup="gml:AbstractGML">
    <annotation>
      <documentation>gml:AbstractTimeObject acts as the head of a substitution group for all
        temporal primitives and complexes.
      </documentation>
    </annotation>
  </element>
  <complexType name="AbstractTimeObjectType" abstract="true">
    <complexContent>
      <extension base="gml:AbstractGMLType"/>
    </complexContent>
  </complexType>
  <element name="AbstractTimePrimitive" type="gml:AbstractTimePrimitiveType" abstract="true"
           substitutionGroup="gml:AbstractTimeObject">
    <annotation>
      <documentation>gml:AbstractTimePrimitive acts as the head of a substitution group for
        geometric and topological temporal primitives.
      </documentation>
    </annotation>
  </element>
  <complexType name="AbstractTimePrimitiveType" abstract="true">
    <complexContent>
      <extension base="gml:AbstractTimeObjectType">
        <sequence>
          <element name="relatedTime" type="gml:RelatedTimeType" minOccurs="0"
                   maxOccurs="unbounded"/>
        </sequence>
      </extension>
    </complexContent>
  </complexType>
  <complexType name="TimePrimitivePropertyType">
    <annotation>
      <documentation>gml:TimePrimitivePropertyType provides a standard content model for
        associations between an arbitrary member of the substitution group whose head is
        gml:AbstractTimePrimitive and another object.
      </documentation>
    </annotation>
    <sequence minOccurs="0">
      <element ref="gml:AbstractTimePrimitive"/>
    </sequence>
    <attributeGroup ref="gml:AssociationAttributeGroup"/>
    <attributeGroup ref="gml:OwnershipAttributeGroup"/>
  </complexType>
  <element name="validTime" type="gml:TimePrimitivePropertyType">
    <annotation>
      <documentation>gml:validTime is a convenience property element.</documentation>
    </annotation>
  </element>
  <complexType name="RelatedTimeType">
    <annotation>
      <documentation>gml:RelatedTimeType provides a content model for indicating the relative
        position of an arbitrary member of the substitution group whose head is
        gml:AbstractTimePrimitive. It extends the generic gml:TimePrimitivePropertyType with an XML
        attribute relativePosition, whose value is selected from the set of 13 temporal
        relationships identified by Allen (1983)
      </documentation>
    </annotation>
    <complexContent>
      <extension base="gml:TimePrimitivePropertyType">
        <attribute name="relativePosition">
          <simpleType>
            <restriction base="string">
              <enumeration value="Before"/>
              <enumeration value="After"/>
              <enumeration value="Begins"/>
              <enumeration value="Ends"/>
              <enumeration value="During"/>
              <enumeration value="Equals"/>
              <enumeration value="Contains"/>
              <enumeration value="Overlaps"/>
              <enumeration value="Meets"/>
              <enumeration value="OverlappedBy"/>
              <enumeration value="MetBy"/>
              <enumeration value="BegunBy"/>
              <enumeration value="EndedBy"/>
            </restriction>
          </simpleType>
        </attribute>
      </extension>
    </complexContent>
  </complexType>
  <element name="AbstractTimeComplex" type="gml:AbstractTimeComplexType" abstract="true"
           substitutionGroup="gml:AbstractTimeObject">
    <annotation>
      <documentation>gml:AbstractTimeComplex is an aggregation of temporal primitives and acts as
        the head of a substitution group for temporal complexes.
      </documentation>
    </annotation>
  </element>
  <complexType name="AbstractTimeComplexType" abstract="true">
    <complexContent>
      <extension base="gml:AbstractTimeObjectType"/>
    </complexContent>
  </complexType>
  <element name="AbstractTimeGeometricPrimitive" type="gml:AbstractTimeGeometricPrimitiveType"
           abstract="true" substitutionGroup="gml:AbstractTimePrimitive">
    <annotation>
      <documentation>gml:TimeGeometricPrimitive acts as the head of a substitution group for
        geometric temporal primitives.
        A temporal geometry shall be associated with a temporal reference system through the frame
        attribute that provides a URI reference that identifies a description of the reference
        system. Following ISO 19108, the Gregorian calendar with UTC is the default reference
        system, but others may also be used. The GPS calendar is an alternative reference systems in
        common use.
        The two geometric primitives in the temporal dimension are the instant and the period. GML
        components are defined to support these as follows.
      </documentation>
    </annotation>
  </element>
  <complexType name="AbstractTimeGeometricPrimitiveType" abstract="true">
    <complexContent>
      <extension base="gml:AbstractTimePrimitiveType">
        <attribute name="frame" type="anyURI" default="#ISO-8601"/>
      </extension>
    </complexContent>
  </complexType>
  <element name="TimeInstant" type="gml:TimeInstantType"
           substitutionGroup="gml:AbstractTimeGeometricPrimitive">
    <annotation>
      <documentation>gml:TimeInstant acts as a zero-dimensional geometric primitive that represents
        an identifiable position in time.
      </documentation>
    </annotation>
  </element>
  <complexType name="TimeInstantType" final="#all">
    <complexContent>
      <extension base="gml:AbstractTimeGeometricPrimitiveType">
        <sequence>
          <element ref="gml:timePosition"/>
        </sequence>
      </extension>
    </complexContent>
  </complexType>
  <complexType name="TimeInstantPropertyType">
    <annotation>
      <documentation>gml:TimeInstantPropertyType provides for associating a gml:TimeInstant with an
        object.
      </documentation>
    </annotation>
    <sequence minOccurs="0">
      <element ref="gml:TimeInstant"/>
    </sequence>
    <attributeGroup ref="gml:AssociationAttributeGroup"/>
    <attributeGroup ref="gml:OwnershipAttributeGroup"/>
  </complexType>
  <element name="TimePeriod" type="gml:TimePeriodType"
           substitutionGroup="gml:AbstractTimeGeometricPrimitive">
    <annotation>
      <documentation>gml:TimePeriod acts as a one-dimensional geometric primitive that represents an
        identifiable extent in time.
        The location in of a gml:TimePeriod is described by the temporal positions of the instants
        at which it begins and ends. The length of the period is equal to the temporal distance
        between the two bounding temporal positions.
        Both beginning and end may be described in terms of their direct position using
        gml:TimePositionType which is an XML Schema simple content type, or by reference to an
        indentifiable time instant using gml:TimeInstantPropertyType.
        Alternatively a limit of a gml:TimePeriod may use the conventional GML property model to
        make a reference to a time instant described elsewhere, or a limit may be indicated as a
        direct position.
      </documentation>
    </annotation>
  </element>
  <complexType name="TimePeriodType">
    <complexContent>
      <extension base="gml:AbstractTimeGeometricPrimitiveType">
        <sequence>
          <choice>
            <element name="beginPosition" type="gml:TimePositionType"/>
            <element name="begin" type="gml:TimeInstantPropertyType"/>
          </choice>
          <choice>
            <element name="endPosition" type="gml:TimePositionType"/>
            <element name="end" type="gml:TimeInstantPropertyType"/>
          </choice>
          <group ref="gml:timeLength" minOccurs="0"/>
        </sequence>
      </extension>
    </complexContent>
  </complexType>
  <complexType name="TimePeriodPropertyType">
    <annotation>
      <documentation>gml:TimePeriodPropertyType provides for associating a gml:TimePeriod with an
        object.
      </documentation>
    </annotation>
    <sequence minOccurs="0">
      <element ref="gml:TimePeriod"/>
    </sequence>
    <attributeGroup ref="gml:AssociationAttributeGroup"/>
    <attributeGroup ref="gml:OwnershipAttributeGroup"/>
  </complexType>
  <complexType name="TimePositionType" final="#all">
    <annotation>
      <documentation>The method for identifying a temporal position is specific to each temporal
        reference system. gml:TimePositionType supports the description of temporal position
        according to the subtypes described in ISO 19108.
        Values based on calendars and clocks use lexical formats that are based on ISO 8601, as
        described in XML Schema Part 2:2001. A decimal value may be used with coordinate systems
        such as GPS time or UNIX time. A URI may be used to provide a reference to some era in an
        ordinal reference system .
        In common with many of the components modelled as data types in the ISO 19100 series of
        International Standards, the corresponding GML component has simple content. However, the
        content model gml:TimePositionType is defined in several steps.
        Three XML attributes appear on gml:TimePositionType:
        A time value shall be associated with a temporal reference system through the frame
        attribute that provides a URI reference that identifies a description of the reference
        system. Following ISO 19108, the Gregorian calendar with UTC is the default reference
        system, but others may also be used. Components for describing temporal reference systems
        are described in 14.4, but it is not required that the reference system be described in
        this, as the reference may refer to anything that may be indentified with a URI.
        For time values using a calendar containing more than one era, the (optional)
        calendarEraName attribute provides the name of the calendar era.
        Inexact temporal positions may be expressed using the optional indeterminatePosition
        attribute. This takes a value from an enumeration.
      </documentation>
    </annotation>
    <simpleContent>
      <extension base="gml:TimePositionUnion">
        <attribute name="frame" type="anyURI" default="#ISO-8601"/>
        <attribute name="calendarEraName" type="string"/>
        <attribute name="indeterminatePosition" type="gml:TimeIndeterminateValueType"/>
      </extension>
    </simpleContent>
  </complexType>
  <simpleType name="TimeIndeterminateValueType">
    <annotation>
      <documentation>These values are interpreted as follows:
        - “unknown” indicates that no specific value for temporal position is provided.
        - “now” indicates that the specified value shall be replaced with the current temporal
        position whenever the value is accessed.
        - “before” indicates that the actual temporal position is unknown, but it is known to be
        before the specified value.
        - “after” indicates that the actual temporal position is unknown, but it is known to be
        after the specified value.
        A value for indeterminatePosition may
        - be used either alone, or
        - qualify a specific value for temporal position.
      </documentation>
    </annotation>
    <restriction base="string">
      <enumeration value="after"/>
      <enumeration value="before"/>
      <enumeration value="now"/>
      <enumeration value="unknown"/>
    </restriction>
  </simpleType>
  <simpleType name="TimePositionUnion">
    <annotation>
      <documentation>The simple type gml:TimePositionUnion is a union of XML Schema simple types
        which instantiate the subtypes for temporal position described in ISO 19108.
        An ordinal era may be referenced via URI. A decimal value may be used to indicate the
        distance from the scale origin . time is used for a position that recurs daily (see ISO
        19108:2002 5.4.4.2).
        Finally, calendar and clock forms that support the representation of time in systems based
        on years, months, days, hours, minutes and seconds, in a notation following ISO 8601, are
        assembled by gml:CalDate
      </documentation>
    </annotation>
    <union memberTypes="gml:CalDate time dateTime anyURI decimal"/>
  </simpleType>
  <simpleType name="CalDate">
    <union memberTypes="date gYearMonth gYear"/>
  </simpleType>
  <element name="timePosition" type="gml:TimePositionType">
    <annotation>
      <documentation>This element is used directly as a property of gml:TimeInstant (see 15.2.2.3),
        and may also be used in application schemas.
      </documentation>
    </annotation>
  </element>
  <group name="timeLength">
    <annotation>
      <documentation>The length of a time period.</documentation>
    </annotation>
    <choice>
      <element ref="gml:duration"/>
      <element ref="gml:timeInterval"/>
    </choice>
  </group>
  <element name="duration" type="duration">
    <annotation>
      <documentation>gml:duration conforms to the ISO 8601 syntax for temporal length as implemented
        by the XML Schema duration type.
      </documentation>
    </annotation>
  </element>
  <element name="timeInterval" type="gml:TimeIntervalLengthType">
    <annotation>
      <documentation>gml:timeInterval conforms to ISO 11404 which is based on floating point values
        for temporal length.
        ISO 11404 syntax specifies the use of a positiveInteger together with appropriate values for
        radix and factor. The resolution of the time interval is to one radix ^(-factor) of the
        specified time unit.
        The value of the unit is either selected from the units for time intervals from ISO
        31-1:1992, or is another suitable unit. The encoding is defined for GML in gml:TimeUnitType.
        The second component of this union type provides a method for indicating time units other
        than the six standard units given in the enumeration.
      </documentation>
    </annotation>
  </element>
  <complexType name="TimeIntervalLengthType" final="#all">
    <simpleContent>
      <extension base="decimal">
        <attribute name="unit" type="gml:TimeUnitType" use="required"/>
        <attribute name="radix" type="positiveInteger"/>
        <attribute name="factor" type="integer"/>
      </extension>
    </simpleContent>
  </complexType>
  <simpleType name="TimeUnitType">
    <union>
      <simpleType>
        <restriction base="string">
          <enumeration value="year"/>
          <enumeration value="month"/>
          <enumeration value="day"/>
          <enumeration value="hour"/>
          <enumeration value="minute"/>
          <enumeration value="second"/>
        </restriction>
      </simpleType>
      <simpleType>
        <restriction base="string">
          <pattern value="other:\w{2,}"/>
        </restriction>
      </simpleType>
    </union>
  </simpleType>
</schema>
