<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1">

<annotation> 
<documentation>
This document presents a modified view of the GML 3.1.1 schema restricted and adopted to the portions we support in Microsoft (r) SQL Server (tm) for Geometry types.
		
We comment each component with the original GML schema file from which it came and add the original schema definitions for the components that we changed to either make them local or add additional constraints.

GML 3.1.1 is an OGC Standard.
Copyright (c) 2008 Open Geospatial Consortium, Inc. All Rights Reserved.
To obtain additional rights of use, visit http://www.opengeospatial.org/legal/.

(c) 2008 Microsoft Corporation. All rights reserved. The following schema for Microsoft SQL Server is presented in XML format and is for informational purposes only. Microsoft Corporation ("Microsoft") may have trademarks, copyrights, or other intellectual property rights covering subject matter in the schema. Microsoft does not make any representation or warranty regarding the schema or any product or item developed based on the schema. The schema is provided to you on an AS IS basis. Microsoft disclaims all express, implied and statutory warranties, including but not limited to the implied warranties of merchantability, fitness for a particular purpose, and freedom from infringement. Without limiting the generality of the foregoing, Microsoft does not make any warranty of any kind that any item developed based on the schema, or any portion of the schema, will not infringe any copyright, patent, trade secret, or other intellectual property right of any person or entity in any country. It is your responsibility to seek licenses for such intellectual property rights where appropriate. MICROSOFT SHALL NOT BE LIABLE FOR ANY DAMAGES OF ANY KIND ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SCHEMA, INCLUDING WITHOUT LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL (INCLUDING ANY LOST PROFITS), PUNITIVE OR SPECIAL DAMAGES, WHETHER OR NOT MICROSOFT HAS BEEN ADVISED OF SUCH DAMAGES. 
</documentation> 
</annotation>


	<!-- ==============================================================
		Supported elements
	============================================================== -->

	<!-- geometryBasic0d1d.xsd -->
	<element name="Point" type="gml:PointType" substitutionGroup="gml:_GeometricPrimitive"/>

	<!-- geometryBasic0d1d.xsd -->
<!-- not globally accepted by SQL Server, thus refs will be replaced by inlined local element declarations
	<element name="pos" type="gml:DirectPositionType"/>
-->

	<!-- geometryBasic0d1d.xsd -->
	<element name="LineString" type="gml:LineStringType" substitutionGroup="gml:_Curve"/>

	<!-- geometryBasic0d1d.xsd-->
<!-- not globally accepted by SQL Server, thus refs will be replaced by inlined local element declarations
	<element name="posList" type="gml:DirectPositionListType"/>
-->

	<!-- geometryBasic2d.xsd -->
	<element name="Polygon" type="gml:PolygonType" substitutionGroup="gml:_Surface"/>

	<!-- geometryBasic2d.xsd -->
<!-- not globally accepted by SQL Server, thus refs will be replaced by inlined local element declarations
	<element name="exterior" type="gml:AbstractRingPropertyType"/>
	<element name="interior" type="gml:AbstractRingPropertyType"/>
-->

	<!-- geometryAggregates.xsd -->
	<element name="MultiGeometry" type="gml:MultiGeometryType" substitutionGroup="gml:_GeometricAggregate"/>

	<!-- geometryAggregates.xsd -->
<!-- not globally accepted by SQL Server, thus refs will be replaced by inlined local element declarations
	<element name="geometryMember" type="gml:GeometryPropertyType"/>
	<element name="geometryMembers" type="gml:GeometryArrayPropertyType"/>
-->

	<!-- geometryAggregates.xsd -->
	<element name="MultiPoint" type="gml:MultiPointType" substitutionGroup="gml:_GeometricAggregate"/>

	<!-- geometryAggregates.xsd -->
	<element name="MultiCurve" type="gml:MultiCurveType" substitutionGroup="gml:_GeometricAggregate"/>

	<!-- geometryAggregates.xsd -->
	<element name="MultiSurface" type="gml:MultiSurfaceType" substitutionGroup="gml:_GeometricAggregate"/>

<!-- not globally accepted by SQL Server, thus refs will be replaced by inlined local element declarations -->
	<!-- geometryBasic0d1d.xsd -->
<!--	<element name="pointProperty" type="gml:PointPropertyType"/>-->

	<!-- geometryAggregates.xsd -->
