<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="http://www.opengis.net/indoorgml/1.0/core"
	targetNamespace="http://www.opengis.net/indoorgml/1.0/core"
	xmlns:xs="http://www.w3.org/2001/XMLSchema"
	xmlns:gml="http://www.opengis.net/gml/3.2"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	elementFormDefault="qualified"
	version="1.0.3">
	<xs:annotation>
		<xs:documentation>
			IndoorGML is an OGC Standard.
			Copyright (c) 2014,2015,2016,2018  Open Geospatial Consortium.
			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/.
		</xs:documentation>
	</xs:annotation>
	<!-- ====================================================================== -->
	<xs:import namespace="http://www.opengis.net/gml/3.2" schemaLocation="http://schemas.opengis.net/gml/3.2.1/gml.xsd"/>
	<!-- ====================================================================== -->
	<xs:element name="IndoorFeatures" type="IndoorFeaturesType" substitutionGroup="gml:AbstractFeature"/>
	<!-- ====================================================================== -->
	<xs:complexType name="IndoorFeaturesType">
		<xs:complexContent>
			<xs:extension base="gml:AbstractFeatureType">
				<xs:sequence>
					<xs:element name="primalSpaceFeatures" type="PrimalSpaceFeaturesPropertyType" minOccurs="0" maxOccurs="1"/>
					<xs:element name="multiLayeredGraph" type="MultiLayeredGraphPropertyType" minOccurs="0" maxOccurs="1"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:element name="PrimalSpaceFeatures" type="PrimalSpaceFeaturesType" substitutionGroup="gml:AbstractFeature"/>
	<!-- ====================================================================== -->
	<xs:complexType name="PrimalSpaceFeaturesPropertyType">
		<xs:sequence minOccurs="0">
			<xs:element ref="PrimalSpaceFeatures"/>
		</xs:sequence>
		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:complexType name="PrimalSpaceFeaturesType">
		<xs:complexContent>
			<xs:extension base="gml:AbstractFeatureType">
				<xs:sequence>
					<xs:element name="cellSpaceMember" type="CellSpaceMemberType" minOccurs="0" maxOccurs="unbounded"/>
					<xs:element name="cellSpaceBoundaryMember" type="CellSpaceBoundaryMemberType" minOccurs="0" maxOccurs="unbounded"/>
				</xs:sequence>
				<xs:attributeGroup ref="gml:AggregationAttributeGroup"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:complexType name="CellSpaceMemberType">
		<xs:complexContent>
			<xs:extension base="gml:AbstractFeatureMemberType">
				<xs:sequence minOccurs="0">
					<xs:element ref="CellSpace"/>
				</xs:sequence>
				<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:complexType name="CellSpaceBoundaryMemberType">
		<xs:complexContent>
			<xs:extension base="gml:AbstractFeatureMemberType">
				<xs:sequence minOccurs="0">
					<xs:element ref="CellSpaceBoundary"/>
				</xs:sequence>
				<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:element name="MultiLayeredGraph" type="MultiLayeredGraphType" substitutionGroup="gml:AbstractFeature">
		<xs:annotation>
			<xs:documentation> 
