作者:朱金灿

来源:http://blog.csdn.net/clever101

使用gdal创建一个100*100的红色的geotiff图像,代码如下:

#include <assert.h>
#include <string>
#include <gdal.h>
#include <gdal_priv.h>
#include <gdalwarper.h> int _tmain(int argc, _TCHAR* argv[])
{
// 用于支持中文路径
CPLSetConfigOption(_T("GDAL_FILENAME_IS_UTF8"),_T("NO"));
GDALAllRegister(); GDALDriver* pDriver = GetGDALDriverManager()->GetDriverByName(_T("GTiff"));
if(NULL!=pDriver)
{
// 创建的geotif文件路径
std::string strFileFullPath = "D:\\1.tif";
// 下面是默认选项
char** papszOptions = NULL;
papszOptions = CSLSetNameValue( papszOptions, "INTERLEAVE", "BAND" ); //bsq int nImgWidth = 100; // 图像宽度
int nImgHeight = 100; // 图像高度
//创建位浮点数的geotif图像
GDALDataset* pCreateDataset = pDriver->Create(strFileFullPath.c_str(),nImgWidth,nImgHeight,3,GDT_Byte,papszOptions); if(pCreateDataset != NULL)
{
// 定义仿射变换参数
double dblGeoTransform[6] = {0};
/*
dblGeoTransform[0] --- 图像左上角的横坐标
dblGeoTransform[1] --- 单个像元宽度,使用图像x轴范围/图像宽度得到
dblGeoTransform[2] --- 0.0
dblGeoTransform[3] --- 图像左上角的纵坐标
dblGeoTransform[4] --- 0.0
dblGeoTransform[5] --- 单个像元高度,使用图像y轴范围/图像高度得到
*/ dblGeoTransform[0] = 116.0; // 东经度
dblGeoTransform[1] = (120.0-116.0)/static_cast<double>(nImgWidth); // 图像的地理范围为东经度到东经度
dblGeoTransform[3] = 39.0; // 北纬度
dblGeoTransform[5] = (37.0-39.0)/static_cast<double>(nImgHeight);// 图像的地理范围为北纬度到北纬度 CPLErr err = CE_None;
if(CE_None == pCreateDataset->SetGeoTransform(dblGeoTransform))
{
// 设置经纬度坐标
std::string strWkt = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433],AUTHORITY[\"EPSG\",\"4326\"]]";
if(CE_None == pCreateDataset->SetProjection(strWkt.c_str()))
{
GDALRasterBand* poBand = NULL;
poBand = pCreateDataset->GetRasterBand(1);
unsigned char* pcBuffer = new unsigned char[nImgWidth*nImgHeight];
memset(pcBuffer,255,nImgWidth*nImgHeight*sizeof(unsigned char)); assert(NULL!=poBand);
// 将第一波段的值全部设为.0
err = poBand->RasterIO(GF_Write,0,0,nImgWidth,nImgHeight,pcBuffer,nImgWidth,nImgHeight,GDT_Byte,0,0); // GF_Read
}
}
GDALClose(pCreateDataset);
}
} GDALDestroyDriverManager();
getchar();
return 0;
}

用ENVI ZOOM打开时居然是全黑,如下图:

开始百思不得其解,后来大致明白了,ENVI初始显示是作了2%线性拉伸的,就是对图像DN值分布在2%和98%之间的做线性拉伸,由于所有波段的最大值和最小值都一样,没有拉伸空间,那么就是保留初始化值0,所以就显示为0。

就是如果不进行拉伸的话,是可以正确显示的,如下图:

参考:

1. envi中2%线形灰度拉伸是什么含义

