首页 / 浏览问题 / 组件GIS / 问题详情
SuperMap iObjects C++ 怎么进行自定义范围查询
4EXP 2024年05月07日
Linux系统中,基于SuperMap iObjects C++ 怎么进行自定义范围查询?自己绘制一个面,查询GIS图层中和这个面内的数据。

1个回答

您好,iObjects C++ 组件有提供 UGDatasetVector::Query 接口,设置对应的查询类型为空间查询(相交、包含等),空间查询对象设置给 UGQueryDef 的 m_pElement 属性,详细使用方式可参考 iObjects C++ 组件帮助文档以及示例教程 SuperMap iObjects C++之SQL查询和空间查询_supermap空间查询怎么指定搜索对象-CSDN博客

希望可以帮到您。

2,168EXP 2024年05月07日

使用了以下代码进行查询,但是查询到的结果(UGRecordsetPtr)为空。麻烦帮看一下。

        int nPntCount=points.length();
        
        UGPoint2D *pUGPoint2d = new UGPoint2D[nPntCount];
        if (NULL == pUGPoint2d)
        {
            return false;
        }
        
        for (size_t i = 0; i < nPntCount; i++)
        {
            pUGPoint2d[i].x = points.at(i).x;
            pUGPoint2d[i].y = points.at(i).y;
        }
        
        UGGeoRegion *uRegion=new UGGeoRegion;
        UGbool bAdd = pRegion->Make(pUGPoint2d,nPntCount);
        if (!bAdd)
        {
            delete[] pUGPoint2d;
            pUGPoint2d = NULL;
            return;
        }
        UGQueryDef queryDef;
        
        queryDef.m_nType = UGQueryDef::Contains;
        
        pRegion->ToElement(queryDef.m_pElement);
        UGRecordsetPtr recordset = pDataset->Query(queryDef);
        if(recordset==NULL)
        {
            return false;
        }

从您的代码中没有看到在查询前有对待查询的数据集进行打开,上面提供您的教程中有明确说明需要先打开数据集后才能进行查询。

已确认数据集已经打开,只是代码没有列出。通过bounds可以正常查询,但是自定义范围查询(上面提问的代码)失败。

iObjects C++ 提供了空间查询接口 UGSpatialQuery,建议参考以下逻辑编码进行空间查询

UGSpatialQuery* spatialQuery = new UGSpatialQuery();
UGRecordset* pRecordset = spatialQuery->Query(pDatasetVector1, pGeometry, UGSpatialQuery::UGSpatialQueryMode::UGIntersects);

...