The overall structure of the Multilayered Space Model constitutes a multilayered graph, where all the nodes 
from all n layers are included but are separated into n partitions which are connected by the inter-space connections. 
Furthermore the graph also contains the state transition edges (intra-space connections)
			</xs:documentation>
		</xs:annotation>
	</xs:element>
	<!-- ====================================================================== -->
	<xs:complexType name="MultiLayeredGraphPropertyType">
		<xs:sequence minOccurs="0">
			<xs:element ref="MultiLayeredGraph"/>
		</xs:sequence>
		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:complexType name="MultiLayeredGraphType">
		<xs:complexContent>
			<xs:extension base="gml:AbstractFeatureType">
				<xs:sequence>
					<xs:element name="spaceLayers" type="SpaceLayersType" minOccurs="1" maxOccurs="unbounded"/>
					<xs:element name="interEdges" type="InterEdgesType" minOccurs="0" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:complexType name="SpaceLayersType">
		<xs:complexContent>
			<xs:extension base="gml:AbstractFeatureType">
				<xs:sequence>
					<xs:element name="spaceLayerMember" type="SpaceLayerMemberType" minOccurs="1" maxOccurs="unbounded"/>
				</xs:sequence>
				<xs:attributeGroup ref="gml:AggregationAttributeGroup"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:complexType name="SpaceLayerMemberType">
		<xs:complexContent>
			<xs:extension base="gml:AbstractFeatureMemberType">
				<xs:sequence minOccurs="1">
					<xs:element ref="SpaceLayer"/>
				</xs:sequence>
				<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:complexType name="InterEdgesType">
		<xs:complexContent>
			<xs:extension base="gml:AbstractFeatureType">
				<xs:sequence>
					<xs:element name="interLayerConnectionMember" type="InterLayerConnectionMemberType" minOccurs="1" maxOccurs="unbounded"/>
				</xs:sequence>
				<xs:attributeGroup ref="gml:AggregationAttributeGroup"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:complexType name="InterLayerConnectionMemberType">
		<xs:complexContent>
			<xs:extension base="gml:AbstractFeatureMemberType">
				<xs:sequence minOccurs="0">
					<xs:element ref="InterLayerConnection"/>
				</xs:sequence>
				<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:element name="InterLayerConnection" type="InterLayerConnectionType" substitutionGroup="gml:AbstractFeature">
		<xs:annotation>
			<xs:documentation>Denotin the interspace connections between the SpaceLayer
			</xs:documentation>
		</xs:annotation>
	</xs:element>
	<!-- ====================================================================== -->
	<xs:complexType name="InterLayerConnectionType">
		<xs:complexContent>
			<xs:extension base="gml:AbstractFeatureType">
				<xs:sequence>
					<xs:element name="typeOfTopoExpression" type="typeOfTopoExpressionCodeType" minOccurs="0" maxOccurs="1"/>
					<xs:element name="comment" type="xs:string" minOccurs="0" maxOccurs="1"/>
					<xs:element name="interConnects" type="StatePropertyType" minOccurs="2" maxOccurs="2"/>
					<xs:element name="ConnectedLayers" type="SpaceLayerPropertyType" minOccurs="2" maxOccurs="2" />
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:complexType name="InterLayerConnectionPropertyType">
		<xs:sequence minOccurs="0">
			<xs:element ref="InterLayerConnection"/>
		</xs:sequence>
		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:element name="SpaceLayer" type="SpaceLayerType" substitutionGroup="gml:AbstractFeature">
		<xs:annotation>
			<xs:documentation>
				&lt;SpaceLayer&gt;s represent various space concepts such as topography, sensor, security, etc. A SpaceLayer aggregates  &lt;State&gt; and &lt;Transition&gt; which are directly associated with the corresponding geometry classes.
