ExecuteSQL

#include "stdafx.h"
#include "ics_case_func_test.h"
#include "gdal_priv.h"
#include "ogrsf_frmts.h"
#include "ogrsf_frmts/shape/ogrshape.h"
#include "ics_config.h"

#define DYZ_DEBUG_SWITCH "ON"
#define DYZ_TEST_DATA_PATH "D:\\code\\gdal-2.3.0\\data\\"
#define DYZ_TEST_FILE_PATH  "D:\\code\\gdal-2.3.0\\x64\\Debug\\"
//#define DYZ_TEST_DWG_FILE   DYZ_TEST_FILE_PATH "shuangqumianchilun.shp"
//#define DYZ_TEST_DWG_FILE   DYZ_TEST_FILE_PATH "tuku.shp"
#define DYZ_TEST_DWG_FILE   DYZ_TEST_FILE_PATH  "sanshierting.shp"

int ics_case_main(int argc, char** argv)
{
    GDALAllRegister();

    CPLSetConfigOption("CPL_DEBUG", DYZ_DEBUG_SWITCH);
    CPLSetConfigOption("GDAL_DATA", DYZ_TEST_DATA_PATH);
    CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
    CPLSetConfigOption("SHAPE_ENCODING", "CP936");

    const char*  FilePath = DYZ_TEST_DWG_FILE;
    GDALDatasetH hInDS = GDALOpenEx(DYZ_TEST_DWG_FILE, GDAL_OF_VECTOR | GDAL_OF_VERBOSE_ERROR, nullptr, nullptr, nullptr);
    OGRShapeDataSource* cInDS = (OGRShapeDataSource*)(hInDS);
    if (NULL == cInDS)
    {
        return -1;
    }

    int nLayerCnt = cInDS->GetLayerCount();
    int nLayerIdx = 0;
    for (;nLayerIdx < nLayerCnt; ++nLayerIdx)
    {
        std::string strStatement = "select * from ";
        std::string shpFileName = FilePath;
        size_t startPos = shpFileName.rfind("\\", -1);
        size_t endPos = shpFileName.rfind(".shp",-1);

        shpFileName = shpFileName.substr(startPos+1, endPos - startPos - 1);
        strStatement += shpFileName;
        strStatement += "  where Text = '111'";
        OGRGeometry *poSpatialFilter = NULL;
        const char *pszDialect = NULL;
#if 1    
        OGRLayer* curLayer = cInDS->ExecuteSQL(strStatement.c_str(),poSpatialFilter, pszDialect);
#else    
        OGRLayer* curLayer = cInDS->GetLayer(nLayerIdx);
#endif
        OGRFeature * ftr = NULL;
        while (ftr = curLayer->GetNextFeature())
        {
            GIntBig fid = ftr->GetFID();
            if (130 == fid)
            {
                CPLDebug(__FUNCTION__, " fid:%d", fid);
            }

            OGRGeometry * poGeom = ftr->GetGeometryRef();
            switch (wkbFlatten(poGeom->getGeometryType()))
            {
            case wkbLineString:
            {
                OGRLineString* poLS = static_cast<OGRLineString*>(poGeom);
                const  char* pGeoName = poLS->getGeometryName();
                if (NULL != pGeoName)
                {
                    CPLDebug(__FUNCTION__, " Geo name:%s", pGeoName);
                }
                int iPnum = poLS->getNumPoints();
                CPLDebug(__FUNCTION__, " Point Count:%d", iPnum);
                double iLen = poLS->get_Length();
                CPLDebug(__FUNCTION__, " Len :%d" , iLen);
                for (int i = 0; i < iPnum;i++)
                {
                    double dfX = poLS->getX(i);
                    double dfY = poLS->getY(i);
                    CPLDebug(__FUNCTION__, " X : %lf,Y : %lf" , dfX , dfY);
                }
                int fieldCnt = ftr->GetFieldCount();
                for (int idx = 0; idx < fieldCnt; ++idx)
                {
                    OGRFieldDefn* field = ftr->GetFieldDefnRef(idx);
                    const char * fieldName = field->GetNameRef();
                    if (0 == strncmp(ICS_FIELD_NAME_SUBCLASS, fieldName, strlen(ICS_FIELD_NAME_SUBCLASS)))
                    {
                        const char * fieldValue = ftr->GetFieldAsString(fieldName);
                        if (0 == strncmp(ICS_FIELD_VALUE_SUBCLASS_BLOCK, fieldValue, strlen(ICS_FIELD_VALUE_SUBCLASS_BLOCK)))
                        {
                            CPLDebug(__FUNCTION__, ICS_FIELD_VALUE_SUBCLASS_BLOCK);
                        }
                    }
                }
            
            }
            break;
            case wkbMultiLineString:
            {
                OGRMultiLineString* poMLS = static_cast<OGRMultiLineString*>(poGeom);
                const  char* pGeoName = poMLS->getGeometryName();
                if (NULL != pGeoName)
                {
                    CPLDebug(__FUNCTION__, " Geo name:%s", pGeoName);
                }
                int fieldCnt = ftr->GetFieldCount();
                for (int idx = 0; idx < fieldCnt; ++idx)
                {
                    OGRFieldDefn* field = ftr->GetFieldDefnRef(idx);
                    const char * fieldName = field->GetNameRef();
                    if (0 == strncmp(ICS_FIELD_NAME_SUBCLASS, fieldName, strlen(ICS_FIELD_NAME_SUBCLASS)))
                    {
                        const char * fieldValue = ftr->GetFieldAsString(fieldName);
                        if (0 == strncmp(ICS_FIELD_VALUE_SUBCLASS_BLOCK, fieldValue, strlen(ICS_FIELD_VALUE_SUBCLASS_BLOCK)))
                        {
                            CPLDebug(__FUNCTION__, ICS_FIELD_VALUE_SUBCLASS_BLOCK);
                            OGRGeometryCollection* block = poMLS->toUpperClass();
                            int geomNum = block->getNumGeometries();
                            for (int geomIdx = 0; geomIdx < geomNum; ++geomIdx)
                            {
                                OGRGeometry* geom = block->getGeometryRef(geomIdx);
                            }
                        }
                    }
                }
                
            }
            break;
            default:
                break;
            }

            ftr->DumpReadable(NULL);
        }
    }

    GDALClose(hInDS);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值