ENVI显示GDAL创建GeoTiff文件的一个问题及其思考的更多相关文章

  1. python gdal 写GeoTiff文件

    1.gdal数据类型 (1)GDT_Byte(int8)  (2)GDT_UInt16 (3)GDT_Int16  (4)GDT_UInt32  (5)GDT_Int32  (6)GDT_Float3 ...

  2. 在C#中使用GDAL创建Shape文件

    这几天在项目中考虑使用GDAL,由于10年没有用过VC了,就在网上搜了下怎么样在C# 中使用GDAL,看到了http://blog.csdn.net/liminlu0314/article/detai ...

  3. C++、GDAL创建shapefile文件

    源代码网址:http://download.csdn.net/detail/ivanljf/5834823 一.先贴出第一段代码: #include "ogrsf_frmts.h" ...

  4. C++、GDAL创建shapefile,并向矢量文件中添加网格

    //总体来说这个过程就是构建数据源->构建层->构建要素->构建形状->关闭数据源. //要包含的GDAL头文件 #include <gdal_priv.h> #i ...

  5. 【Python脚本】Python创建删除文件-----------我的第一个Python脚本

    Python相对C++和Java来说,是解释性语言,非常适合来编写脚本. 很久之前就开始学习Python的语法了,今天写了第一个Python的脚本,来简化我的一些日常工作. 我平时学习的时候喜欢新建一 ...

  6. 使用SQL语句创建数据库1——创建一个数据库文件和一个日志文件的数据库

    目的:创建一个数据库文件和一个日志文件的数据库 在matser数据库下新建查询,输入的命令如下: USE master——指向当前使用的数据库.创建数据库实际上是向master数据库中增加一条数据库信 ...

  7. C#操作XML学习之创建XML文件的同时新建根节点和子节点(多级子节点)

    最近工作中遇到一个问题,要求创建一个XML文件,在创建的时候要初始化该XML文档,同时该文档打开后是XML形式,但是后缀名不是.在网上找了好些资料没找到,只能自己试着弄了一下,没想到成功了,把它记下来 ...

  8. WPF入门教程系列(一) 创建你的第一个WPF项目

    WPF入门教程系列(一) 创建你的第一个WPF项目 WPF基础知识 快速学习绝不是从零学起的,良好的基础是快速入手的关键,下面先为大家摞列以下自己总结的学习WPF的几点基础知识: 1) C#基础语法知 ...

  9. mac下为Apache 创建 .htaccess文件

    标签:mac   .htaccess 在设置固定链接时会提示如下的问题:   若您的 .htaccess 文件可写,我们可以自动修改它.但似乎它不可写,因此我们在下方列出了您 .htaccess 文件 ...

随机推荐

  1. Codeforces Round #312 (Div. 2) E. A Simple Task 线段树 延时标记

    E. A Simple Task time limit per test5 seconds memory limit per test512 megabytes inputstandard input ...

  2. Apache通用日志工具commons-logging和Log4j使用总结

    转自:https://blog.csdn.net/lzl13391522110/article/details/53758536 Apache通用日志工具commons-logging和Log4j使用 ...

  3. C#操作SQLite方法实例详解

    用 C# 访问 SQLite 入门(1) CC++C#SQLiteFirefox  用 C# 访问 SQLite 入门 (1) SQLite 在 VS C# 环境下的开发,网上已经有很多教程.我也是从 ...

  4. 事件循环(Event Loop)

    1.什么是事件循环? JavaScript为单线程执行的,所以是从上到下依次执行,js分为两个任务,宏任务和微任务 首先执行宏任务(第一次就是执行所有的同步代码),再执行所有的微任务,执行完毕之后再次 ...

  5. Objective-C - 类的静态常量

    创建头文件(.h), 导出常量: // Constants.h FOUNDATION_EXPORT NSString *const MyFirstConstant; FOUNDATION_EXPORT ...

  6. Cocos2d-x学习笔记(三)CCNode分析

    原创文章.转载请注明出处:http://blog.csdn.net/sfh366958228/article/details/38706483 通过前两份学习笔记,我们不难发现CCScene.CCLa ...

  7. Xcode6:No architectures to compile for(ONLY_ACTIVE_ARCH=YES...)

    1.问题描写叙述 Xcode6真机測试旧project,不能执行,报错例如以下: 2.解决方式 问题非常明显,当前的执行模式设置了ONLY_ACTIVE_ARCH为Yes,当时的project的Val ...

  8. 103.tcp通信实现远程控制

    客户端代码 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include < ...

  9. java poi 向excel写入图片

    import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; impo ...

  10. 从数据表中随机抽取n条数据有哪几种方法(join实现可以先查数据然后再拼接)

    从数据表中随机抽取n条数据有哪几种方法(join实现可以先查数据然后再拼接) 一.总结 一句话总结:最好的是这个:"SELECT * FROM table WHERE id >= (( ...