</xs:documentation>
		</xs:annotation>
	</xs:element>
	<!-- ====================================================================== -->
	<xs:complexType name="SpaceLayerType">
		<xs:complexContent>
			<xs:extension base="gml:AbstractFeatureType">
				<xs:sequence>
					<xs:element name="usage" type="gml:CodeType" minOccurs="0" maxOccurs="unbounded"/>
					<xs:element name="terminationDate" type="xs:dateTime" minOccurs="0" maxOccurs="1"/>
					<xs:element name="function" type="gml:CodeType" minOccurs="0" maxOccurs="unbounded"/>
					<xs:element name="creationDate" type="xs:dateTime" minOccurs="0" maxOccurs="1"/>
					<xs:element name="class" type="SpaceLayerClassTypeType" minOccurs="0" maxOccurs="1"/>
					<xs:element name="nodes" type="NodesType" minOccurs="1" maxOccurs="unbounded"/>
					<xs:element name="edges" type="EdgesType" minOccurs="0" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- ====================================================================== -->
		<xs:complexType name="SpaceLayerPropertyType">
		<xs:sequence minOccurs="0">
			<xs:element ref="SpaceLayer"/>
		</xs:sequence>
		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:complexType name="NodesType">
		<xs:complexContent>
			<xs:extension base="gml:AbstractFeatureType">
				<xs:sequence>
					<xs:element name="stateMember" type="StateMemberType" minOccurs="1" maxOccurs="unbounded"/>
				</xs:sequence>
				<xs:attributeGroup ref="gml:AggregationAttributeGroup"/>
				<xs:attributeGroup ref="gml:OwnershipAttributeGroup"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:complexType name="StateMemberType">
		<xs:complexContent>
			<xs:extension base="gml:AbstractFeatureMemberType">
				<xs:sequence minOccurs="0">
					<xs:element ref="State"/>
				</xs:sequence>
				<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:complexType name="EdgesType">
		<xs:complexContent>
			<xs:extension base="gml:AbstractFeatureType">
				<xs:sequence>
					<xs:element name="transitionMember" type="TransitionMemberType" minOccurs="0" maxOccurs="unbounded"/>
				</xs:sequence>
				<xs:attributeGroup ref="gml:AggregationAttributeGroup"/>
				<xs:attributeGroup ref="gml:OwnershipAttributeGroup"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:complexType name="TransitionMemberType">
		<xs:complexContent>
			<xs:extension base="gml:AbstractFeatureMemberType">
				<xs:sequence minOccurs="0">
					<xs:element ref="Transition"/>
				</xs:sequence>
				<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:element name="State" type="StateType" substitutionGroup="gml:AbstractFeature">
		<xs:annotation>
			<xs:documentation>
Within the dual graph structure of one layer a node in dual space represents a space (e.g. a room within a building) in primal space
			</xs:documentation>
		</xs:annotation>
	</xs:element>
	<!-- ====================================================================== -->
	<xs:complexType name="StateType">
		<xs:complexContent>
			<xs:extension base="gml:AbstractFeatureType">
				<xs:sequence>
					<xs:element name="duality" type="CellSpacePropertyType" minOccurs="0" maxOccurs="1"/>
					<xs:element name="connects" type="TransitionPropertyType" minOccurs="0" maxOccurs="unbounded"/>
					<xs:element name="geometry" type="gml:PointPropertyType" minOccurs="0" maxOccurs="1"/>
				</xs:sequence>
				<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:complexType name="StatePropertyType">
		<xs:sequence minOccurs="0">
			<xs:element ref="State"/>
		</xs:sequence>
		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:element name="Transition" type="TransitionType" substitutionGroup="gml:AbstractFeature">
		<xs:annotation>
			<xs:documentation>
Within the dual graph structure of one layer, an edge in dual space represents the adjacencies or connections (e.g. doors or passages as intra-space connections) 
</xs:documentation>
		</xs:annotation>
	</xs:element>
	<!-- ====================================================================== -->
	<xs:complexType name="TransitionType">
		<xs:complexContent>
			<xs:extension base="gml:AbstractFeatureType">
				<xs:sequence>
					<xs:element name="weight" type="xs:double" minOccurs="0" maxOccurs="1"/>
					<xs:element name="connects" type="StatePropertyType" minOccurs="2" maxOccurs="2"/>
					<xs:element name="duality" type="CellSpaceBoundaryPropertyType" minOccurs="0" maxOccurs="1"/>
					<xs:element name="geometry" type="gml:CurvePropertyType" minOccurs="0" maxOccurs="1"/>
				</xs:sequence>
				<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:complexType name="TransitionPropertyType">
		<xs:sequence minOccurs="0">
			<xs:element ref="Transition"/>
		</xs:sequence>
		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:element name="CellSpace" type="CellSpaceType" substitutionGroup="gml:AbstractFeature">
		<xs:annotation>
			<xs:documentation>
