GML的架构及范例
一、前言在信息高速公路的时代,如何能在不同的GIS 系统间实时分享资料,是刻不容缓的问题,现在该问题已经有了一个很好解决方案,那就是以 XML 为基础的 GIS 编码标准,称为地理图形标记语言GML(Geography Markup Language)。
GML是由开放式地理信息系统联盟(OpenGIS Consortium,简称OGC)所发展,专为地理信息而发展的,以XML 为基础的编码标准,其与生俱来的转换及存取能力,将地理空间信息的管理开启一个全新的领域(请参考 黄旭初[2002],『新世代的GIS编码标准-地理图形标记语言GML』,国土信息系统通讯第42期)。
由于GML在GIS领域,将对『资料交换』课题的扮演关键的角色,GIS 的参与者实有必要对GML的内容有深入的了解,本文将介绍GML的架构,并以范例说明。
二、GML 基本架构
(一)以XML技术为基础
GML 目前的正式版本是2.1.1版,它以XML技术为基础,并使用最新的 XML Schema文件定义技术,XML Schema具有DTD所没有的型态继承(type inheritance)、名称空间(namespaces)等,且其使用XLink来表现地理空间实体间的关系,使得实体间关系的建立不仅限于同一数据库,甚至可横跨网际网络,因此GML 2.1.1版已足以建构分布式的GIS数据库。
(二)以simple feature为处理的单元
GML使用『地理图形实体(称为feature)』来描述这个世界,基本上一个feature是由一系列的属性(properties)及几何图形(geometries)所组成,属性的内容包括名称(name)、型态(type)、值的叙述(value description)等,几何图形(geometries)则由基本几何区块(例如点、线、及多边形)所组成,为了简化,GML的初始规格限定在平面的简单几何图形(称为simple feature,包括点、线、及多边形),在不久的将来,将会扩展至3D的几何图形及位相资料。
GML的编码可以容许相当复杂的feature,一个feature的几何图形可以由许多几何图形元素所组成(称为Geometric Collection),也可以包含不同型态的几何图形。例如一个无线电转播塔可以同时有一个点的属性(它的位置点)及一个以多边形所构成的面的属性(它所涵盖的区域)。
(三)GML的内容
GML 2.1.1版以XML技术为基础,并使用 XML Schema文件定义技术,目前GML以Feature Schema、Geometry Schema、Xlinks Schema等三个基本的schema来定义它的内容,分述如下:
1. Feature Schema(feature.xsd)
Feature Schema定义feature的内容及结构。图1是以UML来描述Feature schema的内容及结构,从图中可以看到几何图形的属性(geometric property)被当作一个关联类别(association class),来将一个feature与一个几何图形(geometry)连结,例如PointProperty用来连结一个点(point)的几何图形。
详细的Feature schema内容请参考GML2.1.1规格书(位于http://opengis.net/gml/02-009/GML2-11.html)之附录A。
图1. Feature schema之UML图标
2. Geometry Schema(geometry.xsd)
Geometry schema有关几何图形元素的类型的定义,包括点(point)、线(line)、多边形(polygon)等简单几何图形,及复合类型(complex type)的几何图形。图2是以UML来描述Geometry schema的内容及结构。
Feature schema使用<include>元素来将几何图形结构Geometry schema带进来,使得在定义feature type时可以引用:
<include schemaLocation= geometry.xsd />
详细的Geometry schema内容请参考GML 2.1.1规格书之附录B。
图2. Geometry schema之UML图标
GML 定义了几个基本的几何图形属性(Geometric property),用来将feature与几何图形连结,有关基本的几何图形属性表列如下。
3. XLinks Schema(xlink.xsd)
提供XLink属性来作为数据链结使用。Geometry schema使用<import>元素来引用XLink。详细的XLinks schema内容请参考GML 2.1.1规格书之附录C。
Feature schema、Geometry schema及XLink schema三个基本schema之间的关系可用图3来表示。
图3. Feature schema、Geometry schema及XLink schema等三个基本schema之间的关系。
三、以GML编码的范例
(一)无几何图形的数据的编码
本节以最简单的范例介绍起,假设有个非空间资料的feature type称为 员工 (Employee),他有姓名、年龄、及别名等属性,其中别名可能有0个或1个以上,若以XML来对"员工"这个feature type编码,则可能的XML instance如下:
<Employee>
<name>黄旭初</name>
<Age>41</age>
<nickName>小黄</nickName>
<NickName>阿初</nickName>
</Employee>
在尚不考虑GML的状况下,本实例的XML schema应定义如下:
<element name="Employee" type="ex:EmployeeType" />
<complexType name="EmployeeType">
<sequence>
<element name="name" type="string"/>
<element name="age" type="integer"/>
<Element name="nickName" type="string" minOccurs="0"maxOccurs="unbounded"/>
</Sequence>
</complexType>
若要引用GML的Feature schema,必须先确认哪些元素扮演feature type及其属性(property)的角色,在本例中 员工 是一个feature type,年龄是一个属性(property),则上例改写成GML的语法如下:
<element name="Employee" type="ex:EmployeeType"
substitutionGroup="gml:_Feature" />
<ComplexType name="EmployeeType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element name="name" type="string"/>
<element name="age" type="integer"/>
<element name="nickName" type="string" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</extension>
</complexContent>
</complexType>
而且GML的Feature schema中有一些已经定义好的属性(例如如GML feature ID(fid)及其description属性等),可以在制作XML instance的时候使用,举例如下:
<Employee fid="D1123">
<Gml:description>内政部信息中心的员工</gml:description>
<name>黄旭初</name>
<age>41</age>
<nickName>小黄</nickName>
<nickName>阿初</nickName>
</Employee>
(二)坐标及坐标范围的编码
几何图形的坐标可以用一系列的<coord>元素组、或<coordinates>元素的单一字符串来编码,两种方法都可以对1、2、3度空间的坐标编码,其中<coord>元素可以使用XML 解析器(parser)来验证其正确性。
<coord>元素在 GML的Geometry schema 中定义如下:
<element name="coord" type="gml:CoordType" />
<complexType name="CoordType">
<sequence>
<element name="X" type="decimal"/>
<element name="Y" type="decimal" minOccurs="0"/>
<element name="Z" type="decimal" minOccurs="0"/>
</sequence>
</complexType>
<Coord>元素中资料组的组数由数据类型决定,例如点(point)资料只含有一组坐标组,如下:
<Point srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<coord><X>5.0</X><Y>40.0</Y></coord>
</Point>
(例中srsName="http://www.opengis.net/gml/srs/epsg.xml#4326是空间参考系统。)
而<coordinates>与<coord>的作用一样,但更具有弹性,使用者可以定义坐标值之间的间隔符号(delimiter),<coordinates>元素在 GML的Geometry schema 中定义如下:
<Element name="coordinates" type="gml:CoordinatesType"/>
<complexType name="CoordinatesType">
<simpleContent>
<extension base="string">
<Attribute name="decimal" type="string" use="default" value="."/>
<attribute name="cs" type="string" use="default" value=","/>
<attribute name="ts" type="string" use="default" value=" "/>
</extension>
</simpleContent>
</complexType>
<Coordinates>的坐标值是储存在一个字符串内,其中预设的小数点是 "."、坐标值的间隔符号是 ","、坐标组的间隔符号是Unicode的空白(#x20),使用者可以依其需要改变上述之间隔符号。
同样以点资料为例,以<coordinates>编码坐标如下:
<Point srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<coordinates>5.0,40.0</coordinates>
</Point>
(三)基本几何图形的编码
几何图形的坐标都是定义在某种空间参考系统(Spatial Reference System,缩写为SRS)中,GML 2.1.1版中没有规定SRS的细部规格,目前OGC已经提出一份建议规格进行讨论,应该很快就会公布,几何图形类型(geometry type)的srsName属性是用来指向SRS的定义。
几何图形类型(geometry type)的gid 属性是几何图形元素的唯一辨识码,属于选择使用的项目,依规定,gid的值是字符串且第一个字符不能是数字。
GML中所定义的基本几何图形元素(primitive geometry element)包括坐标范围(Box)、点(Point)、线串(LineString)、线环(LinearRing)、及多边形(Polygon),分述如下:
1. Box:用来对feature的坐标范围编码,第一组坐标是坐标范围的极小值,第二组坐标是坐标范围的极大值,举例如下:
<Box srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<coord><X>0.0</X><Y>0.0</Y></coord>
<coord><X>100.0</X><Y>100.0</Y></coord>
</Box>
2. Point:点元素只有一组坐标,举例如下,
<Point gid="P1" srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<coord><X>56.1</X><Y>0.45</Y></coord>
</Point>
3. LineString:由两组以上的点坐标所构成的直线串,举例如下:
<LineString>
<Coord><X>0.0</X><Y>0.0</Y></coord>
<coord><X>20.0</X><Y>35.0</Y></coord>
<coord><X>100.0</X><Y>100.0</Y></coord>
</LineString>
若第一点坐标值与最后一点坐标值一样,则这是一个封闭的线串。
4. LinearRing:线环是封闭的直线串,其第一点坐标值与最后一点坐标值一样,它是被用来建构多边形,其编码范例详见以下多边形的介绍。
5. Polygon:多边形的边界是由线环(LinearRing)所构成,且区分成外边界(outer boundary)及内边界(inner boundary),内边界可以有多个但彼此不能交叉及包含,且边界点的顺序是顺时针或逆时针并不重要。以下是一个多边形的instance,它拥有两个内部边界:
<Polygon gid="_98217" srsName="http://www.opengis.net/gml/srs/ epsg.xml#4326">
<outerBoundaryIs>
<LinearRing>
<coordinates>0.0,0.0 100.0,0.0 100.0,100.0 0.0,100.0 0.0,0.0 </coordinates>
</LinearRing>
</outerBoundaryIs>
<innerBoundaryIs>
<LinearRing>
<coordinates>10.0,10.0 10.0,40.0 40.0,40.0 40.0,10.0 10.0,10.0 </ coordinates>
</LinearRing>
</innerBoundaryIs>
<innerBoundaryIs>
<LinearRing>
<coordinates>60.0,60.0 60.0,90.0 90.0,90.0 90.0,60.0 60.0,60.0</ coordinates>
</LinearRing>
</innerBoundaryIs>
</Polygon>
(四)几何图形集合的编码
GML Geometry schema所预先定义的几何图形集合(geometry collection),可分为同质几何图形集合(homogeneous geometry collection)及异质几何图形集合(heterogeneous geometry collection)两种。
所谓的同质几何图形集合(homogeneous geometry collection)是指同类型几何元素的集合,包括MultiPoint、MultiLineString及MultiPolygon等三种。以下以MultiLineString为例,在本例中MultiLineString几何图形集合拥有三个LineString的成员:
<MultLineString srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<lineStringMember>
<LineString>
<coord><X>56.1</X><Y>0.45</Y></coord>
<coord><X>67.23</X><Y>0.98</Y></coord>
</LineString>
</lineStringMember>
<lineStringMember>
<LineString>
<coord><X>46.71</X><Y>9.25</Y></coord>
<coord><X>56.88</X><Y>10.44</Y></coord>
</LineString>
</lineStringMember>
<LineStringMember>
<LineString>
<coord><X>324.1</X><Y>219.7</Y></coord>
<coord><X>0.45</X><Y>4.56</Y></coord>
</LineString>
</lineStringMember>
</MultiLineString>
所谓的异质几何图形集合(homogeneous geometry collection)是指不同类型几何元素的集合,GML Geometry schema中的MultiGeometry元素即是异质几何图形集合,它的成员可以包括Points、LineStrings、Polygons、MultiPoints、 MultiLineStrings、MultiPolygon等几何图形元素、及其它的几何图形集合(geometry collection)。
以下是一个异质几何图形集合的instance,它包含Point、LineString及Polygon等三种不同类型几何元素的成员:
<MultiGeometry gid="c731" srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<geometryMember>
<Point gid="P6776">
<coord><X>50.0</X><Y>50.0</Y></coord>
</Point>
</geometryMember>
<geometryMember>
<LineString gid="L21216">
<coord><X>0.0</X><Y>0.0</Y></coord>
<coord><X>0.0</X><Y>50.0</Y></coord>
<coord><X>100.0</X><Y>50.0</Y></coord>
</LineString>
</GeometryMember>
<geometryMember>
<Polygon gid="_877789">
<outerBoundaryIs>
<LinearRing>
<coordinates>0.0,0.0 100.0,0.0 50.0,100.0 0.0,0.0</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</geometryMember>
</MultiGeometry>
(五)具有几何图形的feature的编码
GML 2.1.1版提供了一组定义好的几何图形属性(geometry property),将某些类型的几何图形与feature产生关联。
我们继续前面的员工范例,为其加上一个点的属性,称为 location (location是已定义于GML Feature schema中的pointProperty的别名),则可以得到下列的结果:
<Employee fid="D1123">
<gml:description>内政部信息中心的员工</gml:description>
<name>黄旭初</name>
<age>41</age>
<nickName>小黄</nickName>
<nickName>阿初</nickName>
<gml:location>
<gml:point>
<gml:coord><gml:x>1.0</gml:x><gml:y>1.0</gml:y></gml:coord>
</Gml:point>
</gml:location>
</Employee>
其相对应的application schema如下:
<element name="Employee" type="ex:EmployeeType" substitutionGroup="gml:_Feature"/>
<complexType name="EmployeeType">
<complexContent>
<exten.sion base="gml:AbstractFeatureType">
<sequence>
<element name="name" type="string"/>
<element name="age" type="integer"/>
<element name="nickName" type="string" minOccurs="0" maxOccurs="unbounded"/>
<element ref= gml:location />
</sequence>
</extension>
</complexContent>
</complexType>
我们亦可以将上面的location属性重新命名成一个新的属性名称employeeLocation,供application schema全体使用,则上面application schema改写如下:
<Element name="Employee" type="ex:EmployeeType" substitutionGroup="gml:_Feature"/>
<element name="employeeLocation" type="gml:PointPropertyType"
SubstitutionGroup="gml:pointProperty"/>
<complexType name="EmployeeType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element name="name" type="string"/>
<element name="age" type="integer"/>
<element name="nickName" type="string" minOccurs="0" maxOccurs="unbounded"/>
<element ref= ex:employeeLocation />
</sequence>
</extension>
</complexContent>
</complexType>
(六)feature集合的编码
feature集合(feature collection)使用featureMember属性来包含多个feature或其它的feature collection。以一个城市模型的feature collection为例,它包含道路及河流等资料,则其可能的GML instance如下:
<CityModel fid="Cm1456">
<dateCreated>Feb 2000</dateCreated>
<gml:featureMember>
<River fid="Rv567">....</River>
</gml:featureMember>
<gml:featureMember>
<River fid="Rv568">....</River>
</gml:featureMember>
<gml:featureMember>
<Road fid="Rd812">....</Road>
</gml:featureMember>
</CityModel>
以下是相对应的application schema,注意其中gml:_Feature Collection及gml:Abstract Feature Collection Type的宣告:
<element name="CityModel" type="ex:CityModelType"
substitutionGroup="gml:_FeatureCollection"/>
<element name="River"type="ex:RiverType"substitutionGroup="gml:_Feature"/>
<element name="Road" type="ex:RoadType"substitutionGroup="gml:_Feature"/>
<complexType name="CityModelType">
<complexContent>
<extension base="gml:AbstractFeatureCollectionType">
<sequence>
<element name="dateCreated" type="month"/>
</sequence>
</extension>
</complexContent>
</ComplexType>
<ComplexType name="RiverType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>....</sequence>
</extension>
</complexContent>
</ComplexType>
<ComplexType name="RoadType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>.....</sequence>
</extension>
</complexContent>
</complexType>
而feature collection中的成员亦可以是储存在远程的feature,其间以Xlink链接。我们同样以上面的城市模型为例,可以在不修改原来的application schema的情况下,加入储存在远程的河流资料,如下:
<CityModel fid="Cm1456">
<dateCreated>Feb 2000</dateCreated>
<gml:featureMember xlink:type="simple"
xlink:href="http://www.myfavoritesite.com/rivers.xml#Rv567"/>
<gml:featureMember xlink:type="simple"
xlink:href="http://www.myfavoritesite.com/rivers.xml#Rv568"/>
<gml:featureMember>
<Road fid="Rd812">....</Road>
</gml:featureMember>
</CityModel>
例中以xlink:href属性指向远程的河流对象。
(七)feature的关联数据的编码
XML文件结构的主要目的,是为了描述资料、及资料内部组成组件间的关系。GML以巢状结构的包含(containment)、及链接(linking)来描述资料间的关系。
以三笔土地(LandParcel)之间的相邻关系为例,以GML编码的instance如下:
<LandParcel fid="Lp2034">
<area>2345</area>
<gml:extentOf>...</extentOf>
<adjacentTo xlink:type="simple" xlink:href="#Lp2035"/>
<adjacentTo xlink:type="simple" xlink:href="#Lp2036"/>
</LandParcel>
....
<LandParcel fid="Lp2035">
<area>9812</area>
<gml:extentOf>...</extentOf>
<AdjacentTo xlink:type="simple" xlink:href="#Lp2034"/>
<adjacentTo xlink:type="simple" xlink:href="#Lp2036"/>
</LandParcel>
....
<LandParcel fid="Lp2036">
<area>8345</area>
<gml:extentOf>...</extentOf>
<adjacentTo xlink:type="simple" xlink:href="#Lp2034"/>
<adjacentTo xlink:type="simple" xlink:href="#Lp2035"/>
</LandParcel>
例中以adjacenTo属性来表示该笔土地与哪一笔土地相邻。上例所对应的application schema如下:
<element name="LandParcel" type="ex:LandParcelType"
substitutionGroup="gml:_Feature"/>
<element name="adjacentTo" type="ex:AdjacentToType"
substitutionGroup="gml:featureMember" />
<complexType name="LandParcelType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element name="area" type="integer"/>
<element ref="gml:extentOf"/>
<element ref="ex:adjacentTo" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="AdjacentToType">
<complexContent>
<restriction base="gml:FeatureAssociationType">
<sequence>
<element ref="ex:LandParcel"/>
</sequence>
</restriction>
</complexContent>
</complexType>
上例亦可以用另一种方式来表现相邻土地之间的关系,我们可以定义一个称为"相邻土地(AdjcentPair)" 的feature type,它有一个"common Boundary Length"属性纪录共同边界的长度,并以"adjacenTo"属性来纪录相邻的土地,以GML编码的案例如下:
<LandParcel fid="Lp2034">
<area>2345</area>
<gml:extentOf>...</extentOf>
</LandParcel>
....
<LandParcel fid="Lp2035">
<area>9812</area>
<gml:extentOf>...</extentOf>
</LandParcel>
....
<AdjacentPair fid="Ad1465">
<commonBoundaryLength>231</commonBoundaryLength>
<adjacentTo xlink:type="simple" xlink:href="#Lp2034"/>
<adjacentTo xlink:type="simple" xlink:href="#Lp2035"/>
</Adjacent>
对应的application schema如下:
<element name="LandParcel" type="ex:LandParcelType"
substitutionGroup="gml:_Feature"/>
<element name="adjacentTo" type="ex:AdjacentToType"
substitutionGroup="gml:featureMember"/>
<element name="AdjacentPair" type="ex:AdjacentPairType"
substitutionGroup="gml:_Feature"/>
<complexType name="LandParcelType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element name="area" type="integer"/>
<element ref="gml:extentOf"/>
<!注意 adjacentTo 已经移除 -->
</sequence>
</extension>
</complexContent>
</ComplexType>
<complexType name="AdjacentToType">
<complexContent>
<Restriction base="gml:FeatureAssociationType">
<sequence>
<element ref="ex:LandParcel"/>
</sequence>
</restriction>
</complexContent>
</complexType>
<complexType name="AdjacentPairType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element name="commonBoundaryLength" type="integer"/>
<element ref="ex:adjacentTo" minOccurs="2" maxOccurs="2"/>
</Sequence>
</extension>
</complexContent>
</complexType>
四、建构应用领域的application schema的规则
为以GML编码来建构某应用领域的数据结构(application schema),以下的规则必须遵循(限于篇幅相关范例请参GML 2.1.1规格书5.2章节内容):
(一)定义新的feature类型
application schema的设计者可以创造自己的feature或feature collection的类型,但必须是GML类型gml:AbstractFeatureType 或gml: Abstract Feature Collection Type的子类型。
(二)定义新的几何图形类型(geometry type)
我们可以依需要创造自己的几何图形类型,但必须是GML类型gml:AbstractGeometryType 或gml:GeometryCollectionType的子类型。
(三)定义新的几何图形的属性(geometry property)
我们可以在上节自己所定义的新几何图形类型中,创造自己的几何图形属性,但必须是gml:GeometryPropertyType的子类型。
(四)宣告target namespace
我们必须为我们的application schema宣告一个target namespace,在schema中所宣告的元素及其类型定义,均位于这个namespace中。Namespace主要用来避免元素名称的冲突,在分布式的网络环境中,不同的XML文件中可能使用了相同名称的元素,宣告适当的namespace可以解决元素名称冲突的问题。特别注意的是namespace中的URI并不需要真正指到schema的文件,它只是一种机制,用来区分不同文件的元素名称。
(五)引进不同namespace的schema
以GML编码的文件,可以从多个不同的namespace引用不同来源的schema,以下图为例:
图4 .使用多个namespace来源的schema
图中schema-A及schema-B位于同一个namespace,所以schema-B使用<<include>>来引进schema-A的内容;schema-A与GML feature schema位于不同的namespace,所以schema-A使用<<import>>来引进GML feature的内容。
(六)使用substitution group
在全域元素(global element)中所定义的"substitution group",可以取代GML元素,并为整个GML application schema所使用。
(七)宣告额外的属性
GML提供了一些预先定义好的几何图形属性(geometric property),包括location、centerLineOf、extentOf等等,我们也可以使用"substitution group"来给它们不同的命名。
(八)定义新的feature关联类型
我们可以创造自己的feature关联类型(feature association type),而这必须由gml:FeatureAssociationType延伸而来。
五、应用领域application schema 的范例
(一)范例一:台北市
说明:有一个城市模型(CityModel)的资料集(feature collection),它有三个属性,分别是几何图形名称为"台北市 、资料生产日期(dateCreated) 为"Feb 2000"、坐标范围(boundedBy)。
本城市模型资料集包含两个feature成员,第一个成员是"淡水河",为河流类型(RiverType),它有一个中心线(cenLineOf) 的几何图形属性。第二个成员是"南京东路",为道路类型(RoadType),它有一个分类属性(classification)为"主要道路"、一个车道数属性(number)为"8"、一个线型的几何图形属性(linearGeometry)。
在本例中第一个feature成员只使用GML标准的属性名称,而第二个feature成员则使用特定的属性名称。
UML图标:
本例中的资料内容及结构以UML描述如下图,图中的城市成员(cityMember)只能是道路(Road)及河流(River),而山丘(Mountain)则不是一个合法的成员。
图5.台北市范例的UML图
Application schema:本范例以GML编码的结果,得到application schema内容如下。
<?xml version="1.0" encoding="BIG5"?>
<!-- File: city.xsd -->
<schema targetNamespace="http://www.opengis.net/examples"
xmlns:ex="http://www.opengis.net/examples"
xmlns:xlink="http://www.w3.org/1999/xlink"
Xmlns:gml="http://www.opengis.net/gml"
xmlns="http://www.w3.org/2000/10/XMLSchema"
elementFormDefault="qualified"
version="2.03">
<annotation>
<appinfo>city.xsd v2.03 2001-02</appinfo>
<documentation >
台北市范例的GML schema
</documentation>
</annotation>
<!-- 引进GML Feature and Geometry schemas的内容 -->
<import namespace="http://www.opengis.net/gml" schemaLocation="feature.xsd"/>
<!-- ==============================================================
全域元素的宣告(global element declarations)
=================================================================== -->
<element name="CityModel" type="ex:CityModelType"
substitutionGroup="gml:_FeatureCollection" />
<element name="cityMember" type="ex:CityMemberType"
substitutionGroup="gml:featureMember"/>
<element name="Road" type="ex:RoadType" substitutionGroup="ex:_CityFeature"/>
<element name="River" type="ex:RiverType" substitutionGroup="ex:_CityFeature"/>
<element name="Mountain" type="ex:MountainType" substitutionGroup="gml:_Feature"/>
<!-- 一个标记,用来限制CityModel collection 中的成员-->
<element name="_CityFeature" type="gml:AbstractFeatureType" abstract="true"
substitutionGroup="gml:_Feature"/>
<!-- ==============================================================
city model中的类型定义的宣告
=================================================================== -->
<ComplexType name="CityModelType">
<complexContent>
<extension base="gml:AbstractFeatureCollectionType">
<sequence>
<element name="dateCreated" type="month"/>
</Sequence>
</extension>
</complexContent>
</ComplexType>
<complexType name="CityMemberType">
<annotation>
<documentation>
以ex:_CityFeature来限定CityModel中的成员
</documentation>
</Annotation>
<complexContent>
<restriction base="gml:FeatureAssociationType">
<sequence minOccurs="0">
<element ref="ex:_CityFeature"/>
</sequence>
<attributeGroup ref="gml:AssociationAttributeGroup"/>
</restriction>
</complexContent>
</complexType>
<complexType name="RiverType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element ref="gml:centerLineOf"/>
</sequence>
</extension>
</complexContent>
</complexType>
e name="RoadType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element name="linearGeometry" type="gml:LineStringPropertyType"/>
<element name="classification" type="string"/>
<element name="number" type="string"/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="MountainType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element name="elevation" type="integer"/>
</sequence>
</extension>
</ComplexContent>
</complexType>
</schema>
依据上述application schema,其XML instance内容如下:
<?xml version="1.0" encoding="BIG5"?>
<CityModel xmlns="http://www.opengis.net/examples"
xmlns:gml="http://www.opengis.net/gml"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/examples city.xsd">
<gml:name>台北市</gml:name>
<gml:boundedBy>
<gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:coord><gml:X>0.0</gml:X><gml:Y>0.0</gml:Y></gml:coord>
<gml:coord><gml:X>100.0</gml:X><gml:Y>100.0</gml:Y></gml:coord>
</gml:Box>
</gml:boundedBy>
<cityMember>
<River>
<gml:description>流经台北市的河流</gml:description>
<gml:name>淡水河</gml:name>
<gml:centerLineOf>
<gml:LineString srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:coord><gml:X>0</gml:X><gml:Y>50</gml:Y></gml:coord>
<gml:coord><gml:X>70</gml:X><gml:Y>60</gml:Y></gml:coord>
<gml:coord><gml:X>100</gml:X><gml:Y>50</gml:Y></gml:coord>
</gml:LineString>
</gml:centerLineOf>
</River>
</cityMember>
<cityMember>
<Road>
<gml:name>南京东路</gml:name>
<linearGeometry>
<gml:LineString srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:coord><gml:X>0</gml:X><gml:Y>5.0</gml:Y></gml:coord>
<gml:coord><gml:X>20.6</gml:X><gml:Y>10.7</gml:Y></gml:coord>
<gml:coord><gml:X>80.5</gml:X><gml:Y>60.9</gml:Y></gml:coord>
</gml:LineString>
</linearGeometry>
<classification>主要道路</classification>
<number>8</number>
</Road>
</cityMember>
<DateCreated>2000-11</dateCreated>
</CityModel>
(二)范例二:学校
说明:有一个国家(State)的资料集(feature collection),它有一个学生人口数(studentPopulation)的属性。
本国家资料集包含两个学区资料集(SchoolDistrict collection)成员,而每个学区资料集也都拥有2个学校(School)或大学(College)成员。
学区(SchoolDistrict)除了名称(name)的属性外,还有一个名为 extentOf 的多边形(polygon)属性。学校(School)除了地址(address)的属性外,还有一个名为 "location" 的点(point)属性。大学(College)除了地址(address)的属性外,还有一个名为"pointProperty"的点(point)属性。
UML图标:
本例中的资料内容及结构以UML描述如下图。
图6.学校范例的UML图
Application schema:本范例以GML编码的结果,application schema内容如下。
<?xml version="1.0" encoding="BIG5"?>
<!-- File: schools.xsd -->
<schema targetNamespace="http://www.opengis.net/examples"
Xmlns:ex="http://www.opengis.net/examples"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:gml="http://www.opengis.net/gml"
xmlns="http://www.w3.org/2000/10/XMLSchema"
elementFormDefault="qualified" version="2.01">
<annotation>
<appinfo>schools.xsd v2.01 2001-02</appinfo>
<documentation >
学校范例的GML schema.
</documentation>
</annotation>
<!--引入GML Feature and Geometry schemas的内容-->
<import namespace="http://www.opengis.net/gml" schemaLocation="feature.xsd"/>
<!-- ==============================================================
全域元素的宣告(global element declarations)
=================================================================== -->
<element name="State" type="ex:StateType" substitutionGroup="gml:_FeatureCollection"/>
<element name="SchoolDistrict" type="ex:SchoolDistrictType"
substitutionGroup="gml:_FeatureCollection"/>
<element name="schoolMember" type="gml:FeatureAssociationType"
substitutionGroup="gml:featureMember"/>
<element name="School" type="ex:SchoolType" substitutionGroup="gml:_Feature"/>
<element name="College" type="ex:CollegeType" substitutionGroup="gml:_Feature"/>
<element name="address" type="string"/>
<!-- ==============================================================
类型的定义
=================================================================== -->
<complexType name="StateType">
<complexContent>
<extension base="gml:AbstractFeatureCollectionType">
<sequence>
<element name="studentPopulation" type="integer"/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="SchoolDistrictType">
<complexContent>
<extension base="gml:AbstractFeatureCollectionType">
<Sequence>
<element ref="gml:extentOf"/>
</sequence>
</Extension>
</complexContent>
</complexType>
<complexType name="SchoolType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element ref="ex:address"/>
<element ref="gml:location"/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="CollegeType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element ref="ex:address"/>
<element ref="gml:pointProperty" />
</sequence>
</extension>
</complexContent>
</complexType>
</schema>
其XML instance内容如下:
<?xml version="1.0" encoding="BIG5"?>
<!-- File: schools.xml -->
<State xmlns="http://www.opengis.net/examples"
xmlns:gml="http://www.opengis.net/gml"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/examples schools.xsd">
<gml:description>
学生人数超过500人的教育机构
</gml:description>
<gml:name>*的学区</gml:name>
<gml:boundedBy>
<gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:coord><gml:X>0</gml:X><gml:Y>0</gml:Y></gml:coord>
<gml:coord><gml:X>50</gml:X><gml:Y>50</gml:Y></gml:coord>
</gml:Box>
</gml:boundedBy>
<gml:featureMember>
<SchoolDistrict>
<gml:name>学区 28</gml:name>
<gml:boundedBy>
<gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:coord><gml:X>0</gml:X><gml:Y>0</gml:Y></gml:coord>
<gml:coord><gml:X>50</gml:X><gml:Y>40</gml:Y></gml:coord>
</gml:Box>
</gml:boundedBy>
<schoolMember>
<School>
<gml:name>大安小学</gml:name>
<address>台北市大安路1号</address>
<gml:location>
<gml:Point srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:coord><gml:X>20.0</gml:X><gml:Y>5.0</gml:Y></gml:coord>
</gml:Point>
</gml:location>
</School>
</schoolMember>
<schoolMember>
<School>
<gml:name>松江国小</gml:name>
<address>台北市松江路1号</address>
<gml:location>
<gml:Point srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:coord><gml:X>40.0</gml:X><gml:Y>5.0</gml:Y></gml:coord>
</gml:Point>
</gml:location>
</School>
</schoolMember>
<gml:extentOf>
<gml:Polygon srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:outerBoundaryIs>
<gml:LinearRing>
<gml:coord><gml:X>0</gml:X><gml:Y>0</gml:Y></gml:coord>
<gml:coord><gml:X>50</gml:X><gml:Y>0</gml:Y></gml:coord>
<gml:coord><gml:X>50</gml:X><gml:Y>40</gml:Y></gml:coord>
<gml:coord><gml:X>0</gml:X><gml:Y>0</gml:Y></gml:coord>
</gml:LinearRing>
</gml:outerBoundaryIs>
</gml:Polygon>
</gml:extentOf>
</SchoolDistrict>
</Gml:featureMember>
<Gml:featureMember>
<SchoolDistrict>
<gml:name>学区32</gml:name>
<gml:boundedBy>
<gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:coord><gml:X>0</gml:X><gml:Y>0</gml:Y></gml:coord>
<gml:coord><gml:X>30</gml:X><gml:Y>50</gml:Y></gml:coord>
</gml:Box>
</gml:boundedBy>
<schoolMember>
<School>
<gml:name>仁爱国小</gml:name>
<address>台北市仁爱路1号</address>
<gml:location>
<gml:Point srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:coord><gml:X>5.0</gml:X><gml:Y>20.0</gml:Y></gml:coord>
</gml:Point>
</gml:location>
</School>
</schoolMember>
<schoolMember xlink:type="simple" xlink:href="http:abc.com">
<College>
<gml:name>*大学</gml:name>
<address>台北市罗斯福路1号</address>
<gml:pointProperty>
<gml:Point srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:coord><gml:X>5.0</gml:X><gml:Y>40.0</gml:Y></gml:coord>
</gml:Point>
</gml:pointProperty>
</College>
</schoolMember>
<gml:extentOf>
<gml:Polygon srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:outerBoundaryIs>
<gml:LinearRing>
<gml:coord><gml:X>0</gml:X><gml:Y>0</gml:Y></gml:coord>
<gml:coord><gml:X>40</gml:X><gml:Y>50</gml:Y></gml:coord>
<gml:coord><gml:X>50</gml:X><gml:Y>50</gml:Y></gml:coord>
<gml:coord><gml:X>0</gml:X><gml:Y>0</gml:Y></gml:coord>
</gml:LinearRing>
</gml:outerBoundaryIs>
</gml:Polygon>
</gml:extentOf>
</SchoolDistrict>
</gml:featureMember>
<studentPopulation>392620</studentPopulation>
</State>
文章来源:http://www.cnblogs.com/mjgforever/archive/2007/11/11/955919.html