<!--	<element name="curveMembers" type="gml:CurveArrayPropertyType"/>-->

	<!-- geometryPrimatives.xsd -->
<!--	<element name="curveMember" type="gml:CurvePropertyType"/>-->

	<!-- geometryPrimatives.xsd -->
<!--	<element name="surfaceMember" type="gml:SurfacePropertyType"/>-->

	<!-- geometryPrimatives.xsd -->
<!--	<element name="surfaceMembers" type="gml:SurfaceArrayPropertyType"/>-->
	
	<!-- geometryAggregates.xsd -->
<!--	<element name="pointMember" type="gml:PointPropertyType"/>-->

	<!-- geometryAggregates.xsd -->
<!--	<element name="pointMembers" type="gml:PointArrayPropertyType"/>-->

	<!-- ==============================================================
		Abstract elements
	============================================================== -->

	<!-- geometryBasic0d1d.xsd -->
	<element name="_GeometricPrimitive" type="gml:AbstractGeometricPrimitiveType" abstract="true" substitutionGroup="gml:_Geometry"/>

	<!-- geometryBasic0d1d.xsd -->
	<element name="_Geometry" type="gml:AbstractGeometryType" abstract="true" substitutionGroup="gml:_GML"/>

	<!-- gmlBase.xsd -->
	<element name="_GML" type="gml:AbstractGMLType" abstract="true" substitutionGroup="gml:_Object"/>

	<!-- gmlBase.xsd -->
	<element name="_Object" abstract="true"/>

	<!-- geometryBasic0d1d.xsd -->
	<element name="_Curve" type="gml:AbstractCurveType" abstract="true" substitutionGroup="gml:_GeometricPrimitive"/>

	<!-- geometryBasic2d.xsd -->
	<element name="_Ring" type="gml:AbstractRingType" abstract="true" substitutionGroup="gml:_Geometry"/>

	<!-- geometryAggregates.xsd -->
	<element name="_GeometricAggregate" type="gml:AbstractGeometricAggregateType" abstract="true" substitutionGroup="gml:_Geometry"/>

	<!-- geometryBasic2d.xsd -->
	<element name="LinearRing" type="gml:LinearRingType" substitutionGroup="gml:_Ring"/>

	<!-- geometryBasic2d.xsd -->
	<element name="_Surface" type="gml:AbstractSurfaceType" abstract="true" substitutionGroup="gml:_GeometricPrimitive">
		<annotation>
			<documentation>The "_Surface" element is the abstract head of the substituition group for all (continuous) surface elements.</documentation>
		</annotation>
	</element>

	<!-- ==============================================================
		Types
	============================================================== -->

	<!-- geometryBasic0d1d.xsd -->
	<complexType name="PointType">
		<complexContent>
			<extension base="gml:AbstractGeometricPrimitiveType">
				<sequence>
					<choice>
<!-- GML spec						<element ref="gml:pos"/>-->
							<element name="pos" type="gml:DirectPositionType"/>
					</choice>
				</sequence>
			</extension>
		</complexContent>
	</complexType>

	<!-- geometryBasic0d1d.xsd -->
	<complexType name="PointArrayPropertyType">
		<sequence>
			<element ref="gml:Point" minOccurs="0" maxOccurs="unbounded"/>
		</sequence>
	</complexType>

	<!-- geometryBasic0d1d.xsd -->
	<complexType name="AbstractGeometricPrimitiveType" abstract="true">
		<complexContent>
			<extension base="gml:AbstractGeometryType"/>
		</complexContent>
	</complexType>

	<!-- geometryBasic0d1d.xsd -->
	<complexType name="AbstractGeometryType" abstract="true">
		<complexContent>
			<extension base="gml:AbstractGMLType"/>
		</complexContent>
	</complexType>

	<!-- gmlBase.xsd -->
	<complexType name="AbstractGMLType" abstract="true">
		<sequence>
		</sequence>
	</complexType>

	<!-- geometryBasic0d1d.xsd -->
<!-- GML spec:	<complexType name="DirectPositionType">
		<simpleContent>
			<extension base="gml:doubleList"/>
		</simpleContent>
	</complexType>
