Appendix B: The Feature Schema, V2.06 (Normative)

<?xml version="1.0" encoding="UTF-8"?>
<!-- File: feature.xsd  -->
<schema targetNamespace="http://www.opengis.net/gml"
        xmlns:gml="http://www.opengis.net/gml"
        xmlns="http://www.w3.org/2000/10/XMLSchema"
        elementFormDefault="qualified"
        version="2.06">

  <annotation>
    <appinfo>feature.xsd v2.06 2001-02</appinfo>
    <documentation xml:lang="en">
      GML Feature schema. Copyright (c) 2001 OGC, All Rights Reserved.
    </documentation>
  </annotation>

  <!-- include constructs from the GML Geometry schema -->
  <include schemaLocation="geometry.xsd"/>

  <!-- ==============================================================
       global declarations
  =============================================================== -->

  <element name="_Feature" type="gml:AbstractFeatureType" abstract=
    "true"/>
  <element name="_FeatureCollection" type=
    "gml:AbstractFeatureCollectionType"
    abstract="true" substitutionGroup="gml:_Feature"/>
  <element name="featureMember" type="gml:FeatureAssociationType"/>

  <!-- some basic geometric properties of features -->
  <element name="_geometryProperty" type="gml:GeometryPropertyType"
    abstract="true"/>
  <element name="geometryProperty" type="gml:GeometryPropertyType" />
  <element name="boundedBy" type="gml:BoundingShapeType"/>

  <element name="pointProperty" type="gml:PointPropertyType"
    substitutionGroup="gml:_geometryProperty"/>
  <element name="polygonProperty" type="gml:PolygonPropertyType"
    substitutionGroup="gml:_geometryProperty"/>
  <element name="lineStringProperty" type="gml:LineStringPropertyType"
    substitutionGroup="gml:_geometryProperty"/>
  <element name="multiPointProperty" type="gml:MultiPointPropertyType"
    substitutionGroup="gml:_geometryProperty"/>
  <element name="multiLineStringProperty" type=
    "gml:MultiLineStringPropertyType"
    substitutionGroup="gml:_geometryProperty"/>
  <element name="multiPolygonProperty" type=
    "gml:MultiPolygonPropertyType"
    substitutionGroup="gml:_geometryProperty"/>
  <element name="multiGeometryProperty" type=
    "gml:MultiGeometryPropertyType"
    substitutionGroup="gml:_geometryProperty"/>

  <!-- common aliases for geometry properties -->
  <element name="location" type="gml:PointPropertyType"
    substitutionGroup="gml:pointProperty"/>
  <element name="centerOf" type="gml:PointPropertyType"
    substitutionGroup="gml:pointProperty"/>
  <element name="position" type="gml:PointPropertyType"
    substitutionGroup="gml:pointProperty"/>
  <element name="extentOf" type="gml:PolygonPropertyType"
    substitutionGroup="gml:polygonProperty"/>
  <element name="coverage" type="gml:PolygonPropertyType"
    substitutionGroup="gml:polygonProperty"/>
  <element name="edgeOf" type="gml:LineStringPropertyType"
    substitutionGroup="gml:lineStringProperty"/>
  <element name="centerLineOf" type="gml:LineStringPropertyType"
    substitutionGroup="gml:lineStringProperty"/>
  <element name="multiLocation" type="gml:MultiPointPropertyType"
    substitutionGroup="gml:multiPointProperty"/>
  <element name="multiCenterOf" type="gml:MultiPointPropertyType"
    substitutionGroup="gml:multiPointProperty"/>
  <element name="multiPosition" type="gml:MultiPointPropertyType"
    substitutionGroup="gml:multiPointProperty"/>
  <element name="multiCenterLineOf" type=
    "gml:MultiLineStringPropertyType"
    substitutionGroup="gml:multiLineStringProperty"/>
  <element name="multiEdgeOf" type="gml:MultiLineStringPropertyType"
    substitutionGroup="gml:multiLineStringProperty"/>
  <element name="multiCoverage" type="gml:MultiPolygonPropertyType"
    substitutionGroup="gml:multiPolygonProperty"/>
  <element name="multiExtentOf" type="gml:MultiPolygonPropertyType"
    substitutionGroup="gml:multiPolygonProperty"/>

  <!-- common feature descriptors -->
  <element name="description" type="string"/>
  <element name="name" type="string"/>

  <!-- ==============================================================
       abstract supertypes
  =============================================================== -->

  <complexType name="AbstractFeatureType" abstract="true">
    <annotation>
      <documentation>
        An abstract feature provides a set of common properties. A
        concrete feature type must derive from this type and specify
        additional properties in an application schema. A feature may
        optionally possess an identifying attribute ('fid').
      </documentation>
    </annotation>
    <sequence>
      <element ref="gml:description" minOccurs="0"/>
      <element ref="gml:name" minOccurs="0"/>
      <element ref="gml:boundedBy" minOccurs="0"/>
      <!-- additional properties must be specified in an application
       schema -->
    </sequence>
    <attribute name="fid" type="ID" use="optional"/>
  </complexType>

  <complexType name="AbstractFeatureCollectionBaseType" abstract=
    "true">
    <annotation>
      <documentation>
        This abstract base type just makes the boundedBy element
        mandatory for a feature collection.
      </documentation>
    </annotation>
    <complexContent>
      <restriction base="gml:AbstractFeatureType">
        <sequence>
          <element ref="gml:description" minOccurs="0"/>
          <element ref="gml:name" minOccurs="0"/>
          <element ref="gml:boundedBy"/>
        </sequence>
        <attribute name="fid" type="ID" use="optional"/>
      </restriction>
    </complexContent>
  </complexType>

  <complexType name="AbstractFeatureCollectionType" abstract="true">
    <annotation>
      <documentation>
        A feature collection contains zero or more featureMember
        elements.
      </documentation>
    </annotation>
    <complexContent>
      <extension base="gml:AbstractFeatureCollectionBaseType">
        <sequence>
          <element ref="gml:featureMember" minOccurs="0" maxOccurs=
            "unbounded"/>
        </sequence>
      </extension>
    </complexContent>
  </complexType>

  <complexType name="GeometryPropertyType">
    <annotation>
      <documentation>
        A simple geometry property encapsulates a geometry element.
        Alternatively, it can function as a pointer (simple-type link)
        that refers to a remote geometry element.
      </documentation>
    </annotation>
    <sequence minOccurs="0">
      <element ref="gml:_Geometry"/>
    </sequence>
    <attributeGroup ref="gml:AssociationAttributeGroup"/>
  </complexType>

  <complexType name="FeatureAssociationType">
    <annotation>
      <documentation>
        An instance of this type (e.g. a featureMember) can either
        enclose or point to a feature (or feature collection); this
        type can be restricted in an application schema to allow only
        specified features as valid participants in the association.
        When serving as a simple link that references a remote feature
        instance, the value of the gml:remoteSchema attribute can be
        used to locate a schema fragment that constrains the target
        instance.
      </documentation>
    </annotation>
    <sequence minOccurs="0">
      <element ref="gml:_Feature"/>
    </sequence>
    <attributeGroup ref="gml:AssociationAttributeGroup"/>
  </complexType>

  <complexType name="BoundingShapeType">
    <annotation>
      <documentation>
        Bounding shapes--a Box or a null element are currently allowed.
      </documentation>
    </annotation>
    <sequence>
      <choice>
        <element ref="gml:Box"/>
        <element name="null" type="gml:NullType" />
      </choice>
    </sequence>
  </complexType>

  <!-- ==============================================================
       geometry properties
  =============================================================== -->

  <complexType name="PointPropertyType">
    <annotation>
      <documentation>
        Encapsulates a single point to represent position, location, or
        centerOf properties.
      </documentation>
    </annotation>
    <complexContent>
      <restriction base="gml:GeometryPropertyType">
        <sequence minOccurs="0">
          <element ref="gml:Point"/>
        </sequence>
        <attributeGroup ref="gml:AssociationAttributeGroup"/>
      </restriction>
    </complexContent>
  </complexType>

  <complexType name="PolygonPropertyType">
    <annotation>
      <documentation>
        Encapsulates a single polygon to represent coverage or extentOf
        properties.
      </documentation>
    </annotation>
    <complexContent>
      <restriction base="gml:GeometryPropertyType">
        <sequence minOccurs="0">
          <element ref="gml:Polygon"/>
        </sequence>
        <attributeGroup ref="gml:AssociationAttributeGroup"/>
      </restriction>
    </complexContent>
  </complexType>

  <complexType name="LineStringPropertyType">
    <annotation>
      <documentation>
        Encapsulates a single LineString to represent centerLineOf or
        edgeOf properties.
      </documentation>
    </annotation>
    <complexContent>
      <restriction base="gml:GeometryPropertyType">
        <sequence minOccurs="0">
          <element ref="gml:LineString"/>
        </sequence>
        <attributeGroup ref="gml:AssociationAttributeGroup"/>
      </restriction>
    </complexContent>
  </complexType>

  <complexType name="MultiPointPropertyType">
    <annotation>
      <documentation>
        Encapsulates a MultiPoint element to represent the following
        discontiguous geometric properties: multiLocation,
        multiPosition, multiCenterOf.
      </documentation>
    </annotation>
    <complexContent>
      <restriction base="gml:GeometryPropertyType">
        <sequence minOccurs="0">
          <element ref="gml:MultiPoint"/>
        </sequence>
        <attributeGroup ref="gml:AssociationAttributeGroup"/>
      </restriction>
    </complexContent>
  </complexType>

  <complexType name="MultiLineStringPropertyType">
    <annotation>
      <documentation>
        Encapsulates a MultiLineString element to represent the
        following discontiguous geometric properties: multiEdgeOf,
        multiCenterLineOf.
      </documentation>
    </annotation>
    <complexContent>
      <restriction base="gml:GeometryPropertyType">
        <sequence minOccurs="0">
          <element ref="gml:MultiLineString"/>
        </sequence>
        <attributeGroup ref="gml:AssociationAttributeGroup"/>
      </restriction>
    </complexContent>
  </complexType>

  <complexType name="MultiPolygonPropertyType">
    <annotation>
      <documentation>
        Encapsulates a MultiPolygon to represent the following
        discontiguous geometric properties: multiCoverage,
        multiExtentOf.
      </documentation>
    </annotation>
    <complexContent>
      <restriction base="gml:GeometryPropertyType">
        <sequence minOccurs="0">
          <element ref="gml:MultiPolygon"/>
        </sequence>
        <attributeGroup ref="gml:AssociationAttributeGroup"/>
      </restriction>
    </complexContent>
  </complexType>

  <complexType name="MultiGeometryPropertyType">
    <annotation>
      <documentation>Encapsulates a MultiGeometry element.
        </documentation>
    </annotation>
    <complexContent>
      <restriction base="gml:GeometryPropertyType">
        <sequence minOccurs="0">
          <element ref="gml:MultiGeometry"/>
        </sequence>
        <attributeGroup ref="gml:AssociationAttributeGroup"/>
      </restriction>
    </complexContent>
  </complexType>

  <simpleType name="NullType">
    <annotation>
      <documentation>
        If a bounding shape is not provided for a feature collection,
        explain why. Allowable values are:
        innapplicable - the features do not have geometry
        unknown - the boundingBox cannot be computed
        unavailable - there may be a boundingBox but it is not divulged
        missing - there are no features
      </documentation>
    </annotation>
    <restriction base="string">
      <enumeration value="inapplicable"/>
      <enumeration value="unknown"/>
      <enumeration value="unavailable"/>
      <enumeration value="missing"/>
    </restriction>
  </simpleType>
</schema>