空间上下文定义了存储和操作几何数据所需的属性,例如坐标系、坐标容差等。FDO定义了FdoIActivateSpatialContext、FdoICreateSpatialContext、FdoIDestroySpatialContext和FdoIGetSpatialContexts四个命令分别用于设置当前活动的空间上下文、创建一个空间上下文、销毁一个空间上下文和获取空间上下文及其相关信息。目前,所有的Provider都支持FdoIGetSpatialContexts,ArcSDE、MySQL、Oracle、SQL Server支持FdoICreateSpatialContext和FdoIDestroySpatialContext命令,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)不是等价的。但是,这种关系不具有传递性。如果点A和B是等价的,点B和C是等价的,这并不意味着点A和C是等价的。
如下的代码展示了如何获取空间上下文及其相关信息。
// 假设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(); } } |