GDAL 读取DXF

// gdal_sample.cpp : Defines the entry point for the console application.
//

#include “stdafx.h”
#include “gdal_version.h”
#include “gdal_priv.h”
#include “gdal.h”
#include <iostream>
#include “ogrsf_frmts.h”
#include “dxf/ogr_dxf.h”

#define DYZ_DEBUG_SWITCH “ON”
#if 1
#define DYZ_TEST_DWG_FILE “D:\\code\\gdal-2.3.0\\x64\\Debug\\renwutu.dxf”
#else
#define DYZ_TEST_DWG_FILE “D:\\code\\gdal-2.3.0\\x64\\Debug\\wolunxiang.dwg”
#endif

int main()
{
    GDALAllRegister();
    CPLSetConfigOption(“CPL_DEBUG”, DYZ_DEBUG_SWITCH);
    GDALDatasetH hInDS = GDALOpenEx(DYZ_TEST_DWG_FILE, GDAL_OF_VECTOR | GDAL_OF_VERBOSE_ERROR, nullptr, nullptr, nullptr);
    //GDALDataset* cInDS = GDALDataset::FromHandle(hInDS);
    OGRDXFDataSource* cInDS = (OGRDXFDataSource*)(hInDS);
    if (NULL == cInDS)
    {    
        return -1;
    }

    const char* pcDrvName = cInDS->GetDriverName();
    if (NULL != pcDrvName)
    {
        std::cout << “Driver Name:” << pcDrvName  << std::endl;
    }

    std::map<CPLString, DXFBlockDefinition>& blkMap = cInDS->GetBlockMap();
    std::map<CPLString, DXFBlockDefinition>::iterator blkMapIter = blkMap.begin();
    for (;blkMap.end() != blkMapIter; ++blkMapIter)
    {
        std::cout << “first:” << blkMapIter->first << “, second size:” << blkMapIter->second.apoFeatures.size() << std::endl;
        std::vector<OGRDXFFeature *>::iterator dxfFtrIter = blkMapIter->second.apoFeatures.begin();
        for (;blkMapIter->second.apoFeatures.end() != dxfFtrIter; ++dxfFtrIter)
        {
            //std::cout << ” block name: ” << (*dxfFtrIter)->GetBlockName() <<std::endl;
        }
    }
    int nLayerCnt = cInDS->GetLayerCount();
    int nLayerIdx = 0;
    for (;nLayerIdx < nLayerCnt; ++nLayerIdx)
    {
        OGRLayer* curLayer = cInDS->GetLayer(nLayerIdx);
        GIntBig nFtrCount = curLayer->GetFeatureCount();
        OGRDXFLayer* curDxfLayer = new OGRDXFLayer((OGRDXFDataSource*)cInDS);
        OGRFeature * ftr = curDxfLayer->GetNextFeature();
        while (ftr)
        {
            OGRFeature::ConstFieldIterator iter = ftr->begin();
            for (; ftr->end() != iter; ++iter)
            {
                std::cout << “GetType:” << (*iter).GetDefn()->GetType() << std::endl;
            }
            ftr = curDxfLayer->GetNextFeature();
        }
        delete curDxfLayer;
    }

    GDALClose(hInDS);

    return 0;
}

转载自:https://blog.csdn.net/durongze/article/details/80740270

You may also like...