Within the dual graph structure of one layer a node in dual space represents a space (e.g. a room within a building) in primal space
			</xs:documentation>
		</xs:annotation>
	</xs:element>
	<!-- ====================================================================== -->
	<xs:complexType name="CellSpaceType">
		<xs:complexContent>
			<xs:extension base="gml:AbstractFeatureType">
				<xs:sequence>
					<xs:element name="cellSpaceGeometry" type="CellSpaceGeometryType" minOccurs="0" maxOccurs="1"/>
					<xs:element name="duality" type="StatePropertyType" minOccurs="0" maxOccurs="1"/>
					<xs:element name="externalReference" type="ExternalReferenceType" minOccurs="0" maxOccurs="unbounded"/>
					<xs:element name="partialboundedBy" type="CellSpaceBoundaryPropertyType" minOccurs="0" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:complexType name="CellSpacePropertyType">
		<xs:sequence minOccurs="0">
			<xs:element ref="CellSpace"/>
		</xs:sequence>
		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:complexType name="CellSpaceGeometryType">
		<xs:choice>
			<xs:element name="Geometry3D" type="gml:SolidPropertyType"/>
			<xs:element name="Geometry2D" type="gml:SurfacePropertyType"/>
		</xs:choice>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:element name="CellSpaceBoundary" type="CellSpaceBoundaryType" substitutionGroup="gml:AbstractFeature">
		<xs:annotation>
			<xs:documentation>
 Within the dual graph structure of one layer a edge in dual space represents a spaceboundary (e.g. a wall between adjacenced rooms in a building) in primal space
		</xs:documentation>
		</xs:annotation>
	</xs:element>
	<!-- ====================================================================== -->
	<xs:complexType name="CellSpaceBoundaryType">
		<xs:complexContent>
			<xs:extension base="gml:AbstractFeatureType">
				<xs:sequence>
					<xs:element name="duality" type="TransitionPropertyType" minOccurs="0" maxOccurs="1"/>
					<xs:element name="cellSpaceBoundaryGeometry" type="CellSpaceBoundaryGeometryType" minOccurs="0" maxOccurs="1"/>
					<xs:element name="externalReference" type="ExternalReferenceType" minOccurs="0" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:complexType name="CellSpaceBoundaryGeometryType">
		<xs:choice>
			<xs:element name="geometry3D" type="gml:SurfacePropertyType"/>
			<xs:element name="geometry2D" type="gml:CurvePropertyType"/>
		</xs:choice>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:complexType name="CellSpaceBoundaryPropertyType">
		<xs:sequence minOccurs="0">
			<xs:element ref="CellSpaceBoundary"/>
		</xs:sequence>
		<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:complexType name="ExternalReferenceType">
		<xs:sequence>
			<xs:element name="informationSystem" type="xs:anyURI" minOccurs="0"/>
			<xs:element name="externalObject" type="externalObjectReferenceType"/>
		</xs:sequence>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:complexType name="externalObjectReferenceType">
		<xs:choice>
			<xs:element name="name" type="xs:string" minOccurs="0"/>
			<xs:element name="uri" type="xs:anyURI"/>
		</xs:choice>
	</xs:complexType>
	<!-- ====================================================================== -->
	<xs:simpleType name="SpaceLayerClassTypeType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="TOPOGRAPHIC"/>
			<xs:enumeration value="SENSOR"/>
			<xs:enumeration value="LOGICAL"/>
			<xs:enumeration value="TAGS"/>
			<xs:enumeration value="UNKNOWN"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- ====================================================================== -->
	<xs:simpleType name="typeOfTopoExpressionCodeType">
		<xs:union memberTypes="typeOfTopoExpressionCodeEnumerationType typeOfTopoExpressionCodeOtherType"/>
	</xs:simpleType>
	<!-- ====================================================================== -->
	<xs:simpleType name="typeOfTopoExpressionCodeEnumerationType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="CONTAINS"/>
			<xs:enumeration value="OVERLAPS"/>
			<xs:enumeration value="EQUALS"/>
			<xs:enumeration value="WITHIN"/>
			<xs:enumeration value="CROSSES"/>
			<xs:enumeration value="INTERSECTS"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- ====================================================================== -->
	<xs:simpleType name="typeOfTopoExpressionCodeOtherType">
		<xs:restriction base="xs:string">
			<xs:pattern value="other. \w{2,}"/>
		</xs:restriction>
	</xs:simpleType>
</xs:schema>
