C# GDAL基础使用之矢量栅格化处理6

​
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;
}

​

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!要使用GDAL库在Python中进行格转矢量操作,您可以按照以下步骤进行: 1. 安装GDAL库:在Python环境中安装GDAL库,可以使用pip命令来安装,如下所示: ``` pip install gdal ``` 2. 导入GDAL库:在Python脚本中导入GDAL库,可以使用以下代码: ``` from osgeo import gdal, ogr ``` 3. 打开格文件:使用GDAL库的Open函数打开格文件,如下所示: ``` raster_ds = gdal.Open('path/to/raster/file.tif') ``` 4. 获取格图层:使用GDAL库的GetRasterBand函数获取格图层,如下所示: ``` band = raster_ds.GetRasterBand(1) ``` 5. 创建矢量数据源:使用GDAL库的CreateDataSource函数创建矢量数据源,如下所示: ``` driver = ogr.GetDriverByName('ESRI Shapefile') vector_ds = driver.CreateDataSource('path/to/vector/file.shp') ``` 6. 创建矢量图层:使用矢量数据源的CreateLayer函数创建矢量图层,如下所示: ``` layer = vector_ds.CreateLayer('layer_name', geom_type=ogr.wkbPolygon) ``` 7. 定义矢量属性:使用图层的CreateField函数定义矢量属性,如下所示: ``` field_defn = ogr.FieldDefn('attribute_name', ogr.OFTString) layer.CreateField(field_defn) ``` 8. 格转矢量使用GDAL库的Polygonize函数将格转换为矢量,如下所示: ``` gdal.Polygonize(band, None, layer, 0, [], callback=None) ``` 9. 保存矢量文件:使用矢量数据源的SyncToDisk函数保存矢量文件,如下所示: ``` vector_ds.SyncToDisk() ``` 这些是使用GDAL库在Python中进行格转矢量的基本步骤。您可以根据自己的需求对代码进行进一步的调整和优化。希望对您有所帮助!如果有任何问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值