CString COGRVToR::Run() { GDALAllRegister(); OGRRegisterAll(); CPLSetErrorHandler(CPLLoggingHandler);//在刚开始的GDAL调用时 CString strErr; OGRDataSource *poDS; poDS = OGRSFDriverRegistrar::Open(m_strInputV, FALSE ); if( poDS == NULL ) { strErr.Format("Open %s failed./n",m_strInputV); return strErr; // exit( 1 ); } OGRLayer* poLayer; poLayer = poDS->GetLayer(0); const char * pszOutFileName =m_strOutputR; char * pszProjection; OGRSpatialReference * poSRS = poLayer->GetSpatialRef(); OGREnvelope psExent; poLayer->GetExtent(&psExent); int m_nImageWidth =1024;// podataset->GetRasterXSize(); int m_nImageHeight =1024;// podataset->GetRasterYSize(); if ( !poSRS ) { strErr.Format("无法打开%s地理信息",m_strInputV); m_nImageWidth = psExent.MaxX; m_nImageHeight = psExent.MaxY; CString str; str.Format("%d ,%d" , m_nImageWidth,m_nImageHeight); str = str+strErr; AfxMessageBox(str); // AfxMessageBox(strErr); // exit(1); // return strErr; } else { poSRS->exportToWkt( &pszProjection ); } const char *pszFormat = "GTiff"; GDALDriver *poDriver; poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat); // if( poDriver == NULL ) // exit( 1 ); GDALDataset *poNewDS = poDriver->Create( pszOutFileName, m_nImageWidth,m_nImageHeight,1, GDT_Float32 , NULL ); if ( !poSRS ) { // strErr.Format("因为无地理信息,%s无法栅格化",m_strInputV); // AfxMessageBox(strErr); // return strErr; //fot jy double adfGeoTransform[6]; adfGeoTransform[0] = psExent.MinX; adfGeoTransform[1] = (psExent.MaxX - psExent.MinX)/m_nImageWidth; adfGeoTransform[2] = 0; adfGeoTransform[3] = psExent.MaxY; adfGeoTransform[4] = 0; adfGeoTransform[5] = (psExent.MinY - psExent.MaxY)/m_nImageHeight; GDALSetGeoTransform( poNewDS, adfGeoTransform ); // OGRSpatialReference * poOGRSR; // poOGRSR->SetUTM(50); // poSRS->exportToWkt(&pszProjection); // poNewDS->SetProjection(pszProjection); //for jy } else { double adfGeoTransform[6]; adfGeoTransform[0] = psExent.MinX; adfGeoTransform[1] = (psExent.MaxX - psExent.MinX)/m_nImageWidth; adfGeoTransform[2] = 0; adfGeoTransform[3] = psExent.MaxY; adfGeoTransform[4] = 0; adfGeoTransform[5] = (psExent.MinY - psExent.MaxY)/m_nImageHeight; GDALSetGeoTransform( poNewDS, adfGeoTransform ); poNewDS->SetProjection(pszProjection); } // GDALDatasetH poDstDs; // poDstDs = (GDALDatasetH)poNewDS;//GDALOpen(pszOutFileName,GA_Update); int * pnbandlist; pnbandlist = new int [1]; pnbandlist[0]=1; double *dburnValues; dburnValues = new double[1]; dburnValues[0]=255; OGRLayerH * player; player = new OGRLayerH[1]; player[0] = (OGRLayerH)poLayer; // poLayer->GetInfo() char **papszOptions = NULL; // papszOptions = CSLSetNameValue( papszOptions, "ALL_TOUCHED", "TRUE" ); // papszOptions = CSLSetNameValue( papszOptions, "ATTRIBUTE", "Band1Mean" ); papszOptions = CSLSetNameValue( papszOptions, "CHUNKSIZE", "1" ); papszOptions = CSLSetNameValue( papszOptions, "ATTRIBUTE", m_strPara ); // AfxMessageBox("start"); // CPLErr err= GDALRasterizeLayers(poDstDs,1,pnbandlist,1,player,NULL,NULL,dburnValues,papszOptions,NULL,NULL); // void * pTransformArg; // pTransformArg = GDALCreateApproxTransformer(); void * pTransformArg=NULL; void * m_hGenTransformArg=NULL; m_hGenTransformArg = GDALCreateGenImgProjTransformer( NULL, pszProjection, (GDALDatasetH)poNewDS, poNewDS->GetProjectionRef(), FALSE, 1000.0, 3 ); pTransformArg = GDALCreateApproxTransformer( GDALGenImgProjTransform,m_hGenTransformArg, 0.125 ); CPLErr err= GDALRasterizeLayers((GDALDatasetH)poNewDS,1,pnbandlist,1,player,GDALGenImgProjTransform,m_hGenTransformArg,NULL,papszOptions,GDALTermProgresscjs,"矢量栅格化"); // AfxMessageBox("end"); // CPLErr err= GDALRasterizeLayers(po // DstDs,1,pnbandlist,1,player,NULL,NULL,NULL,papszOptions,NULL,NULL); GDALDestroyGenImgProjTransformer(m_hGenTransformArg); GDALDestroyApproxTransformer(pTransformArg); GDALClose(poNewDS); OGR_DS_Destroy( poDS ); // GDALClose( poDstDs ); delete[]player; delete[]pnbandlist; delete[]dburnValues; strErr = "栅格化成功"; return strErr; }