<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:xlink="http://www.w3.org/1999/xlink" targetNamespace="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.2.0" finalDefault="" blockDefault="" attributeFormDefault="unqualified">
    <annotation>
        <appinfo source="urn:opengis:specification:gml:schema-xsd:geometryPrimitives:v3.2.0">geometryPrimitives.xsd</appinfo>
        <documentation>see GML Clause 10</documentation>
    </annotation>
    <include schemaLocation="geometryBasic2d.xsd"/>
    <complexType name="CurveType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractCurveType">
                <sequence minOccurs="1" maxOccurs="1">
                    <element ref="gml:segments" minOccurs="1" maxOccurs="1" nillable="false"/>
                </sequence>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="Curve" type="gml:CurveType" substitutionGroup="gml:AbstractCurve" nillable="false" abstract="false"/>
    <complexType name="OrientableCurveType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractCurveType">
                <sequence minOccurs="1" maxOccurs="1">
                    <element ref="gml:baseCurve" minOccurs="1" maxOccurs="1" nillable="false"/>
                </sequence>
                <attribute name="orientation" type="gml:SignType" default="+" use="optional"/>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="baseCurve" type="gml:CurvePropertyType" nillable="false" abstract="false"/>
    <element name="OrientableCurve" type="gml:OrientableCurveType" substitutionGroup="gml:AbstractCurve" nillable="false" abstract="false"/>
    <complexType name="AbstractCurveSegmentType" abstract="true" mixed="false">
        <attribute name="numDerivativesAtStart" type="integer" default="0" use="optional"/>
        <attribute name="numDerivativesAtEnd" type="integer" default="0" use="optional"/>
        <attribute name="numDerivativeInterior" type="integer" default="0" use="optional"/>
    </complexType>
    <element name="AbstractCurveSegment" type="gml:AbstractCurveSegmentType" abstract="true" substitutionGroup="gml:AbstractObject" nillable="false"/>
    <complexType name="CurveSegmentArrayPropertyType" mixed="false" abstract="false">
        <sequence minOccurs="0" maxOccurs="unbounded">
            <element ref="gml:AbstractCurveSegment" minOccurs="1" maxOccurs="1" nillable="false"/>
        </sequence>
    </complexType>
    <element name="segments" type="gml:CurveSegmentArrayPropertyType" nillable="false" abstract="false"/>
    <simpleType name="CurveInterpolationType">
        <restriction base="string">
            <enumeration value="linear"/>
            <enumeration value="geodesic"/>
            <enumeration value="circularArc3Points"/>
            <enumeration value="circularArc2PointWithBulge"/>
            <enumeration value="circularArcCenterPointWithRadius"/>
            <enumeration value="elliptical"/>
            <enumeration value="clothoid"/>
            <enumeration value="conic"/>
            <enumeration value="polynomialSpline"/>
            <enumeration value="cubicSpline"/>
            <enumeration value="rationalSpline"/>
        </restriction>
    </simpleType>
    <complexType name="LineStringSegmentType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractCurveSegmentType">
                <sequence minOccurs="1" maxOccurs="1">
                    <choice minOccurs="1" maxOccurs="1">
                        <choice minOccurs="2" maxOccurs="unbounded">
                            <element ref="gml:pos" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <element ref="gml:pointProperty" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <element ref="gml:pointRep" minOccurs="1" maxOccurs="1" nillable="false"/>
                        </choice>
                        <element ref="gml:posList" minOccurs="1" maxOccurs="1" nillable="false"/>
                        <element ref="gml:coordinates" minOccurs="1" maxOccurs="1" nillable="false"/>
                    </choice>
                </sequence>
                <attribute name="interpolation" type="gml:CurveInterpolationType" fixed="linear" use="optional"/>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="LineStringSegment" type="gml:LineStringSegmentType" substitutionGroup="gml:AbstractCurveSegment" nillable="false" abstract="false"/>
    <complexType name="ArcStringType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractCurveSegmentType">
                <sequence minOccurs="1" maxOccurs="1">
                    <choice minOccurs="1" maxOccurs="1">
                        <choice minOccurs="3" maxOccurs="unbounded">
                            <element ref="gml:pos" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <element ref="gml:pointProperty" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <element ref="gml:pointRep" minOccurs="1" maxOccurs="1" nillable="false"/>
                        </choice>
                        <element ref="gml:posList" minOccurs="1" maxOccurs="1" nillable="false"/>
                        <element ref="gml:coordinates" minOccurs="1" maxOccurs="1" nillable="false"/>
                    </choice>
                </sequence>
                <attribute name="interpolation" type="gml:CurveInterpolationType" fixed="circularArc3Points" use="optional"/>
                <attribute name="numArc" type="integer" use="optional"/>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="ArcString" type="gml:ArcStringType" substitutionGroup="gml:AbstractCurveSegment" nillable="false" abstract="false"/>
    <complexType name="ArcType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <restriction base="gml:ArcStringType">
                <sequence minOccurs="1" maxOccurs="1">
                    <choice minOccurs="1" maxOccurs="1">
                        <choice minOccurs="3" maxOccurs="3">
                            <element ref="gml:pos" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <element ref="gml:pointProperty" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <element ref="gml:pointRep" minOccurs="1" maxOccurs="1" nillable="false"/>
                        </choice>
                        <element ref="gml:posList" minOccurs="1" maxOccurs="1" nillable="false"/>
                        <element ref="gml:coordinates" minOccurs="1" maxOccurs="1" nillable="false"/>
                    </choice>
                </sequence>
                <attribute name="numArc" type="integer" fixed="1" use="optional"/>
            </restriction>
        </xsd:complexContent>
    </complexType>
    <element name="Arc" type="gml:ArcType" substitutionGroup="gml:ArcString" nillable="false" abstract="false"/>
    <complexType name="CircleType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:ArcType"/>
        </xsd:complexContent>
    </complexType>
    <element name="Circle" type="gml:CircleType" substitutionGroup="gml:Arc" nillable="false" abstract="false"/>
    <complexType name="ArcStringByBulgeType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractCurveSegmentType">
                <sequence minOccurs="1" maxOccurs="1">
                    <choice minOccurs="1" maxOccurs="1">
                        <choice minOccurs="2" maxOccurs="unbounded">
                            <element ref="gml:pos" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <element ref="gml:pointProperty" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <element ref="gml:pointRep" minOccurs="1" maxOccurs="1" nillable="false"/>
                        </choice>
                        <element ref="gml:posList" minOccurs="1" maxOccurs="1" nillable="false"/>
                        <element ref="gml:coordinates" minOccurs="1" maxOccurs="1" nillable="false"/>
                    </choice>
                    <element name="bulge" type="double" maxOccurs="unbounded" minOccurs="1" nillable="false"/>
                    <element name="normal" type="gml:VectorType" maxOccurs="unbounded" minOccurs="1" nillable="false"/>
                </sequence>
                <attribute name="interpolation" type="gml:CurveInterpolationType" fixed="circularArc2PointWithBulge" use="optional"/>
                <attribute name="numArc" type="integer" use="optional"/>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="ArcStringByBulge" type="gml:ArcStringByBulgeType" substitutionGroup="gml:AbstractCurveSegment" nillable="false" abstract="false"/>
    <complexType name="ArcByBulgeType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <restriction base="gml:ArcStringByBulgeType">
                <sequence minOccurs="1" maxOccurs="1">
                    <choice minOccurs="1" maxOccurs="1">
                        <choice minOccurs="2" maxOccurs="2">
                            <element ref="gml:pos" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <element ref="gml:pointProperty" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <element ref="gml:pointRep" minOccurs="1" maxOccurs="1" nillable="false"/>
                        </choice>
                        <element ref="gml:posList" minOccurs="1" maxOccurs="1" nillable="false"/>
                        <element ref="gml:coordinates" minOccurs="1" maxOccurs="1" nillable="false"/>
                    </choice>
                    <element name="bulge" type="double" minOccurs="1" maxOccurs="1" nillable="false"/>
                    <element name="normal" type="gml:VectorType" minOccurs="1" maxOccurs="1" nillable="false"/>
                </sequence>
                <attribute name="numArc" type="integer" fixed="1" use="optional"/>
            </restriction>
        </xsd:complexContent>
    </complexType>
    <element name="ArcByBulge" type="gml:ArcByBulgeType" substitutionGroup="gml:ArcStringByBulge" nillable="false" abstract="false"/>
    <complexType name="ArcByCenterPointType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractCurveSegmentType">
                <sequence minOccurs="1" maxOccurs="1">
                    <choice minOccurs="1" maxOccurs="1">
                        <choice minOccurs="1" maxOccurs="1">
                            <element ref="gml:pos" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <element ref="gml:pointProperty" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <element ref="gml:pointRep" minOccurs="1" maxOccurs="1" nillable="false"/>
                        </choice>
                        <element ref="gml:posList" minOccurs="1" maxOccurs="1" nillable="false"/>
                        <element ref="gml:coordinates" minOccurs="1" maxOccurs="1" nillable="false"/>
                    </choice>
                    <element name="radius" type="gml:LengthType" minOccurs="1" maxOccurs="1" nillable="false"/>
                    <element name="startAngle" type="gml:AngleType" minOccurs="0" maxOccurs="1" nillable="false"/>
                    <element name="endAngle" type="gml:AngleType" minOccurs="0" maxOccurs="1" nillable="false"/>
                </sequence>
                <attribute name="interpolation" type="gml:CurveInterpolationType" fixed="circularArcCenterPointWithRadius" use="optional"/>
                <attribute name="numArc" type="integer" use="required" fixed="1"/>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="ArcByCenterPoint" type="gml:ArcByCenterPointType" substitutionGroup="gml:AbstractCurveSegment" nillable="false" abstract="false"/>
    <complexType name="CircleByCenterPointType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <restriction base="gml:ArcByCenterPointType">
                <sequence minOccurs="1" maxOccurs="1">
                    <choice minOccurs="1" maxOccurs="1">
                        <choice minOccurs="1" maxOccurs="1">
                            <element ref="gml:pos" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <element ref="gml:pointProperty" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <element ref="gml:pointRep" minOccurs="1" maxOccurs="1" nillable="false"/>
                        </choice>
                        <element ref="gml:posList" minOccurs="1" maxOccurs="1" nillable="false"/>
                        <element ref="gml:coordinates" minOccurs="1" maxOccurs="1" nillable="false"/>
                    </choice>
                    <element name="radius" type="gml:LengthType" minOccurs="1" maxOccurs="1" nillable="false"/>
                </sequence>
            </restriction>
        </xsd:complexContent>
    </complexType>
    <element name="CircleByCenterPoint" type="gml:CircleByCenterPointType" substitutionGroup="gml:ArcByCenterPoint" nillable="false" abstract="false"/>
    <complexType name="CubicSplineType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractCurveSegmentType">
                <sequence minOccurs="1" maxOccurs="1">
                    <choice minOccurs="1" maxOccurs="1">
                        <choice minOccurs="2" maxOccurs="unbounded">
                            <element ref="gml:pos" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <element ref="gml:pointProperty" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <element ref="gml:pointRep" minOccurs="1" maxOccurs="1" nillable="false"/>
                        </choice>
                        <element ref="gml:posList" minOccurs="1" maxOccurs="1" nillable="false"/>
                        <element ref="gml:coordinates" minOccurs="1" maxOccurs="1" nillable="false"/>
                    </choice>
                    <element name="vectorAtStart" type="gml:VectorType" minOccurs="1" maxOccurs="1" nillable="false"/>
                    <element name="vectorAtEnd" type="gml:VectorType" minOccurs="1" maxOccurs="1" nillable="false"/>
                </sequence>
                <attribute name="interpolation" type="gml:CurveInterpolationType" fixed="cubicSpline" use="optional"/>
                <attribute name="degree" type="integer" fixed="3" use="optional"/>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="CubicSpline" type="gml:CubicSplineType" substitutionGroup="gml:AbstractCurveSegment" nillable="false" abstract="false"/>
    <complexType name="BSplineType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractCurveSegmentType">
                <sequence minOccurs="1" maxOccurs="1">
                    <choice minOccurs="1" maxOccurs="1">
                        <choice minOccurs="0" maxOccurs="unbounded">
                            <element ref="gml:pos" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <element ref="gml:pointProperty" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <element ref="gml:pointRep" minOccurs="1" maxOccurs="1" nillable="false"/>
                        </choice>
                        <element ref="gml:posList" minOccurs="1" maxOccurs="1" nillable="false"/>
                        <element ref="gml:coordinates" minOccurs="1" maxOccurs="1" nillable="false"/>
                    </choice>
                    <element name="degree" type="nonNegativeInteger" minOccurs="1" maxOccurs="1" nillable="false"/>
                    <element name="knot" type="gml:KnotPropertyType" minOccurs="2" maxOccurs="unbounded" nillable="false"/>
                </sequence>
                <attribute name="interpolation" type="gml:CurveInterpolationType" default="polynomialSpline" use="optional"/>
                <attribute name="isPolynomial" type="boolean" use="optional"/>
                <attribute name="knotType" type="gml:KnotTypesType" use="optional"/>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="BSpline" type="gml:BSplineType" substitutionGroup="gml:AbstractCurveSegment" nillable="false" abstract="false"/>
    <complexType name="KnotType" mixed="false" abstract="false">
        <sequence minOccurs="1" maxOccurs="1">
            <element name="value" type="double" minOccurs="1" maxOccurs="1" nillable="false"/>
            <element name="multiplicity" type="nonNegativeInteger" minOccurs="1" maxOccurs="1" nillable="false"/>
            <element name="weight" type="double" minOccurs="1" maxOccurs="1" nillable="false"/>
        </sequence>
    </complexType>
    <complexType name="KnotPropertyType" mixed="false" abstract="false">
        <sequence minOccurs="1" maxOccurs="1">
            <element name="Knot" type="gml:KnotType" minOccurs="1" maxOccurs="1" nillable="false"/>
        </sequence>
    </complexType>
    <simpleType name="KnotTypesType">
        <restriction base="string">
            <enumeration value="uniform"/>
            <enumeration value="quasiUniform"/>
            <enumeration value="piecewiseBezier"/>
        </restriction>
    </simpleType>
    <complexType name="BezierType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <restriction base="gml:BSplineType">
                <sequence minOccurs="1" maxOccurs="1">
                    <choice minOccurs="1" maxOccurs="1">
                        <choice minOccurs="0" maxOccurs="unbounded">
                            <element ref="gml:pos" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <element ref="gml:pointProperty" minOccurs="1" maxOccurs="1" nillable="false"/>
                            <element ref="gml:pointRep" minOccurs="1" maxOccurs="1" nillable="false"/>
                        </choice>
                        <element ref="gml:posList" minOccurs="1" maxOccurs="1" nillable="false"/>
                        <element ref="gml:coordinates" minOccurs="1" maxOccurs="1" nillable="false"/>
                    </choice>
                    <element name="degree" type="nonNegativeInteger" minOccurs="1" maxOccurs="1" nillable="false"/>
                    <element name="knot" type="gml:KnotPropertyType" minOccurs="2" maxOccurs="2" nillable="false"/>
                </sequence>
                <attribute name="interpolation" type="gml:CurveInterpolationType" fixed="polynomialSpline" use="optional"/>
                <attribute name="isPolynomial" type="boolean" fixed="true" use="optional"/>
                <attribute name="knotType" type="gml:KnotTypesType" use="prohibited"/>
            </restriction>
        </xsd:complexContent>
    </complexType>
    <element name="Bezier" type="gml:BezierType" substitutionGroup="gml:BSpline" nillable="false" abstract="false"/>
    <complexType name="OffsetCurveType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractCurveSegmentType">
                <sequence minOccurs="1" maxOccurs="1">
                    <element name="offsetBase" type="gml:CurvePropertyType" minOccurs="1" maxOccurs="1" nillable="false"/>
                    <element name="distance" type="gml:LengthType" minOccurs="1" maxOccurs="1" nillable="false"/>
                    <element name="refDirection" type="gml:VectorType" minOccurs="0" maxOccurs="1" nillable="false"/>
                </sequence>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="OffsetCurve" type="gml:OffsetCurveType" substitutionGroup="gml:AbstractCurveSegment" nillable="false" abstract="false"/>
    <complexType name="AffinePlacementType" mixed="false" abstract="false">
        <sequence minOccurs="1" maxOccurs="1">
            <element name="location" type="gml:DirectPositionType" minOccurs="1" maxOccurs="1" nillable="false"/>
            <element name="refDirection" type="gml:VectorType" maxOccurs="unbounded" minOccurs="1" nillable="false"/>
            <element name="inDimension" type="positiveInteger" minOccurs="1" maxOccurs="1" nillable="false"/>
            <element name="outDimension" type="positiveInteger" minOccurs="1" maxOccurs="1" nillable="false"/>
        </sequence>
    </complexType>
    <element name="AffinePlacement" type="gml:AffinePlacementType" substitutionGroup="gml:AbstractObject" nillable="false" abstract="false"/>
    <complexType name="ClothoidType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractCurveSegmentType">
                <sequence minOccurs="1" maxOccurs="1">
                    <element name="refLocation" minOccurs="1" maxOccurs="1" nillable="false">
                        <complexType mixed="false">
                            <sequence minOccurs="1" maxOccurs="1">
                                <element ref="gml:AffinePlacement" minOccurs="1" maxOccurs="1" nillable="false"/>
                            </sequence>
                        </complexType>
                    </element>
                    <element name="scaleFactor" type="decimal" minOccurs="1" maxOccurs="1" nillable="false"/>
                    <element name="startParameter" type="double" minOccurs="1" maxOccurs="1" nillable="false"/>
                    <element name="endParameter" type="double" minOccurs="1" maxOccurs="1" nillable="false"/>
                </sequence>
                <attribute name="interpolation" type="gml:CurveInterpolationType" fixed="clothoid" use="optional"/>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="Clothoid" type="gml:ClothoidType" substitutionGroup="gml:AbstractCurveSegment" nillable="false" abstract="false"/>
    <complexType name="GeodesicStringType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractCurveSegmentType">
                <choice minOccurs="1" maxOccurs="1">
                    <element ref="gml:posList" minOccurs="1" maxOccurs="1" nillable="false"/>
                    <group ref="gml:geometricPositionGroup" minOccurs="2" maxOccurs="unbounded"/>
                </choice>
                <attribute name="interpolation" type="gml:CurveInterpolationType" fixed="geodesic" use="optional"/>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="GeodesicString" type="gml:GeodesicStringType" substitutionGroup="gml:AbstractCurveSegment" nillable="false" abstract="false"/>
    <complexType name="GeodesicType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:GeodesicStringType"/>
        </xsd:complexContent>
    </complexType>
    <element name="Geodesic" type="gml:GeodesicType" substitutionGroup="gml:GeodesicString" nillable="false" abstract="false"/>
    <complexType name="SurfaceType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractSurfaceType">
                <sequence minOccurs="1" maxOccurs="1">
                    <element ref="gml:patches" minOccurs="1" maxOccurs="1" nillable="false"/>
                </sequence>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="Surface" type="gml:SurfaceType" substitutionGroup="gml:AbstractSurface" nillable="false" abstract="false"/>
    <complexType name="OrientableSurfaceType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractSurfaceType">
                <sequence minOccurs="1" maxOccurs="1">
                    <element ref="gml:baseSurface" minOccurs="1" maxOccurs="1" nillable="false"/>
                </sequence>
                <attribute name="orientation" type="gml:SignType" default="+" use="optional"/>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="baseSurface" type="gml:SurfacePropertyType" nillable="false" abstract="false"/>
    <element name="OrientableSurface" type="gml:OrientableSurfaceType" substitutionGroup="gml:AbstractSurface" nillable="false" abstract="false"/>
    <complexType name="AbstractSurfacePatchType" abstract="true" mixed="false"/>
    <element name="AbstractSurfacePatch" type="gml:AbstractSurfacePatchType" abstract="true" nillable="false"/>
    <complexType name="SurfacePatchArrayPropertyType" mixed="false" abstract="false">
        <sequence minOccurs="0" maxOccurs="unbounded">
            <element ref="gml:AbstractSurfacePatch" minOccurs="1" maxOccurs="1" nillable="false"/>
        </sequence>
    </complexType>
    <element name="patches" type="gml:SurfacePatchArrayPropertyType" nillable="false" abstract="false"/>
    <simpleType name="SurfaceInterpolationType">
        <restriction base="string">
            <enumeration value="none"/>
            <enumeration value="planar"/>
            <enumeration value="spherical"/>
            <enumeration value="elliptical"/>
            <enumeration value="conic"/>
            <enumeration value="tin"/>
            <enumeration value="parametricCurve"/>
            <enumeration value="polynomialSpline"/>
            <enumeration value="rationalSpline"/>
            <enumeration value="triangulatedSpline"/>
        </restriction>
    </simpleType>
    <complexType name="PolygonPatchType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractSurfacePatchType">
                <sequence minOccurs="1" maxOccurs="1">
                    <element ref="gml:exterior" minOccurs="0" maxOccurs="1" nillable="false"/>
                    <element ref="gml:interior" minOccurs="0" maxOccurs="unbounded" nillable="false"/>
                </sequence>
                <attribute name="interpolation" type="gml:SurfaceInterpolationType" fixed="planar" use="optional"/>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="PolygonPatch" type="gml:PolygonPatchType" substitutionGroup="gml:AbstractSurfacePatch" nillable="false" abstract="false"/>
    <complexType name="TriangleType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractSurfacePatchType">
                <sequence minOccurs="1" maxOccurs="1">
                    <element ref="gml:exterior" minOccurs="1" maxOccurs="1" nillable="false"/>
                </sequence>
                <attribute name="interpolation" type="gml:SurfaceInterpolationType" fixed="planar" use="optional"/>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="Triangle" type="gml:TriangleType" substitutionGroup="gml:AbstractSurfacePatch" nillable="false" abstract="false"/>
    <complexType name="RectangleType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractSurfacePatchType">
                <sequence minOccurs="1" maxOccurs="1">
                    <element ref="gml:exterior" minOccurs="1" maxOccurs="1" nillable="false"/>
                </sequence>
                <attribute name="interpolation" type="gml:SurfaceInterpolationType" fixed="planar" use="optional"/>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="Rectangle" type="gml:RectangleType" substitutionGroup="gml:AbstractSurfacePatch" nillable="false" abstract="false"/>
    <complexType name="RingType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractRingType">
                <sequence minOccurs="1" maxOccurs="1">
                    <element ref="gml:curveMember" maxOccurs="unbounded" minOccurs="1" nillable="false"/>
                </sequence>
                <attributeGroup ref="gml:AggregationAttributeGroup"/>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="Ring" type="gml:RingType" substitutionGroup="gml:AbstractRing" nillable="false" abstract="false"/>
    <element name="curveMember" type="gml:CurvePropertyType" nillable="false" abstract="false"/>
    <complexType name="RingPropertyType" mixed="false" abstract="false">
        <sequence minOccurs="1" maxOccurs="1">
            <element ref="gml:Ring" minOccurs="1" maxOccurs="1" nillable="false"/>
        </sequence>
    </complexType>
    <group name="PointGrid">
        <sequence>
            <element name="rows" minOccurs="1" maxOccurs="1" nillable="false">
                <complexType mixed="false">
                    <sequence minOccurs="1" maxOccurs="1">
                        <element name="Row" maxOccurs="unbounded" minOccurs="1" nillable="false">
                            <complexType mixed="false">
                                <group ref="gml:geometricPositionListGroup" minOccurs="1" maxOccurs="1"/>
                            </complexType>
                        </element>
                    </sequence>
                </complexType>
            </element>
        </sequence>
    </group>
    <complexType name="AbstractParametricCurveSurfaceType" abstract="true" mixed="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractSurfacePatchType">
                <attributeGroup ref="gml:AggregationAttributeGroup"/>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="AbstractParametricCurveSurface" type="gml:AbstractParametricCurveSurfaceType" abstract="true" substitutionGroup="gml:AbstractSurfacePatch" nillable="false"/>
    <complexType name="AbstractGriddedSurfaceType" abstract="true" mixed="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractParametricCurveSurfaceType">
                <sequence minOccurs="1" maxOccurs="1">
                    <group ref="gml:PointGrid" minOccurs="1" maxOccurs="1"/>
                </sequence>
                <attribute name="rows" type="integer" use="optional"/>
                <attribute name="columns" type="integer" use="optional"/>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="AbstractGriddedSurface" type="gml:AbstractGriddedSurfaceType" abstract="true" substitutionGroup="gml:AbstractParametricCurveSurface" nillable="false"/>
    <complexType name="ConeType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractGriddedSurfaceType">
                <attribute name="horizontalCurveType" type="gml:CurveInterpolationType" fixed="circularArc3Points" use="optional"/>
                <attribute name="verticalCurveType" type="gml:CurveInterpolationType" fixed="linear" use="optional"/>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="Cone" type="gml:ConeType" substitutionGroup="gml:AbstractGriddedSurface" nillable="false" abstract="false"/>
    <complexType name="CylinderType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractGriddedSurfaceType">
                <attribute name="horizontalCurveType" type="gml:CurveInterpolationType" fixed="circularArc3Points" use="optional"/>
                <attribute name="verticalCurveType" type="gml:CurveInterpolationType" fixed="linear" use="optional"/>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="Cylinder" type="gml:CylinderType" substitutionGroup="gml:AbstractGriddedSurface" nillable="false" abstract="false"/>
    <complexType name="SphereType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractGriddedSurfaceType">
                <attribute name="horizontalCurveType" type="gml:CurveInterpolationType" fixed="circularArc3Points" use="optional"/>
                <attribute name="verticalCurveType" type="gml:CurveInterpolationType" fixed="circularArc3Points" use="optional"/>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="Sphere" type="gml:SphereType" substitutionGroup="gml:AbstractGriddedSurface" nillable="false" abstract="false"/>
    <complexType name="PolyhedralSurfaceType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <restriction base="gml:SurfaceType">
                <sequence minOccurs="1" maxOccurs="1">
                    <group ref="gml:StandardObjectProperties" minOccurs="1" maxOccurs="1"/>
                    <element ref="gml:polygonPatches" minOccurs="1" maxOccurs="1" nillable="false"/>
                </sequence>
            </restriction>
        </xsd:complexContent>
    </complexType>
    <element name="polygonPatches" type="gml:PolygonPatchArrayPropertyType" substitutionGroup="gml:patches" nillable="false" abstract="false"/>
    <element name="PolyhedralSurface" type="gml:PolyhedralSurfaceType" substitutionGroup="gml:Surface" nillable="false" abstract="false"/>
    <complexType name="PolygonPatchArrayPropertyType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <restriction base="gml:SurfacePatchArrayPropertyType">
                <sequence minOccurs="0" maxOccurs="unbounded">
                    <element ref="gml:PolygonPatch" minOccurs="1" maxOccurs="1" nillable="false"/>
                </sequence>
            </restriction>
        </xsd:complexContent>
    </complexType>
    <complexType name="TriangulatedSurfaceType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <restriction base="gml:SurfaceType">
                <sequence minOccurs="1" maxOccurs="1">
                    <group ref="gml:StandardObjectProperties" minOccurs="1" maxOccurs="1"/>
                    <element ref="gml:trianglePatches" minOccurs="1" maxOccurs="1" nillable="false"/>
                </sequence>
            </restriction>
        </xsd:complexContent>
    </complexType>
    <element name="trianglePatches" type="gml:TrianglePatchArrayPropertyType" substitutionGroup="gml:patches" nillable="false" abstract="false"/>
    <element name="TriangulatedSurface" type="gml:TriangulatedSurfaceType" substitutionGroup="gml:Surface" nillable="false" abstract="false"/>
    <complexType name="TrianglePatchArrayPropertyType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <restriction base="gml:SurfacePatchArrayPropertyType">
                <sequence minOccurs="0" maxOccurs="unbounded">
                    <element ref="gml:Triangle" minOccurs="1" maxOccurs="1" nillable="false"/>
                </sequence>
            </restriction>
        </xsd:complexContent>
    </complexType>
    <complexType name="TinType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:TriangulatedSurfaceType">
                <sequence minOccurs="1" maxOccurs="1">
                    <element name="stopLines" type="gml:LineStringSegmentArrayPropertyType" minOccurs="0" maxOccurs="unbounded" nillable="false"/>
                    <element name="breakLines" type="gml:LineStringSegmentArrayPropertyType" minOccurs="0" maxOccurs="unbounded" nillable="false"/>
                    <element name="maxLength" type="gml:LengthType" minOccurs="1" maxOccurs="1" nillable="false"/>
                    <element name="controlPoint" minOccurs="1" maxOccurs="1" nillable="false">
                        <complexType mixed="false">
                            <choice minOccurs="1" maxOccurs="1">
                                <element ref="gml:posList" minOccurs="1" maxOccurs="1" nillable="false"/>
                                <group ref="gml:geometricPositionGroup" minOccurs="3" maxOccurs="unbounded"/>
                            </choice>
                        </complexType>
                    </element>
                </sequence>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="Tin" type="gml:TinType" substitutionGroup="gml:TriangulatedSurface" nillable="false" abstract="false"/>
    <complexType name="LineStringSegmentArrayPropertyType" mixed="false" abstract="false">
        <sequence minOccurs="0" maxOccurs="unbounded">
            <element ref="gml:LineStringSegment" minOccurs="1" maxOccurs="1" nillable="false"/>
        </sequence>
    </complexType>
    <complexType name="AbstractSolidType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractGeometricPrimitiveType"/>
        </xsd:complexContent>
    </complexType>
    <element name="AbstractSolid" type="gml:AbstractSolidType" abstract="true" substitutionGroup="gml:AbstractGeometricPrimitive" nillable="false"/>
    <complexType name="SolidPropertyType" mixed="false" abstract="false">
        <sequence minOccurs="0" maxOccurs="1">
            <element ref="gml:AbstractSolid" minOccurs="1" maxOccurs="1" nillable="false"/>
        </sequence>
        <attributeGroup ref="gml:AssociationAttributeGroup"/>
        <attributeGroup ref="gml:OwnershipAttributeGroup"/>
    </complexType>
    <element name="solidProperty" type="gml:SolidPropertyType" nillable="false" abstract="false"/>
    <complexType name="SolidArrayPropertyType" mixed="false" abstract="false">
        <sequence minOccurs="0" maxOccurs="unbounded">
            <element ref="gml:AbstractSolid" minOccurs="1" maxOccurs="1" nillable="false"/>
        </sequence>
        <attributeGroup ref="gml:OwnershipAttributeGroup"/>
    </complexType>
    <element name="solidArrayProperty" type="gml:SolidArrayPropertyType" nillable="false" abstract="false"/>
    <complexType name="SolidType" mixed="false" abstract="false">
        <xsd:complexContent xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <extension base="gml:AbstractSolidType">
                <sequence minOccurs="1" maxOccurs="1">
                    <element name="exterior" type="gml:ShellPropertyType" minOccurs="0" maxOccurs="1" nillable="false"/>
                    <element name="interior" type="gml:ShellPropertyType" minOccurs="0" maxOccurs="unbounded" nillable="false"/>
                </sequence>
            </extension>
        </xsd:complexContent>
    </complexType>
    <element name="Solid" type="gml:SolidType" substitutionGroup="gml:AbstractSolid" nillable="false" abstract="false"/>
    <complexType name="ShellType" mixed="false" abstract="false">
        <sequence minOccurs="1" maxOccurs="1">
            <element ref="gml:surfaceMember" maxOccurs="unbounded" minOccurs="1" nillable="false"/>
        </sequence>
        <attributeGroup ref="gml:AggregationAttributeGroup"/>
    </complexType>
    <element name="Shell" type="gml:ShellType" substitutionGroup="gml:AbstractObject" nillable="false" abstract="false"/>
    <element name="surfaceMember" type="gml:SurfacePropertyType" nillable="false" abstract="false"/>
    <complexType name="ShellPropertyType" mixed="false" abstract="false">
        <sequence minOccurs="1" maxOccurs="1">
            <element ref="gml:Shell" minOccurs="1" maxOccurs="1" nillable="false"/>
        </sequence>
    </complexType>
</schema>