-->
	<!-- SQL Server does not support attributes, so we can make the type simple and restrict it into a union of an empty content or length 2 -->
	<simpleType name="DirectPositionType">
		<union>
			<simpleType>
				<restriction base="gml:doubleList">
					<length value="0"/>
				</restriction> 
			</simpleType>
			<simpleType>
				<restriction base="gml:doubleList">
					<length value="2"/>
				</restriction>
			</simpleType>
		</union> 
	</simpleType>

	<!-- basicTypes.xsd-->
	<simpleType name="doubleList">
		<list itemType="double"/>
	</simpleType>

	<!-- geometryBasic0d1d.xsd -->
	<complexType name="LineStringType">
		<complexContent>
			<extension base="gml:AbstractCurveType">
				<sequence>
					<choice>
						<choice minOccurs="2" maxOccurs="unbounded">
<!-- GML spec:							<element ref="gml:pos"/>
							<element ref="gml:pointProperty"/>-->
							<element name="pos" type="gml:DirectPositionType"/>
							<element name="pointProperty" type="gml:PointPropertyType"/>

						</choice>
<!-- GML spec:						<element ref="gml:posList"/>-->
						<element name="posList" type="gml:DirectPositionListType"/>

					</choice>
				</sequence>
			</extension>
		</complexContent>
	</complexType>

	<!-- geometryBasic0d1d.xsd -->
	<complexType name="AbstractCurveType" abstract="true">
		<complexContent>
			<extension base="gml:AbstractGeometricPrimitiveType"/>
		</complexContent>
	</complexType>

	<!-- geometryBasic0d1d.xsd-->
	<complexType name="PointPropertyType">
		<sequence>
			<element ref="gml:Point" minOccurs="0"/>
		</sequence>
	</complexType>

	<!-- geometryBasic0d1d.xsd-->
	<!-- should have an even number of list elements -->
<!-- GML spec:
	<complexType name="DirectPositionListType">
		<simpleContent>
			<extension base="gml:doubleList"/>
		</simpleContent>
	</complexType>
-->
	<!-- SQL Server does not allow attributes and can make this a simple type -->
	<simpleType name="DirectPositionListType">
			<restriction base="gml:doubleList"/>
	</simpleType>

	<!-- geometryBasic2d.xsd -->
	<complexType name="PolygonType">
		<complexContent>
			<extension base="gml:AbstractSurfaceType">
				<sequence>
<!-- GML spec:					<element ref="gml:exterior" minOccurs="0"/>
					<element ref="gml:interior" minOccurs="0" maxOccurs="unbounded"/>-->

					<element name="exterior" type="gml:AbstractRingPropertyType" minOccurs="0"/>
					<element name="interior" type="gml:AbstractRingPropertyType" minOccurs="0" maxOccurs="unbounded"/>
				</sequence>
			</extension>
		</complexContent>
	</complexType>

	<!-- geometryBasic2d.xsd-->
	<complexType name="AbstractSurfaceType">
		<complexContent>
			<extension base="gml:AbstractGeometricPrimitiveType"/>
		</complexContent>
	</complexType>

	<!-- geometryBasic2d.xsd -->
	<complexType name="AbstractRingPropertyType">
		<sequence>
			<element ref="gml:_Ring"/>
		</sequence>
	</complexType>

	<!-- geometryBasic2d.xsd -->
	<complexType name="AbstractRingType" abstract="true">
		<complexContent>
			<extension base="gml:AbstractGeometryType"/>
		</complexContent>
	</complexType>

	<!-- geometryAggregates.xsd-->
	<complexType name="MultiGeometryType">
		<complexContent>
			<extension base="gml:AbstractGeometricAggregateType">
				<sequence>
<!-- GML Spec:					<element ref="gml:geometryMember" minOccurs="0" maxOccurs="unbounded"/>
					<element ref="gml:geometryMembers" minOccurs="0"/>-->
					<element name="geometryMember" type="gml:GeometryPropertyType"  minOccurs="0" maxOccurs="unbounded"/>
					<element name="geometryMembers" type="gml:GeometryArrayPropertyType" minOccurs="0" />

				</sequence>
			</extension>
		</complexContent>
	</complexType>

	<!-- geometryAggregates.xsd -->
	<complexType name="AbstractGeometricAggregateType" abstract="true">
		<complexContent>
			<extension base="gml:AbstractGeometryType"/>
		</complexContent>
	</complexType>

	<!-- geometryBasic0d1d.xsd -->
	<complexType name="GeometryPropertyType">
		<sequence>
			<element ref="gml:_Geometry" minOccurs="0"/>
		</sequence>
	</complexType>


	<!-- geometryBasic0d1d.xsd -->
	<complexType name="GeometryArrayPropertyType">
		<sequence>
			<element ref="gml:_Geometry" minOccurs="0" maxOccurs="unbounded"/>
		</sequence>
	</complexType>

	<!-- geometryAggregates.xsd -->
	<complexType name="MultiPointType">
		<complexContent>
			<extension base="gml:AbstractGeometricAggregateType">
				<sequence>
