地理图形标记语言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>

 

 

六、结论

    由上述范例可以看到,GML的编码极富弹性,无论是复杂的资料群组关系或分布式的资料储存,均可轻易应付,本文中所探讨的GML架构及范例,系针 对GML 2.1.1版(目前最新的正式版本),限定在平面的几何图形,在不久的将来,将会扩展至3D的几何图形及位相资料,则它处理图形的能力将更为强大,GML 这种以XML为基础的编码标准,将为地理空间信息的管理及资料流通开启一个全新的领域。

 

转自:http://www.xml.org.cn/dispbbs.asp?BoardID=21&ID=28157&replyID=25073&skin=1

posted @ 2010-04-15 20:46  完赐  阅读(2372)  评论(0编辑  收藏  举报