–小诗
条件查询查询矢量数据集中满足给定条件的所有集合对象记录,其中条件使用标准的SQL语句,查询返回的结构为满足要求的记录集。
下面示例如何通过SQL表达式查询出某矢量数据集中满足条件的对象记录集。
SQL查询要点:
1.打开要查询数据所在的工作空间。
2.获得被查询矢量数据集所在的数据源。
3.获得被查询的矢量数据集,并且需要打开该数据集,否则无法进行查询。
4.构建查询参数对象(UGQueryDef),并通过接口UGQueryDef-> strFilter设置查询条件以及其他查询参数。
5.通过接口UGDatasetVector->Query执行查询,满足符合要求的对象记录集。
void SampleRun::SqlQuery()
{
//打开工作空间
OpenWorkspace();
//获取第一个数据源
UGDataSource *pDataSource = m_pWorkspace->GetDataSource(0);
//获取名称为“Countries”的矢量数据集用于查询
UGDataset *pDataset = pDataSource->GetDataset(_U("Countries"));
//强制类型转换
UGDatasetVector *pDatasetVector = dynamic_cast<UGDatasetVector*>( pDataset);
//判断数据集是否打开,没有打开则打开数据集
if (!pDatasetVector->IsOpen())
{
pDatasetVector->Open();
}
//查询条件设置
UGQueryDef queryDef;
//查询条件
queryDef.m_strFilter = _U("SmID<10");
//只查属性信息
queryDef.m_nOptions = OgdcQueryDef::Attribute;
//内部维护,无需释放该对象
UGRecordset *pUGRecodrset = pDatasetVector->Query(queryDef);
m_pWorkspace->Close();
Bounds查询要点
对于数据集的bounds指的是数据集中包含所有对象的最小外接矩形。对于矢量数据集来说,为数据集中所有对象的最小外接矩形;对于栅格,为当前栅格或影像的地理范围。一般获得数据集的bounds后可以用来进行数据在地图中的全幅显示,或者基于数据集的bounds进行空间范围查询。
下面示例使用矢量数据集的bounds最为空间查询范围,查询处于该范围内容的其他数据集中的对象。
要点:
1.打开要查询数据所在的工作空间。
2.获得被查询和作为查询范围的矢量数据集所在的数据源(本例中被查询和作为查询范围的数据集为同一数据集)。
3.获得被查询的矢量数据集,并且需要打开该数据集,否则无法进行查询。
4.获得作为查询条件的数据集的bounds,通过该bounds获得查询空间范围大小。
5.构建查询参数对象(UGQueryDef),并通过接口UGQueryDef::GeneralQuery 设置查询方式为空间查询;通过接口UGQueryDef::Bounds设置查询类型为地理矩形范围;通过接口UGQueryDef。m_rc2Bounds设置空间查询的范围。
6.通过接口UGDatasetVector->Query执行查询,满足符合要求的对象记录集。
void SampleRun::SpatialQuery()
{
//打开工作空间
OpenWorkspace();
//获取第一个数据源
UGDataSource *pDataSource = m_pWorkspace->GetDataSource(0);
//获取名称为“Countries”的矢量数据集用于查询
UGDataset *pDataset = pDataSource->GetDataset(_U("Countries"));
//强制类型转换
UGDatasetVector *pDatasetVector = dynamic_cast<UGDatasetVector*>( pDataset);
//判断数据集是否打开,没有打开则打开数据集
if (!pDatasetVector->IsOpen())
{
pDatasetVector->Open();
}
//获取Bounds
UGRect2D bounds = pDatasetVector->GetBounds();
//缩小到一半
bounds.Deflate(bounds.Width()/4,bounds.Height()/4);
//对矩形进行规范化
bounds.Normalize();
//查询条件设置
UGQueryDef queryDef;
//查询类型为地理矩形范围
queryDef.m_nType = UGQueryDef::Bounds;
//查询模式为一般查询
queryDef.m_nMode = UGQueryDef::GeneralQuery;
//查询几何和属性
queryDef.m_nOptions = UGQueryDef::Both;
//查询范围
queryDef.m_rc2Bounds = bounds;
//设置游标类型为动态游标
queryDef.m_nCursorType = UGQueryDef::OpenDynamic;
//内部维护,无需释放该对象
UGRecordset *pUGRecodrset = pDatasetVector->Query(queryDef);
m_pWorkspace->Close();