<!-- GML spec:
					<element ref="gml:pointMember" minOccurs="0" maxOccurs="unbounded"/>
					<element ref="gml:pointMembers" minOccurs="0"/>-->
					<element name="pointMember" type="gml:PointPropertyType" minOccurs="0" maxOccurs="unbounded"/>
					<element name="pointMembers" type="gml:PointArrayPropertyType" minOccurs="0"/>

				</sequence>
			</extension>
		</complexContent>
	</complexType>

	<!-- geometryAggregates.xsd -->
	<complexType name="MultiCurveType">
		<complexContent>
			<extension base="gml:AbstractGeometricAggregateType">
				<sequence>
<!-- GML spec:
					<element ref="gml:curveMember" minOccurs="0" maxOccurs="unbounded"/>
					<element ref="gml:curveMembers" minOccurs="0"/>-->
					<element name="curveMember" type="gml:CurvePropertyType" minOccurs="0" maxOccurs="unbounded"/>
	<element name="curveMembers" type="gml:CurveArrayPropertyType" minOccurs="0"/>

				</sequence>
			</extension>
		</complexContent>
	</complexType>

	<!-- geometryAggregates.xsd -->
	<complexType name="MultiSurfaceType">
		<complexContent>
			<extension base="gml:AbstractGeometricAggregateType">
				<sequence>
<!-- GML spec:
					<element ref="gml:surfaceMember" minOccurs="0" maxOccurs="unbounded"/>
					<element ref="gml:surfaceMembers" minOccurs="0"/>-->

					<element name="surfaceMember" type="gml:SurfacePropertyType" minOccurs="0" maxOccurs="unbounded"/>
					<element name="surfaceMembers" type="gml:SurfaceArrayPropertyType" minOccurs="0"/>

				</sequence>
			</extension>
		</complexContent>
	</complexType>

	<!-- geometryAggregates.xsd -->
	<complexType name="CurvePropertyType">
		<sequence>
			<element ref="gml:_Curve" minOccurs="0"/>
		</sequence>
	</complexType>

	<!-- geometryAggregates.xsd -->
	<complexType name="CurveArrayPropertyType">
		<sequence>
			<element ref="gml:_Curve" minOccurs="0" maxOccurs="unbounded"/>
		</sequence>
	</complexType>

	<!-- geometryBasic2d.xsd -->
	<complexType name="SurfacePropertyType">
		<sequence>
			<element ref="gml:_Surface" minOccurs="0"/>
		</sequence>
	</complexType>

	<!-- geometryBasic2d.xsd -->
	<complexType name="SurfaceArrayPropertyType">
		<sequence>
			<element ref="gml:_Surface" minOccurs="0" maxOccurs="unbounded"/>
		</sequence>
	</complexType>

	<!-- geometryBasic2d.xsd -->
	<!-- starting and end point need to be the same! -->
	<complexType name="LinearRingType">
		<complexContent>
			<extension base="gml:AbstractRingType">
				<sequence>
					<choice>
						<choice minOccurs="4" maxOccurs="unbounded">
<!-- GML spec:							<element ref="gml:pos"/>
							<element ref="gml:pointProperty"/>-->
							<element name="pos" type="gml:DirectPositionType"/>
							<element name="pointProperty" type="gml:PointPropertyType"/>
						</choice>
<!-- GML Spec:						<element ref="gml:posList"/>-->
						<element name="posList">
							<simpleType>
								<restriction base="gml:DirectPositionListType">
									<minLength value="8"/>
								</restriction>
							</simpleType>
						</element>
					</choice>
				</sequence>
			</extension>
		</complexContent>
	</complexType>

</schema>