-- 作者:gengwei80
-- 发布时间:3/6/2006 8:26:00 AM
-- 地理图形标记语言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为基础的编码标准,将为地理空间信息的管理及资料流通开启一个全新的领域。
|