要素服务之空间上下文

一般情况下,如果一个要素类包含一个几何属性,那么它就有一个相关联的空间上下文(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用于指定一个要素源,参数bActiveOnlyTrue的话,只返回要素源中活动的空间上下文,如果为False,那么返回要素源中所有的空间上下文。该方法的返回值是一个MgSpatialContextReader对象,通过这个空间上下文读取器对象可以得到空间上下文的坐标系名称、坐标的容差值、范围、范围类型等,类MgSpatialContextReader的主要方法及其描述如1018所示。

方法

描述

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();

检验当前空间上下文是否为活动的空间上下文。

1018 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");

}

}

?>

你可能感兴趣的:(活动)