<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:gml="http://www.opengis.net/gml"
        targetNamespace="http://www.opengis.net/gml"
        version="3.1.1" elementFormDefault="qualified">

  <annotation>
    <documentation>
            Copyright (c) 2007,2009 Open Geospatial Consortium.
            To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
    </documentation>
  </annotation>
    
  <include schemaLocation="geometryBasic2d.xsd"/>

  <element name="Curve" type="gml:CurveType"
           substitutionGroup="gml:_Curve"/>
  <complexType name="CurveType">
    <complexContent>
      <extension base="gml:AbstractCurveType">
        <sequence>
          <element ref="gml:segments"/>
        </sequence>
      </extension>
    </complexContent>
  </complexType>

  <element name="_CurveSegment"
           type="gml:AbstractCurveSegmentType" abstract="true"/>
  <complexType name="AbstractCurveSegmentType" abstract="true">
    <sequence/>
    <attribute name="numDerivativesAtStart" type="integer"
               use="optional" default="0"/>
    <attribute name="numDerivativesAtEnd" type="integer"
 use="optional" default="0"/>
    <attribute name="numDerivativeInterior" type="integer"
 use="optional" default="0"/>
  </complexType>

  <element name="segments" type="gml:CurveSegmentArrayPropertyType"/>
  <complexType name="CurveSegmentArrayPropertyType">
    <sequence>
      <element ref="gml:_CurveSegment"
               minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
  </complexType>

  <element name="LineStringSegment" type="gml:LineStringSegmentType"
           substitutionGroup="gml:_CurveSegment"/>
  <complexType name="LineStringSegmentType">
    <complexContent>
      <extension base="gml:AbstractCurveSegmentType">
        <sequence>
          <choice>
            <choice minOccurs="2" maxOccurs="unbounded">
              <element ref="gml:pos"/>
              <element ref="gml:pointProperty"/>
            </choice>
            <element ref="gml:posList"/>
          </choice>
        </sequence>
        <attribute name="interpolation"
                   type="gml:CurveInterpolationType" fixed="linear"/>
      </extension>
    </complexContent>
  </complexType>

  <element name="ArcByCenterPoint" type="gml:ArcByCenterPointType"
           substitutionGroup="gml:_CurveSegment"/>
  <complexType name="ArcByCenterPointType">
    <complexContent>
      <extension base="gml:AbstractCurveSegmentType">
        <sequence>
          <choice>
            <element ref="gml:pos"/>
            <element ref="gml:pointProperty"/>
          </choice>
          <element name="radius" type="gml:LengthType"/>
          <element name="startAngle" type="gml:AngleType"
                   minOccurs="0"/>
          <element name="endAngle" type="gml:AngleType"
                   minOccurs="0"/>
        </sequence>
        <attribute name="interpolation"
                   type="gml:CurveInterpolationType"
                   fixed="circularArcCenterPointWithRadius"/>
        <attribute name="numArc" type="integer"
                   use="required" fixed="1"/>
      </extension>
    </complexContent>
  </complexType>

  <element name="CircleByCenterPoint"
           type="gml:CircleByCenterPointType"
           substitutionGroup="gml:ArcByCenterPoint"/>
  <complexType name="CircleByCenterPointType">
    <complexContent>
      <extension base="gml:ArcByCenterPointType"/>
    </complexContent>
  </complexType>

  <element name="Surface" type="gml:SurfaceType"
           substitutionGroup="gml:_Surface"/>
  <complexType name="SurfaceType">
    <complexContent>
      <extension base="gml:AbstractSurfaceType">
        <sequence>
          <element ref="gml:patches"/>
        </sequence>
      </extension>
    </complexContent>
  </complexType>

  <element name="_SurfacePatch" type="gml:AbstractSurfacePatchType"
           abstract="true"/>
  <complexType name="AbstractSurfacePatchType" abstract="true">
    <sequence/>
  </complexType>

  <element name="patches" type="gml:SurfacePatchArrayPropertyType"/>
  <complexType name="SurfacePatchArrayPropertyType">
    <sequence minOccurs="0" maxOccurs="unbounded">
      <element ref="gml:_SurfacePatch"/>
    </sequence>
  </complexType>

  <element name="PolygonPatch" type="gml:PolygonPatchType"
           substitutionGroup="gml:_SurfacePatch"/>
  <complexType name="PolygonPatchType">
    <complexContent>
      <extension base="gml:AbstractSurfacePatchType">
        <sequence>
          <element ref="gml:exterior" minOccurs="0"/>
        </sequence>
        <attribute name="interpolation"
                   type="gml:SurfaceInterpolationType"
                   fixed="planar"/>
      </extension>
    </complexContent>
  </complexType>

  <element name="Rectangle" type="gml:RectangleType"
           substitutionGroup="gml:_SurfacePatch"/>
  <complexType name="RectangleType">
    <complexContent>
      <extension base="gml:AbstractSurfacePatchType">
        <sequence>
          <element ref="gml:exterior"/>
        </sequence>
        <attribute name="interpolation"
                   type="gml:SurfaceInterpolationType"
                   fixed="planar"/>
      </extension>
    </complexContent>
  </complexType>

  <element name="PolyhedralSurface" type="gml:PolyhedralSurfaceType"
           substitutionGroup="gml:Surface"/>
  <complexType name="PolyhedralSurfaceType">
    <complexContent>
      <restriction base="gml:SurfaceType">
        <sequence>
          <element ref="gml:polygonPatches"/>
        </sequence>
      </restriction>
    </complexContent>
  </complexType>

  <element name="polygonPatches"
           type="gml:PolygonPatchArrayPropertyType"
           substitutionGroup="gml:patches"/>
  <complexType name="PolygonPatchArrayPropertyType">
    <complexContent>
      <restriction base="gml:SurfacePatchArrayPropertyType">
        <sequence minOccurs="0" maxOccurs="unbounded">
          <element ref="gml:PolygonPatch"/>
        </sequence>
      </restriction>
    </complexContent>
  </complexType>

  <element name="_Solid" type="gml:AbstractSolidType" abstract="true"
           substitutionGroup="gml:_GeometricPrimitive"/>
  <complexType name="AbstractSolidType">
    <complexContent>
      <extension base="gml:AbstractGeometricPrimitiveType"/>
    </complexContent>
  </complexType>

  <element name="Solid" type="gml:SolidType"
           substitutionGroup="gml:_Solid"/>
  <complexType name="SolidType">
    <complexContent>
      <extension base="gml:AbstractSolidType">
        <sequence>
          <element name="exterior" type="gml:SurfacePropertyType"
                   minOccurs="0"/>
        </sequence>
      </extension>
    </complexContent>
  </complexType>

  <simpleType name="CurveInterpolationType">
    <restriction base="string">
      <enumeration value="linear"/>
      <enumeration value="geodesic"/>
      <enumeration value="circularArc3Points"/>
      <enumeration value="circularArcCenterPointWithRadius"/>
    </restriction>
  </simpleType>

  <simpleType name="SurfaceInterpolationType">
    <restriction base="string">
      <enumeration value="planar"/>
    </restriction>
  </simpleType>

</schema>