C++11 使用 bind 和 function 读取 shp (gdal三方库)

typedef std::tuple<std::string, int, int> writefileinfo; 用tuple 解决函数传递参数过多的问题
class TDGDAL_test
{

private:

    TDGDALDataset *preadDataSet; //读取shp 的数据驱动
    TDGDALDataset *pwriteDataSet; //目标数据驱动
public:
    void writeDataSetInit(writefileinfo tempinfo); // 用于将shp里面的光栅最大和最小值设置到创建的新shp文件中
    void writeLayer(TDOGRLayer *pogrlayer); // 用与将图层一个一个写入到新的驱动驱动中

    void readDataSet(std::function<void(writefileinfo)> InitDataSet, const char * pchr, const char * outchr, std::function<void(TDOGRLayer *)> writeLayer);

std::function<void(writefileinfo)> InitDataSet // 用函数模版解决 读取到不同驱动中 的问题,

std::function<void(TDOGRLayer *)> writeLayer // 用函数模版解决读取layer到新驱动的

};

//writeDataSetInit 的实现

void TDGDAL_test::writeDataSetInit(writefileinfo tempinfo)
{
    GDALAllRegister();
    CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
    const char* pszDriverName = "ESRI Shapefile";
    auto poDriver = TDOGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(pszDriverName);
    if (poDriver == NULL)
    {
        printf("%s driver is not available!", pszDriverName);
        exit(1);
    }
    pwriteDataSet = poDriver->Create(std::get<0>(tempinfo).c_str(), std::get<1>(tempinfo), std::get<2>(tempinfo), 1, GDT_Byte, NULL);
    if (pwriteDataSet == NULL)
    {
        printf("Create my shape file failed!");
        exit(1);
    }

}

//读取单个图层

void TDGDAL_test::writeLayer(TDOGRLayer * pogrlayer)
{
    if (NULL == pogrlayer)
    {
        return;
    }
    auto poLayer = pwriteDataSet->CreateLayer(pogrlayer->GetDescription(), pogrlayer->GetSpatialRef(), wkbUnknown, NULL);
    auto layerdefn = pogrlayer->GetLayerDefn();
    for (int i = 0; i < layerdefn->GetFieldCount(); i++)
    {
        poLayer->CreateField(layerdefn->GetFieldDefn(i));
    }
    TDOGRFeature *poFeature = NULL;
    while ((poFeature = pogrlayer->GetNextFeature()) != NULL)
    {
        poLayer->CreateFeature(poFeature);
    }

}

//用函数模版解决动态可读写不同驱动的问题

void TDGDAL_test::readDataSet(std::function<void(writefileinfo)> InitDataSet,const char * pchr,const char * outchr, std::function<void(TDOGRLayer *)> writeLayer)
{
    GDALAllRegister();
    CPLSetConfigOption("SHAPE_ENCODING", "");
    preadDataSet = (TDGDALDataset*)GDALOpenEx(pchr, GDAL_OF_VECTOR, NULL, NULL, NULL);
    if (preadDataSet == NULL)
    {
        std::cout << "Open failed." << std::endl;
    }
    else
    {
        std::cout << "Open successed." << std::endl;
    }
    writefileinfo temp;
    std::get<0>(temp) = outchr;
    std::get<1>(temp) = preadDataSet->GetRasterXSize();
    std::get<2>(temp) = preadDataSet->GetRasterYSize();
    InitDataSet(temp);
    for (int i = 0; i < preadDataSet->GetLayerCount(); i++)
    {
        /*std::printf("%d,%d\n",i, preadDataSet->GetLayerCount());*/
        writeLayer(preadDataSet->GetLayer(i));
    }
    GDALClose(preadDataSet);
GDALClose(pwriteDataSet);

}、、、、、、、、、、、、、、、、、、、、、、、、、

/

使用介绍

   char* chr0 = "G:/ReadFileShp/world.shp";

    TDGDAL_test obj;

//将TDGDAL_test 里面的 writeDataSetInit绑定给bind

    auto fn = std::bind(&TDGDAL_test::writeDataSetInit,&obj, std::placeholders::_1)

//将TDGDAL_test 里面的 writeLayer绑定给bind;

需要注意bind的第二个参数,相当于lamda 表达式中[&],是将obj 传入引用,保证使用同一份内存。

    auto fn1 = std::bind(&TDGDAL_test::writeLayer, &obj, std::placeholders::_1);
    obj.readDataSet(fn,"G:/ReadFileShp/world.shp","G:/ReadFileShp/world1.shp", fn1);  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值