一般情况下,只有ODBC、Raster和WMS Provider需要使用模式覆盖,所以本节主要介绍如何为这三种Provider创建模式覆盖。
1.1.1 模式覆盖
使用模式覆盖,FDO应用程序就可以定制逻辑模式和物理存储之间的映射。由于不同的Provider用于支持的不同的数据,不同数据的物理存储格式差异很大,所以模式映射也因Provider而异,例如基于RDBMS的Provider要提供要素类和数据库表、属性和数据库表中的列之间的映射,而某些Provider与数据库表和列毫无关系。当然,有些Provider并不支持模式覆盖,这时它总是使用默认的模式映射。
使用FdoIDescribeSchemaMapping命令可以描述当前FDO连接的模式映射,但是FDO并没有提供命令来修改或应用新的模式映射,即进行模式覆盖,但是用户可以通过如下两种方式之一实现模式覆盖。
1) 使用FdoIApplySchema命令
命令FdoIApplySchema不仅可以用来创建和修改模式,而且还可以为模式指定模式映射。FDO使用类FdoPhysicalSchemaMapping代表某个模式的模式映射,调用方法FdoIApplySchema::SetPhysicalMapping(...)就可以设置模式的模式映射。支持模式覆盖的Provider都提供了一些特有的API用于创建FdoPhysicalSchemaMapping的实例,事实上这些API正是Provider API最大的不同之处,调用方法FdoIApplySchema::SetPhysicalMapping(...)就可以设置模式的模式映射。
// 创建ApplySchema命令 FdoPtr<FdoIApplySchema> sampleApplySchema = (FdoIApplySchema *) connection->CreateCommand(FdoCommandType_ApplySchema); // 创建要素模式 FdoPtr<FdoFeatureSchema> sampleFeatureSchema = FdoFeatureSchema::Create(L"SampleFeatureSchema", L"要素模式描述"); // 为此模式添加类和属性 ...... // 创建模式映射,得到一个FdoPhysicalSchemaMapping的实例schemaMapping ...... sampleApplySchema->SetPhysicalMapping(schemaMapping); // 执行命令,创建模式和模式映射 sampleApplySchema->Execute(); |
2) 使用FDO配置文件
创建一个XML格式的配置文件,在配置文件中指定模式映射,最后调用方法FdoIConnection::SetConfiguration(...)设置配置文件,从而应用新的模式映射。主要注意的是,调用方法FdoIConnection::SetConfiguration(...)时FDO连接必须是关闭的。
给定一个配置文件“config.xml”,如下的代码展示了如何覆盖默认的模式映射。
// 读取文件config.xml FdoIoFileStreamP fileStream = FdoIoFileStream::Create(L"config.xml", L"r"); // 设置模式映射 connection->SetConfiguration(fileStream); // 打开FDO连接 connection->SetConnectionString(...); connection->Open(); |
需要注意的是,配置文件中不仅包含了模式映射信息,而且还包含了空间上下文和模式信息,因为模式映射信息依赖于空间上下文和模式信息。
1.1.2 ODBC Provider的模式覆盖
ODBC Provider主要用于读取存储在RDBMS数据库中的点数据。默认情况下,ODBC Provider会将数据库中的一个表映射为FDO中一个同名的类,表中的每一列映射为FDO类中一个同名的属性。如果一个表中有名称为“X”、“Y”、“Z”的列或“Lon”、“Lan”的列,那么这些列会被映射为一个类型为点、名称为“Geometry”的几何属性。其中,列“Z”不是必需的。
默认的模式映射一般可以满足大部分的需求,但是如果想把表中名称不是“X”、“Y”、“Z”或“Lon”、“Lan”的列映射为一个点类型的几何属性,那么就需要使用模式覆盖。
给定RDBMS中的一个名称为“Cities”的表,这个表包含了四个列“CITY_ID”、“NAME”、“POS_X”和“POS_Y”,默认的模式映射不会将列“POS_X”和“POS_Y”映射为点类型的几何属性。通过应用如下的配置文件,可以将列“POS_X”和“POS_Y”映射为点类型的几何属性。
<?xml version="1.0" encoding="UTF-8"?> <fdo:DataStore xmlns:xs=http://www.w3.org/2001/XMLSchema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:fdo="http://fdo.osgeo.org/schemas" xmlns:fds="http://fdo.osgeo.org/schemas/fds"> <gml:DerivedCRS gml:id="Default"> <gml:metaDataProperty> <gml:GenericMetaData> <fdo:XYTolerance>0.001000</fdo:XYTolerance> <fdo:ZTolerance>0.001000</fdo:ZTolerance> </gml:GenericMetaData> </gml:metaDataProperty> <gml:remarks>Default Database Spatial Context</gml:remarks> <gml:srsName>Default</gml:srsName> <gml:validArea> <gml:boundingBox> <gml:pos>-2000000.000000 -2000000.000000</gml:pos> <gml:pos>2000000.000000 2000000.000000</gml:pos> </gml:boundingBox> </gml:validArea> <gml:baseCRS xlink:href="http://fdo.osgeo.org/crs#default_cartesian" /> <gml:definedByConversion xlink:href="http://fdo.osgeo.org/coord_conversions#identity" /> <gml:derivedCRSType codeSpace="http://fdo.osgeo.org/crs_types"> geographic </gml:derivedCRSType> <gml:usesCS xlink:href="http://fdo.osgeo.org/cs#default_cartesian" /> </gml:DerivedCRS> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://fdo.osgeo.org/schemas/feature/Fdo" xmlns:fdo="http://fdo.osgeo.org/schemas" xmlns:gml="http://www.opengis.net/gml" xmlns:Fdo="http://fdo.osgeo.org/schemas/feature/Fdo" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:annotation> <xs:documentation /> </xs:annotation> <xs:element name="Cities" type="Fdo:CitiesType" abstract="false" substitutionGroup="gml:_Feature"> <xs:key name="CitiesKey"> <xs:selector xpath=".//Cities" /> <xs:field xpath="CITY_ID" /> </xs:key> </xs:element> <xs:complexType name="CitiesType" abstract="false" fdo:geometryName="Geometry"> <xs:annotation> <xs:documentation /> </xs:annotation> <xs:complexContent> <xs:extension base="gml:AbstractFeatureType"> <xs:sequence> <xs:element name="CITY_ID" minOccurs="0"> <xs:simpleType> <xs:restriction base="fdo:int16" /> </xs:simpleType> <xs:annotation> <xs:documentation /> </xs:annotation> </xs:element> <xs:element name="NAME" minOccurs="0"> <xs:annotation> <xs:documentation /> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="255" /> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="Geometry" type="gml:AbstractGeometryType" fdo:hasMeasure="false" fdo:hasElevation="false" fdo:srsName="Default" fdo:geometricTypes="point " fdo:geometryTypes="point "> <xs:annotation> <xs:documentation /> </xs:annotation> </xs:element> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> </xs:schema> <SchemaMapping xmlns:rdb=http://fdordbms.osgeo.org/schemas xmlns="http://fdoodbc.osgeo.org/schemas" provider="OSGeo.ODBC.3.5" name="Fdo"> <complexType name="CitiesType"> <Table name="Cities" /> <element name="CITY_ID"> <Column name="CITY_ID" /> </element> <element name="NAME"> <Column name="NAME" /> </element> <element name="Geometry" GeometricContentType="Ordinates" xColumnName="POS_X" yColumnName="POS_Y" /> </complexType> </SchemaMapping> </fdo:DataStore> |
配置文件中,元素<SchemaMapping>用于设置模式映射,它将表“Cities”映射为要素类“Cities”,将列“CITY_ID”、“NAME”映射为同名的属性,将列“POS_X”和“POS_Y”映射为名称为“Geometry”的几何属性。当然,在模式映射时,可以将表和列映射为不同名称的要素类和属性。
1.1.3 Raster Provider的模式覆盖
Raster Provider主要用于读取各种类型的栅格数据。默认情况下,如果连接到一个文件夹, Raster Provider会将文件夹下不同类型、不同坐标系的栅格图像映射到不同的类,第一个类的名称为“default”,其它类的名称为“defaultN”,其中“N”为一个递增的整数;如果连接到一个文件,Raster Provider会将此文件映射到一个名称为“default”的类。
默认的模式映射一般可以满足大部分的需求,但是如果图像中没有包含坐标系名称、图像的位置、X轴和Y轴的旋转角度,或需要将多张图像组成一张多通道的图像,那么就需要使用模式覆盖。
假设文件夹“C:/raster”下有一个JPG格式的栅格文件“Sunset.jpg ”,JPG格式的栅格文件不包含坐标系名称和图像位置信息,通过应用如下的配置文件,可以其映射为要素类“Sunset”中的一个要素,并且为这张图像指定了位置和旋转角度。
<?xml version="1.0" encoding="UTF-8"?> <fdo:DataStore xmlns:xs=http://www.w3.org/2001/XMLSchema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:fdo="http://fdo.osgeo.org/schemas" xmlns:fds="http://fdo.osgeo.org/schemas/fds"> <gml:DerivedCRS gml:id="EPSG:26710"> <gml:metaDataProperty> <gml:GenericMetaData> <fdo:XYTolerance>0.001000</fdo:XYTolerance> <fdo:ZTolerance>0.001000</fdo:ZTolerance> </gml:GenericMetaData> </gml:metaDataProperty> <gml:remarks>System generated default FDO Spatial Context </gml:remarks> <gml:srsName>EPSG:26710</gml:srsName> <gml:validArea> <gml:boundingBox> <gml:pos>531705.000000 4483125.000000</gml:pos> <gml:pos>542355.000000 4497045.000000</gml:pos> </gml:boundingBox> </gml:validArea> <gml:baseCRS xlink:href="http://fdo.osgeo.org/schemas/feature/crs/#EPSG:26710" /> <gml:definedByConversion xlink:href="http://fdo.osgeo.org/coord_conversions#identity" /> <gml:derivedCRSType codeSpace="http://fdo.osgeo.org/crs_types"> geographic </gml:derivedCRSType> <gml:usesCS xlink:href="http://fdo.osgeo.org/cs#default_cartesian" /> </gml:DerivedCRS> <xs:schema xmlns:xs=http://www.w3.org/2001/XMLSchema targetNamespace="http://fdo.osgeo.org/schemas/feature/rasters" xmlns:fdo="http://fdo.osgeo.org/schemas" xmlns:gml="http://www.opengis.net/gml" xmlns:rasters="http://fdo.osgeo.org/schemas/feature/rasters" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="Sunset" type="rasters:SunsetType" abstract="false" substitutionGroup="gml:_Feature"> <xs:key name="SunsetKey"> <xs:selector xpath=".//Sunset" /> <xs:field xpath="Id" /> </xs:key> </xs:element> <xs:complexType name="SunsetType" abstract="false" fdo:hasGeometry="false"> <xs:complexContent> <xs:extension base="gml:AbstractFeatureType"> <xs:sequence> <xs:element name="Id"> <xs:annotation> <xs:documentation /> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="256" /> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="Image" type="fdo:RasterPropertyType" fdo:defaultImageXSize="200" fdo:defaultImageYSize="200" fdo:srsName="EPSG:26710"> <xs:annotation> <xs:appinfo source="http://fdo.osgeo.org/schemas"> <fdo:DefaultDataModel dataModelType="Unknown" dataType="Unknown" organization="Row" bitsPerPixel="32" tileSizeX="128" tileSizeY="128" /> </xs:appinfo> </xs:annotation> </xs:element> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> </xs:schema> <SchemaMapping provider="Autodesk.Raster.3.5" name="rasters" xmlns="http://www.autodesk.com/isd/fdo/RasterFileProvider"> <complexType name="SunsetType"> <RasterDefinition name="rasters"> <Location name="C:/raster"> <Feature name="Sunset.jpg"> <Band name="RGB" number="1"> <Image name="Sunset.jpg" frame="1"> <Georeference> <InsertionPointX>627759</InsertionPointX> <InsertionPointY>5859750</InsertionPointY> <ResolutionX>63.5492708333333</ResolutionX> <ResolutionY>67.5188541666667</ResolutionY> <RotationX>0.24311563815655</RotationX> <RotationY>0.24311563815655</RotationY> </Georeference> </Image> </Band> </Feature> </Location> </RasterDefinition> </complexType> </SchemaMapping> </fdo:DataStore> |
1.1.4 WMS Provider的模式覆盖
WMS为访问栅格格式的地图数据定义了一个简单的HTTP接口,一个WMS请求定义了访问的图层和区域,响应结果是一张或多张栅格图像。这些接口还支持将多个图层组合在一起,指定返回图像的格式、背景色等信息。WMS Provider就是用于读取WMS服务器发布的栅格地图数据。
默认情况下,WMS Provider会将每个WMS图层映射为一个要素类,使用PNG格式的图像返回地图图像数据。如果想将多个图层组合在一起,指定返回图像的格式、背景色等信息,那么就需要使用模式覆盖。
假设我们打算连接到WMS服务器http://wms.jpl.nasa.gov/wms.cgi,通过应用如下的配置文件,可以将WMS图层WMS_Schema:global_mosaic和WMS_Schema:global_mosaic_base组合在一起,映射为类global_mosaic,并且设置WMS服务器返回PNG格式的图像。<Layer>元素的顺序会决定WMS图层的组合顺序,在下面的配置文件中图层WMS_Schema:global_mosaic位于图层WMS_Schema:global_mosaic_base的上方。
<?xml version="1.0" encoding="UTF-8"?> <fdo:DataStore xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml=http://www.opengis.net/gml xmlns:fdo="http://fdo.osgeo.org/schemas" xmlns:fds="http://fdo.osgeo.org/schemas/fds"> <gml:DerivedCRS gml:id="EPSG:4326"> <gml:metaDataProperty> <gml:GenericMetaData> <fdo:XYTolerance>0.001000</fdo:XYTolerance> <fdo:ZTolerance>0.001000</fdo:ZTolerance> </gml:GenericMetaData> </gml:metaDataProperty> <gml:srsName>EPSG:4326</gml:srsName> <gml:validArea> <gml:boundingBox> <gml:pos>-180.000000 -90.000000</gml:pos> <gml:pos>180.000000 90.000000</gml:pos> </gml:boundingBox> </gml:validArea> <gml:baseCRS xlink:href="http://fdo.osgeo.org/schemas/feature/crs/#EPSG:4326" /> <gml:definedByConversion xlink:href="http://fdo.osgeo.org/coord_conversions#identity" /> <gml:derivedCRSType codeSpace="http://fdo.osgeo.org/crs_types"> geographic </gml:derivedCRSType> <gml:usesCS xlink:href="http://fdo.osgeo.org/cs#default_cartesian" /> </gml:DerivedCRS> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://fdo.osgeo.org/schemas/feature/WMSLayers" xmlns:fdo="http://fdo.osgeo.org/schemas" xmlns:gml="http://www.opengis.net/gml" xmlns:WMSLayers="http://fdo.osgeo.org/schemas/feature/WMSLayers" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="global_mosaic" type="WMSLayers:global_mosaicType" abstract="false" substitutionGroup="gml:_Feature"> <xs:key name="global_mosaicKey"> <xs:selector xpath=".//global_mosaic" /> <xs:field xpath="Id" /> </xs:key> </xs:element> <xs:complexType name="global_mosaicType" abstract="false" fdo:hasGeometry="false"> <xs:annotation> <xs:documentation>WMS Global Mosaic, pan sharpened</xs:documentation> </xs:annotation> <xs:complexContent> <xs:extension base="gml:AbstractFeatureType"> <xs:sequence> <xs:element name="Id"> <xs:annotation> <xs:documentation /> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="256" /> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="Image" type="fdo:RasterPropertyType" fdo:defaultImageXSize="1024" fdo:defaultImageYSize="1024" fdo:srsName="EPSG:4326" /> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> </xs:schema> <SchemaMapping provider="OSGeo.WMS.3.5" name="WMSLayers" xmlns="http://fdowms.osgeo.org/schemas"> <complexType name="global_mosaicType"> <RasterDefinition name="Image"> <Format>PNG</Format> <FormatType>image/png</FormatType> <Transparent>true</Transparent> <UseTileCache>false</UseTileCache> <BackgroundColor> </BackgroundColor> <Time> </Time> <Elevation> </Elevation> <SpatialContext>EPSG:4326</SpatialContext> <Layer name="WMS_Schema:global_mosaic" /> <Layer name="WMS_Schema:global_mosaic_base" /> </RasterDefinition> </complexType> </SchemaMapping> </fdo:DataStore> |