一般情况下,如果一个要素类包含一个几何属性,那么它就有一个相关联的空间上下文(Spatial Context),通过这个关联的空间上下文,可以得知要素类中每个几何属性所使用的坐标系信息,例如坐标系名称、坐标的容差值、范围、范围类型等信息,如下的代码展示了如何获得一个要素类所关联的空间上下文名称。
function getSpatialContextName($classDef) { $spatialContextName = “Unknown”; $props = $classDef->GetProperties(); $propCount = $props->GetCount(); for($i=0; $i<$propCount; $i++) { $propDef = $props->GetItem($i); $propertyType = $propDef->GetPropertyType(); if ($propertyType = MgPropertyType::Feature) { $spatialContextName = $propDef->SetSpatialContextAssociation(); break; } } return $spatialContextName; } |
当知道空间上下文的名称之后,如何得到该空间上下文的信息,例如坐标系名称、坐标的容差值、范围、范围类型等,这就需要调用方法MgFeatureService::GetSpatialContexts(…)来描述空间上下文,该方法的签名如下所示。
MgSpatialContextReader GetSpatialContexts( MgResourceIdentifier resource, bool bActiveOnly); |
参数resource用于指定一个要素源,参数bActiveOnly为True的话,只返回要素源中活动的空间上下文,如果为False,那么返回要素源中所有的空间上下文。该方法的返回值是一个MgSpatialContextReader对象,通过这个空间上下文读取器对象可以得到空间上下文的坐标系名称、坐标的容差值、范围、范围类型等,类MgSpatialContextReader的主要方法及其描述如表10‑18所示。
方法 | 描述 |
string GetCoordinateSystem(); | 获得当前空间上下文的坐标系名称。 |
string GetCoordinateSystemWkt(); | 获得当前空间上下文WKT格式的坐标系名称。 |
string GetDescription(); | 获得当前空间上下文的描述信息。 |
MgByteReader GetExtent(); | 获取当前空间上下文的范围。 |
int GetExtentType(); | 获取当前空间上下文的范围类型,范围类型可以为: l MgSpatialContextExtentType::scDynamic:动态的 l MgSpatialContextExtentType::scStatic:静态的 随着插入和删除要素数据,动态类型的空间上下文范围会自动重新进行计算;而静态类型的空间上下文范围必须在创建之时指定,它不会随着要素数据的插入和删除发生变化。 |
string GetName(); | 获取当前空间上下文的名称。 |
double GetXYTolerance(); | 获取当前空间上下文的X坐标值的容差值。 |
double GetZTolerance(); | 获取当前空间上下文的Y坐标值的容差值。 |
bool IsActive(); | 检验当前空间上下文是否为活动的空间上下文。 |
表 10‑18 类MgSpatialContextReader的主要方法及其描述
下面的代码展示了将MgSpatialContextReader对象中所有空间上下文的信息输出到一个文件。
function printSpatialContextReader($spatialContextReader) { global $agfReaderWriter; global $logFileHandle; while ($spatialContextReader->ReadNext()) { $name = $spatialContextReader->GetName(); if ($name == NULL) $name = "null";
fwrite($logFileHandle, "Spatial Context Name: "$name"n"); $description = $spatialContextReader->GetDescription(); if ($description == NULL) $description = "null";
fwrite($logFileHandle, "Description: "$description"n"); $coordSysName = $spatialContextReader->GetCoordinateSystem(); if ($coordSysName == NULL) $coordSysName = "null";
fwrite($logFileHandle, "Coordinate System Name: "$coordSysName"n"); $coordSysWkt = $spatialContextReader->GetCoordinateSystemWkt(); if ($coordSysWkt == NULL) $coordSysWkt = "null";
fwrite($logFileHandle, "Coordinate System WKT: "$coordSysWkt"n"); $extentType = $spatialContextReader->GetExtentType(); fwrite($logFileHandle, "Extent Type: " . printExtentType($extentType) . "n"); $extentByteReader = $spatialContextReader->GetExtent(); if ($extentByteReader == NULL) { fwrite($logFileHandle, "MgSpatialContextReader::GetExtent() returned a NULL objectn"); } else { $extentGeometry = $agfReaderWriter->Read($extentByteReader); printAGeometry($extentGeometry); } $XYTolerance = $spatialContextReader->GetXYTolerance(); fwrite($logFileHandle, "XY Tolerance: $XYTolerancen"); $ZTolerance = $spatialContextReader->GetZTolerance(); fwrite($logFileHandle, "Z Tolerance: $ZTolerancen"); $isActive = $spatialContextReader->IsActive(); fwrite($logFileHandle, "Is Active: " . prtBool($isActive) . "n"); } } ?> |