新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论SVG, GML, X3D, VRML, VML, XAML, AVALON, Batik等基于XML的图形技术,以及有关GIS的应用。
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - 高级XML应用『 SVG/GML/VRML/X3D/XAML 』 → 地理图形标记语言GML的架构及范例 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 49048 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 地理图形标记语言GML的架构及范例 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     gengwei80 帅哥哟,离线,有人找我吗?
      
      等级:大二期末(数据结构考了98分!)
      文章:57
      积分:450
      门派:XML.ORG.CN
      注册:2006/1/25

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给gengwei80发送一个短消息 把gengwei80加入好友 查看gengwei80的个人资料 搜索gengwei80在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看gengwei80的博客楼主
    发贴心情 地理图形标记语言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为基础的编码标准,将为地理空间信息的管理及资料流通开启一个全新的领域。
     


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/3/6 8:26:00
     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客2
    发贴心情 
    谢谢分享

    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/3/6 10:49:00
     
     多多 美女呀,离线,快来找我吧!
      
      
      等级:大一新生
      文章:11
      积分:99
      门派:XML.ORG.CN
      注册:2005/1/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给多多发送一个短消息 把多多加入好友 查看多多的个人资料 搜索多多在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看多多的博客3
    发贴心情 
    好贴
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/11 16:14:00
     
     多多 美女呀,离线,快来找我吧!
      
      
      等级:大一新生
      文章:11
      积分:99
      门派:XML.ORG.CN
      注册:2005/1/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给多多发送一个短消息 把多多加入好友 查看多多的个人资料 搜索多多在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看多多的博客4
    发贴心情 
    好贴好贴
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/11 16:15:00
     
     crystall 美女呀,离线,快来找我吧!
      
      
      等级:大一(高数修炼中)
      文章:8
      积分:108
      门派:XML.ORG.CN
      注册:2005/1/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给crystall发送一个短消息 把crystall加入好友 查看crystall的个人资料 搜索crystall在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看crystall的博客5
    发贴心情 
    不错,要早看到就好了
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/13 13:47:00
     
     crystall 美女呀,离线,快来找我吧!
      
      
      等级:大一(高数修炼中)
      文章:8
      积分:108
      门派:XML.ORG.CN
      注册:2005/1/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给crystall发送一个短消息 把crystall加入好友 查看crystall的个人资料 搜索crystall在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看crystall的博客6
    发贴心情 
    不错,要早看到就好了
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/13 13:52:00
     
     BrBr520 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:11
      积分:107
      门派:XML.ORG.CN
      注册:2006/2/22

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给BrBr520发送一个短消息 把BrBr520加入好友 查看BrBr520的个人资料 搜索BrBr520在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看BrBr520的博客7
    发贴心情 
    感谢楼主!!!!!!!!!111
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/5/25 9:41:00
     
     magiclove 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:13
      积分:108
      门派:XML.ORG.CN
      注册:2006/5/17

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给magiclove发送一个短消息 把magiclove加入好友 查看magiclove的个人资料 搜索magiclove在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看magiclove的博客8
    发贴心情 

    感谢楼主!!!!!!!!!111

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/7/10 10:53:00
     
     handsom 美女呀,离线,快来找我吧!
      
      
      等级:大一(猛啃高等数学)
      文章:19
      积分:140
      门派:XML.ORG.CN
      注册:2007/8/27

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给handsom发送一个短消息 把handsom加入好友 查看handsom的个人资料 搜索handsom在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看handsom的博客9
    发贴心情 
    辛苦了
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/8/27 17:47:00
     
     handsom 美女呀,离线,快来找我吧!
      
      
      等级:大一(猛啃高等数学)
      文章:19
      积分:140
      门派:XML.ORG.CN
      注册:2007/8/27

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给handsom发送一个短消息 把handsom加入好友 查看handsom的个人资料 搜索handsom在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看handsom的博客10
    发贴心情 
    我很想请教一下,你这里面指的图都到哪里去了
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/9/6 12:24:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/26 6:37:11

    本主题贴数11,分页: [1] [2]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    152.344ms