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);