深入FDO----模式覆盖

本文介绍了如何为ODBC、Raster和WMSProvider创建模式覆盖,包括使用FdoIApplySchema命令和FDO配置文件的方法。详细说明了ODBCProvider和RasterProvider在特定情况下的模式覆盖实践。

一般情况下,只有ODBCRasterWMS Provider需要使用模式覆盖,所以本节主要介绍如何为这三种Provider创建模式覆盖。

1.1.1 模式覆盖

使用模式覆盖,FDO应用程序就可以定制逻辑模式和物理存储之间的映射。由于不同的Provider用于支持的不同的数据,不同数据的物理存储格式差异很大,所以模式映射也因Provider而异,例如基于RDBMSProvider要提供要素类和数据库表、属性和数据库表中的列之间的映射,而某些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>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值