深入FDO----管理空间上下文

空间上下文定义了存储和操作几何数据所需的属性,例如坐标系、坐标容差等。FDO定义了FdoIActivateSpatialContextFdoICreateSpatialContextFdoIDestroySpatialContextFdoIGetSpatialContexts四个命令分别用于设置当前活动的空间上下文、创建一个空间上下文、销毁一个空间上下文和获取空间上下文及其相关信息。目前,所有的Provider都支持FdoIGetSpatialContextsArcSDEMySQLOracleSQL Server支持FdoICreateSpatialContextFdoIDestroySpatialContext命令,SDF支持FdoICreateSpatialContext,但不支持FdoIDestroySpatialContext

一个空间上下文由以下内容组成:

l 名称

空间上下文的名称,用于标识数据源中一个空间上下文。

l 描述

空间上下文的描述信息。

l 坐标系

空间上下文所使用的坐标系的名称。一般情况下,这是一个Mentor格式的坐标系名称。

l WKT格式坐标系:

空间上下文所使用的坐标系对应的WKT字符串。

l 范围

范围表示几何数据所在空间区域,它是一个矩形或立方体,由左下角坐标和右上角坐标两个坐标点所定义。

l 范围类型

范围类型有两种:动态范围和静态范围。动态范围会随着插入、修改、删除几何数据自动重新进行计算,而静态类型的范围必须在创建空间上下文之时指定,它不会随着要素数据的插入和删除发生变化。

l 容差

容差用于决定两个坐标点是否足够近,在进行计算的时候可以考虑为两个完全相同的坐标点。在FDO中,容差不是通过两个点间的直线距离来衡量的,而是通过比较坐标值在各个轴上的值来衡量的。在多数情况下,比较使用的是小于等于操作符,而不是小于操作符。假设X轴和Y轴的容差值都为0.05,坐标点B(1.0, 1.0)和坐标点A(0.96, 0.96)、坐标点A(1.04, 1.04)认为是等价的,而和坐标点D(0.96, 0.94)、坐标点E(1.04, 1.06)不是等价的。但是,这种关系不具有传递性。如果点AB是等价的,点BC是等价的,这并不意味着点AC是等价的。

如下的代码展示了如何获取空间上下文及其相关信息。

// 假设conn是一个已经打开的FDO连接对象

FdoPtr<FdoIGetSpatialContexts> gscCmd =

(FdoIGetSpatialContexts*)conn->CreateCommand(FdoCommandType_GetSpatialContexts);

// 如果只想得到当前活动的空间上下文,请不要注释下面的语句

// gscCmd->SetActiveOnly();

// 执行命令,得到空间上下文读取器

FdoPtr<FdoISpatialContextReader> reader = gscCmd->Execute();

// 遍历空间上下文读取器

while ( reader->ReadNext() ) {

FdoStringP name = reader->GetName();

FdoStringP desc = reader->GetDescription();

FdoStringP cs = reader->GetCoordinateSystem();

FdoStringP csWkt = reader->GetCoordinateSystemWkt();

FdoSpatialContextExtentType extentType = reader->GetExtentType();

FdoPtr<FdoByteArray> ext = reader->GetExtent();

double xyTol = reader->GetXYTolerance();

double zTol = reader->GetZTolerance();

bool isActive = reader->IsActive();

}

一般情况下,几何属性或栅格属性有一个关联的空间上下文,调用FdoGeometricPropertyDefinition:: GetSpatialContextAssociation()FdoRasterPropertyDefinition:: GetSpatialContextAssociation()可以得到关联空间上下文的名称。

给定一个几何属性,如下的代码展示了如何得到这个几何属性使用的坐标系名称。

// 假设geomPropDef是一个FdoGeometricPropertyDefinition实例

// 得到几何属性geomPropDef所关联的空间上下文的名称

FdoStringP scName = geomPropDef->GetSpatialContextAssociation();

// 创建FDO命令

FdoPtr<FdoIGetSpatialContexts> gscCmd =

(FdoIGetSpatialContexts*)conn->CreateCommand(FdoCommandType_GetSpatialContexts);

// 执行命令,得到空间上下文读取器

FdoPtr<FdoISpatialContextReader> reader = gscCmd->Execute();

// 遍历空间上下文读取器

while ( reader->ReadNext() ) {

if (scName == reader->GetName()) {

// 得到几何属性使用的坐标系名称

FdoStringP cs = reader->GetCoordinateSystem();

FdoStringP csWkt = reader->GetCoordinateSystemWkt();

}

}

你可能感兴趣的:(oracle,mysql,SQL Server,ext,活动)