GDAL——生成等值线

参考李民录的gdal源代码剖析那本书写的,由于代码主要是用C的库,下面我使用C++相应的库进行重写,有的函数用法需要稍作修改,直接上代码:

//生成等高线
///C++
int CreateContourDlg::Createontour(const char* pszSrcDEM, const char* pszDstShp, int iBandIndex, double dInterval,
       const char * pszFormat, CProgressBase* pProcess)
{
    if(pProcess != NULL)
    {
        pProcess->ReSetProcess();
        pProcess->SetProgressTip("CreateContour...");
    }

    GDALAllRegister();
    OGRRegisterAll();

    GDALDataset* poDataset;
    poDataset = (GDALDataset*) GDALOpen(pszSrcDEM, GA_ReadOnly);
    GDALRasterBand* poBand;
    poBand = poDataset->GetRasterBand(iBandIndex);
    // 获取原始DEM数据中的NODATA值
    int bNoDataSet = FALSE, bIgnoreNoData = FALSE;
    double dfNoData = 0.0;
    if( !bNoDataSet && !bIgnoreNoData )
        dfNoData = poBand->GetNoDataValue(&bNoDataSet);

    OGRSpatialReference oSRS;
    const char* pszWKT;
    pszWKT = poDataset->GetProjectionRef();

    char* psz;
    psz  =  const_cast<char*>(pszWKT);
    if( pszWKT != NULL && strlen(pszWKT) != 0 )
       oSRS.importFromWkt(&psz);

    //OGRSpatialReference oSRS(pszWKT);


    GDALDriver* poDriverDem;
    poDriverDem = GetGDALDriverManager()->GetDriverByName(pszFormat);
    GDALDataset* poDS;
    poDS = poDriverDem->Create(pszDstShp, 0, 0, 0, GDT_Unknown, 0);
    OGRLayer* poLayer;
    poLayer = poDS->CreateLayer("Contour", &oSRS, wkbLineString ,NULL);

    OGRFieldDefn oFieldID( "ID", OFTInteger);
    oFieldID.SetWidth(8);
    poLayer->CreateField(&oFieldID, false);
    OGRFieldDefn oFieldEle( "Elevation", OFTReal);
    oFieldEle.SetWidth(12);
    oFieldEle.SetPrecision(3);
    poLayer->CreateField(&oFieldEle, false);

    int nElevField = 1;


    // 调用GDAL库中的函数生成等高线
    MyGDALProgressFunc pfnProgress = ALGTermProgress;
    CPLErr eErr = GDALContourGenerate( (GDALRasterBandH)poBand, dInterval, 0.0,
                                       0, NULL,
                                       bNoDataSet, dfNoData,
                                       poLayer, 0, nElevField,
                                       pfnProgress, pProcess );

    oSRS.Release();
    GDALClose(poDataset);
    return 1;
}
Java GDAL是一种用于处理地理数据的开源库。tif文件是一种常见的栅格图像格式。生成缩略图是指从一个大尺寸的图像文件中创建一个较小尺寸的预览图像。 要在Java中使用GDAL生成缩略图,需要先安装GDAL库,并将其添加到Java项目的类路径中。然后,可以使用GDAL的Java绑定来进行图像处理操作。 首先,需要使用GDAL打开tif文件: ```java Dataset dataset = gdal.Open("input.tif", gdalconstConstants.GA_ReadOnly); ``` 然后,获取原始图像的宽度和高度: ```java int width = dataset.GetRasterXSize(); int height = dataset.GetRasterYSize(); ``` 接下来,可以指定缩略图的目标尺寸,比如将原始图像缩小到宽度和高度的一半: ```java int thumbnailWidth = width / 2; int thumbnailHeight = height / 2; ``` 创建一个用于存储缩略图的内存驱动器: ```java Driver driver = gdal.GetDriverByName("MEM"); Dataset thumbnailDataset = driver.Create("", thumbnailWidth, thumbnailHeight, 3, gdalconstConstants.GDT_Byte); ``` 使用Rescale函数将原始图像数据复制到缩略图中: ```java double[] rescaleParams = new double[] { 0, 255, 0, 255, 0, 255 }; gdal.ReprojectImage(dataset, thumbnailDataset, null, null, gdalconstConstants.GRA_NearestNeighbour, 0, rescaleParams, null, null); ``` 最后,将缩略图保存到文件或进行其他处理: ```java driver = gdal.GetDriverByName("PNG"); thumbnailDataset.SetProjection(dataset.GetProjection()); thumbnailDataset.SetGeoTransform(dataset.GetGeoTransform()); thumbnailDataset.FlushCache(); thumbnailDataset.WriteRaster(0, 0, thumbnailWidth, thumbnailHeight, thumbnailData); thumbnailDataset.GetRasterBand(1).FlushCache(); thumbnailDataset.delete(); ``` 这样就可以使用Java GDAL生成缩略图。缩略图的大小和其他参数可以根据需要进行调整,以实现所需的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烟云之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值