您的位置:首页 > 编程语言 > C语言/C++

遥感图像处理QT及C++笔记

2013-06-16 21:09 344 查看
一.Qt的那些事儿

1. QObject是所有类的基类,而QWidget是所有图形类的基类,继承了QObject和QPaintDevice。

2. Qt Object Model,主要包括如下的东西

1.信号和槽,connect函数

2.良好的对象属性,如可查询和很好看,,,~~

3.有力的事件和事件过滤器

4.国际化字符设计

5.定时器为GUI的事件提供毫秒级的支持

6.很优秀的对象树结构

7.当对象销毁时指针自动设置为0

8.a dynamic cast that works across library boundaries,不知如何翻译

3. Win32 application
与win32 ConsoleApplication的区别

Win32 Application的入口函数为WinMain,include<windows.h>,能够使用win32API函数。

Win32 Console Application的入口函数是main,不能使用win32API函数。

4. 函数重载与子类成员函数覆盖

函数重载是发生在同一个类里,特别注意:函数名和参数都相同,而返回类型不一样的,不能重载;

子类在继承父类时,对同一个函数进行重定义,称为函数覆盖,不是重载;

除了虚函数,普通函数不占堆栈去大小,对sizeof无效,而是放在代码区;

5. 错误之:把槽函数当普通函数声明了

例如:我想通过一个按钮来选取文件名,并用消息框显示出来,

建立了如下的信号槽

connect(ui.BtnGetFile,
SIGNAL(clicked()),
this, SLOT(GetFileName()));

槽函数定义如下:

void
StripeStatis::GetFileName()
{
QString
filename = QFileDialog::getOpenFileName(this,"test",
"D:");
if (!filename.isEmpty())
{

QMessageBox::information(this,
"filename",filename);
}
}

但是,在申明这个函数去当作普通函数来申明了

准确的是应该在头文件中注明是槽函数,方法如下:

public
slots:
void
GetFileName();

6. 句柄可直接调用函数

ui.EdtFile->setText(filename);
目的: 讲Dialog窗口中LineEdit中的值改变成“filename”;

说明: Ui是Dialog类对象,而LineEdit是ui的一个成员变量,这个变量的类型是QLineEdit,而QLineEdit就具有void
setText(const
QString&)函数可以改变QLineEdit对象的值。

Ui的定义:Ui::StripeStatis
ui;

7. 窗口之间参数传递

如要讲一个QLineEdit中的值传递个另一个QLineEdit,就可以在这个窗口类中定义个成员变量,来完成窗口内部个组件之间的参数传递;

下面的界面中,点击“统计开始”,获取到QLineEdit中的值,并用一个MessgeBox输出!

在窗口类的头文件中,创建一个成员变量“filename”

private:

QString filename;

connect(ui.BtnDo,
SIGNAL(clicked()),this,
SLOT(Do()));

void
StripeStatis::Do()
{

QMessageBox::information(this,
"filename",filename);
}

connect(ui.BtnGetFile,
SIGNAL(clicked()),this,
SLOT(GetFileName()));

void
StripeStatis::GetFileName()
{

filename = QFileDialog::getOpenFileName(this,"test",
"D:");
if (!filename.isEmpty())
{
ui.EdtFile->setText(filename);
}
}

8. QT中文识别设置

在QT中往往要用到中文,如果直接写中文,会产生乱码现象,但是,可以通过如下设置解决这个问题:

首先,在包含main函数的文件中包含#include
<QTextCodec>头文件;

然后在main函数中输入如下代码;

QTextCodec *
codec= QTextCodec::codecForName("GB2312");
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);

如此便OK!

9. QT图像显示

首先,在QTDesigner中创建一个Label 组件,

假设其句柄名称为”Label”,显示图像时,会用到。

然后,在你的某个响应函数中,输入如下代码:

QString
filename;
filename=
QFileDialog::getOpenFileName(this,tr("选择图像文件"),"D:",
tr("Images(*.tif *.bnp *.jpg *.GIF)"));
if (filename.isEmpty())
{

return;
}
else
{
QImage *img =
new QImage;


if (! (img->load(filename)))//装载图像
{

QMessageBox::information(this,
tr("打开图像失败"),tr("打开图像失败!"));

deleteimg;

return;
}
ui.label->setPixmap(QPixmap::fromImage(*img));
}

注意:别忘了包含头文件:

#include
<QFileDialog>
#include
<QMessageBox>
#include
<QPixmap>
#include
<QLabel>
#include
<QImage>

上面的代码,虽然能够打开图像并且显示出来,但是如果图像尺寸与Label窗口尺寸不一致,图像将不能完全显示,这时,该如何是好?

这个问题可以用container中的ScrollArea控件来解决,

在Qt Designer中创建一个ScrollArea控件,假设句柄名为“scrollArea”,然后,将label控件装入ScrollArea控件即可!

ui.scrollArea->setBackgroundRole(QPalette::Dark);
ui.scrollArea->setWidget(ui.label[雨林木风1] );[雨林木风2]

最好将上面的代码添加到构造函数中,即窗口创建时就进行上面的设置。

示例:

上述处理的大致流程:

QFileDialog获取图像文件名à创建QImage对象装载图像àQLabel的setPixmap函数显示图像,如果图像过大,可以采用Scroll Area控件装入QLabel部件,当图像超出了QLabel大小时,就会产生滑竿,通过滑竿,则全部图像可以被看见!

10. 采用QGridlayout对控件进行缩放

目的:scrollArea和label都随主窗口缩放而缩放!

在主界面的头文件中定义QGridlayout对象变量;

QGridLayout
myLayout;

添加如下函数

void
ZY3_RC::layoutFunc()
{
ui.centralWidget->setLayout(&myLayout);

myLayout.addWidget(ui.scrollArea,0,0);

myLayout.addWidget(ui.label, 0,0);
}

并在构造函数中使用上面的布局函数。

ZY3_RC::ZY3_RC(QWidget*parent,
Qt::WFlags
flags)
:QMainWindow(parent,flags)
{

ui.setupUi(this);

setupConnections();

layoutFunc();

ui.scrollArea->setBackgroundRole(QPalette::Dark);

ui.scrollArea->setWidget(ui.label);
//StripeStatis dlg;
}

易错点:

没有将QGridlayout对象注册到窗口中去;

ui.centralWidget->setLayout(&myLayout);

11. Qt窗口图标设置

一种简单的方法是,在Qt Designer中选中主窗口,点击属性中的“windowIcon”,选择图标,保存运行即可!

12. 别把自定义函数放在“ui.setupUi(this);”之前

错误:

CRad::CRad(QWidget *parent)
:QDialog(parent)
{
setConnection();

ui.setupUi(this);

FileMod = "NoFile";
}

在用户自定义界面类的构造函数中,有一句“ui.setupUi(this);”是用于建立用户定义的界面,如果你还要在此构造函数中添加代码,千万注意别添加在此语句之前,否则,会不认!

13. 错把button的SIGNAL写成了activateds()

如果你把按钮的信号写成了activated(),你永远也启动不了按钮,这种隐蔽的错误一定要小心!

connect(ui.BtnExit,
SIGNAL(activated()),this,
SLOT(close()));

14. 建立登录框

首先,简历QdialogQt窗口类logindlg

其次,修改main函数

int
main(int
argc, char *argv[])
{

QApplication a(argc,
argv);
ZY3_RC
w;

logindlg ms;
if (ms.exec() ==
QDialog::Accepted)
{

w.show();

return a.exec();
}
else
{

return 0;
}

}

同时在logindlg.cpp中增加信号槽函数

在logindlg构造函数中增加连接,
connect(ui.loginBtn,
SIGNAL(clicked()),this,
SLOT(loginFunc()));
connect(ui.exitBtn,
SIGNAL(clicked()),
this, SLOT(close()));

编写loginFunc槽函数:

void
logindlg::loginFunc()
{
if (ui.usrlineEdit->text().trimmed()==tr("ZY03")&&ui.pwdlineEdit->text()==tr("123456"))

accept();
else
{

QMessageBox::warning(this,tr("Warning"),tr("user name
or password error!"),QMessageBox::Yes);

//ui.usrlineEdit->clear();

ui.pwdlineEdit->clear();

ui.pwdlineEdit->setFocus();
}
}

为了将密码显示成小圆点,可以在logindlg构造函数中增加如下代码:

ui.pwdlineEdit->setEchoMode(QLineEdit::Password);

效果:

15. 设置默认按钮

如14中的登录界面中,人们的习惯是输入密码后,直接按下“回车”键,即可登录,即需要将默认按钮设置成“登录”按钮上。

在界面的构造函数内,加上下面的代码即可!

ui.loginBtn->setDefault(TRUE);

16. Fstream 无法打开中文路径下文件

问题:在使用fstream打开一个图像数据时,图像文件路径包含了中文字体,此时,图像会打开失败,

为了解决此问题,须将程序运行编码格式作转换,为了不影响整个工程的编码格式,可以在使用输入/输出流的地方,作编码格式转换;完成输入/输出后,再将工程的编码格式变换回去。如下例:

setlocale(LC_ALL,"Chinese-simplified");
// add qiaozh 20130529
fstream
fin;

。。。。。

setlocale(LC_ALL,"C");
// addqiaozh 20130529

17. 如何实现中英文自动切换?

1)新建translation file

2)将translation file用qt linguist打开,并完成编辑

3)在工程中完成Iupdate,Irelease,在工程文件夹中生成 *.qm文件,

4)将*.qm加载进资源文件中去,

5)在main函数中完成加载

将上面的例子改成界面中选择中英文切换?

先建两个切换菜单

connect(ui.act_Language_zh,SIGNAL(activated()),this,
SLOT(LangZhFunc()));
connect(ui.act_Language_en,SIGNAL(activated()),this,
SLOT(LangEnFunc()));

其次,在其槽函数里,加入代码

voidZY3_RC::LangEnFunc()
{
QTranslator *newTranlator= new QTranslator(qApp);
/*zyTranslator->load(":/translations/zy3_rc_zh.qm");*/
qApp->removeTranslator(zyTranslator);
zyTranslator->deleteLater();
zyTranslator = newTranlator;
newTranlator->load(":/translations/zy3_rc_zh.qm");
qApp->installTranslator(zyTranslator);
retranslateUi();
}

voidZY3_RC::LangEnFunc()
{
QTranslator*newTranlator = new QTranslator(qApp);

/*zyTranslator->load(":/translations/zy3_rc_en.qm");*/
qApp->removeTranslator(zyTranslator);
zyTranslator->deleteLater();
zyTranslator= newTranlator;
newTranlator->load(":/translations/zy3_rc_en.qm");
qApp->installTranslator(zyTranslator);
}

上面的处理只能将新弹出的窗口完成翻译,不能对主界面进行翻译。怎么办?

还应加上

….

newTranlator->load(":/translations/zy3_rc_zh.qm");
qApp->installTranslator(zyTranslator);
retranslateUi();
void ZY3_RC::retranslateUi()
{
setWindowTitle(tr("ZY01_RC"));
ui.menuFile->setTitle(tr("File"));
ui.actOpen->setText(tr("Open"));
ui.actionExit->setText(tr("Exit"));

ui.menuCalibrate->setTitle(tr("CalibrationCoefficient"));
ui.actMeanCal->setText(tr("LaboratoryRelative Coeff"));
ui.actStripeStatis->setText(tr("On-orbitRelative Coeff"));
ui.actJYDB->setText(tr("UniformFieldRelative Coeff"));
ui.actAbCal->setText(tr("AbsoluteCoeff"));

ui.menuRadiationCorr->setTitle(tr("RadiationCorrection"));
ui.actRC->setText(tr("RC"));

ui.menuRadiationSimul->setTitle(tr("RadiationSimulation"));
ui.actRad->setText(tr("PupilRadiance"));
ui.actDyn->setText(tr("DynamicRange Analysis"));

ui.menu_2->setTitle(tr("Language"));
ui.act_Language_zh->setText(tr("Chinese"));
ui.act_Language_en->setText(tr("English"));

ui.menu->setTitle(tr("Help"));
ui.actSpecif->setText(tr("Specification"));
ui.actAbout->setText(tr("About"));

}

加上头文件
#include
<QTranslator>
#include
<QCoreApplication>

常见问题:明明翻译了,却不能实现切换?

应该是没加载进来,把资源中的*.qm移除后,再重新加载进来。

18. 如何让按钮长度随字体长度自动改变?

加弹簧

二.VC知识点
1. 附常用快捷键:

快捷键 功能

CTRL + SHIFT + B生成解决方案

CTRL + F7 生成编译

CTRL + O 打开文件

CTRL + SHIFT + O打开项目

CTRL + SHIFT + C显示类视图窗口

F4 显示属性窗口

SHIFT + F4显示项目属性窗口

CTRL + SHIFT + E显示资源视图

F12 转到定义

CTRL + F12转到声明

CTRL + ALT + J对象浏览

CTRL + ALT + F1帮助目录

CTRL + F1 动态帮助

F1 帮助

SHIFT + F1当前窗口帮助

CTRL + ALT + F3帮助-搜索

SHIFT + ALT + ENTER全屏显示

CTRL + -向后定位

CTRL + SHIFT + -向前定位

CTRL + F4关闭文档窗口

CTRL + PAGE DOWN光标定位到窗口上方

CTRL + PAGE UP光标定位到窗口下方

CTRL + F6

CTRL + TAB下一个文档窗口

CTRL + SHIFT + F6

CTRL + SHIFT + TAB上一个文档窗口

ALT + F6下一个面板窗口

CTRL + K, CTRL + L取消remark

CTRL + K, CTRL + C注释选择的代码

CTRL + K, CTRL + U取消对选择代码的注释

CTRL + M, CTRL + O折叠代码定义

CTRL + M, CTRL + L展开代码定义

CTRL + DELETE删除至词尾

CTRL + BACKSPACE删除至词头

SHIFT + TAB取消制表符

CTRL + U转小写

CTRL + SHIFT + U转大写

CTRL + SHIFT + END选择至文档末尾

CTRL + SHIFT + HOME选择至文档末尾开始

SHIFT + END选择至行尾

SHIFT + HOME选择至行开始处

SHIFT + ALT + END垂直选择到最后尾

SHIFT + ALT + HOME垂直选择到最前面

CTRL + A全选

CTRL + W选择当前单词

CTRL + SHIFT + PAGE UP选择至本页前面

CTRL + SHIFT + PAGE DOWN选择至本页后面

CTRL + END文档定位到最后

CTRL + HOME文档定位到最前

CTRL + G转到…

CTRL + K, CTRL + P上一个标签

CTRL + K, CTRL + N下一个标签

ALT + F10调试-ApplyCodeChanges

CTRL + ALT+ Break停止调试

CTRL + SHIFT + F9 取消所有断点

CTRL + F9允许中断

CTRL + SHIFT + F5调试-重新开始

F5运行调试

CTRL + F5运行不调试

F10跨过程序执行

F11单步逐句执行

CTRL + J列出成员

CTRL + PAGE DOWN下一个视图

CTRL + B格式-粗体

CTRL + SHIFT + T格式-文字缩进
调试快捷键
F6: 生成解决方案

Ctrl+F6: 生成当前项目

F7: 查看代码

Shift+F7: 查看窗体设计器

F5: 启动调试

Ctrl+F5: 开始执行(不调试)

Shift+F5: 停止调试

Ctrl+Shift+F5: 重启调试

F9: 切换断点

Ctrl+F9: 启用/停止断点

Ctrl+Shift+F9: 删除全部断点

F10: 逐过程

Ctrl+F10: 运行到光标处

F11: 逐语句

编辑快捷键
Shift+Alt+Enter: 切换全屏编辑

Ctrl+B,T / Ctrl+K,K: 切换书签开关

Ctrl+B,N / Ctrl+K,N: 移动到下一书签

Ctrl+B,P: 移动到上一书签

Ctrl+B,C: 清除全部标签

Ctrl+I: 渐进式搜索

Ctrl+Shift+I: 反向渐进式搜索

Ctrl+F: 查找

Ctrl+Shift+F: 在文件中查找

F3: 查找下一个

Shift+F3: 查找上一个

Ctrl+H: 替换

Ctrl+Shift+H: 在文件中替换

Alt+F12: 查找符号(列出所有查找结果)

Ctrl+Shift+V: 剪贴板循环

Ctrl+左右箭头键: 一次可以移动一个单词

Ctrl+上下箭头键: 滚动代码屏幕,但不移动光标位置。

Ctrl+Shift+L: 删除当前行

Ctrl+M,M: 隐藏或展开当前嵌套的折叠状态

Ctrl+M,L: 将所有过程设置为相同的隐藏或展开状态

Ctrl+M,P: 停止大纲显示

Ctrl+E,S: 查看空白

Ctrl+E,W: 自动换行

Ctrl+G: 转到指定行

Shift+Alt+箭头键: 选择矩形文本

Alt+鼠标左按钮: 选择矩形文本

Ctrl+Shift+U: 全部变为大写

Ctrl+U: 全部变为小写
代码快捷键
Ctrl+J / Ctrl+K,L: 列出成员

Ctrl+Shift+空格键 / Ctrl+K,P: 参数信息

Ctrl+K,I: 快速信息

Ctrl+E,C / Ctrl+K,C: 注释选定内容

Ctrl+E,U / Ctrl+K,U: 取消选定注释内容

Ctrl+K,M: 生成方法存根

Ctrl+K,X: 插入代码段

Ctrl+K,S: 插入外侧代码

F12: 转到所调用过程或变量的定义
窗口快捷键
Ctrl+W,W: 浏览器窗口

Ctrl+W,S: 解决方案管理器

Ctrl+W,C: 类视图

Ctrl+W,E: 错误列表

Ctrl+W,O: 输出视图

Ctrl+W,P: 属性窗口

Ctrl+W,T: 任务列表

Ctrl+W,X: 工具箱

Ctrl+W,B: 书签窗口

Ctrl+W,U: 文档大纲

Ctrl+D,B: 断点窗口

Ctrl+D,I: 即时窗口

Ctrl+Tab: 活动窗体切换

Ctrl+Shift+N: 新建项目

Ctrl+Shift+O: 打开项目

Ctrl+Shift+S: 全部保存

Shift+Alt+C: 新建类

Ctrl+Shift+A: 新建项

VS2005的隐藏快捷键

这里我将会把一些无意中发现的VS2005中没有明确指出的快捷键共享出来,并不是所有的快捷键,或者常见的一些快捷键。

1、Ctrl+Space直接完成类或函数(本来这个并不算隐藏的快捷键,但是因为中文输入法抢占这个快捷键,所以。。。,替代的快捷键是Alt+Right)

2、Shift+Delete整行删除,并且将这一行放到剪贴板(这时候不能选中一段内容)

3、Shift+Insert粘贴,有点匪夷所思,Ctrl+V就可以了,大概是为了和Shift+Delete对应吧

4、Ctrl+Up,Ctrl+Down滚动编辑器,但尽量不移动光标,光标保证在可见范围内

5、Ctrl+BackSpace,Ctrl+Delete整词删除,有的时候很有用

6、Ctrl+Left,Ctrl+Right按整词移动光标(不算隐藏,和前面几条加起来就是Ctrl光标控制套件了)

7、Alt+Shift+F10打开执行改名,实现接口和抽象类的小窗口(还可以用Ctrl+.,不过有的中文输入法用到这个)

8、Shift+F9调试是打开QuickWatch,内容是当前光标所在处的内容

9、F12转跳到定义,很有用的快捷键

10、Shift+F12查找所有引用

11、Ctrl+F10=F5,开始Debug

12、Ctrl+F6循环察看代码窗口,有点Ctrl+Tab的感觉

13、Ctrl+F3查找当前光标选中的内容,可以和F3配合使用

14、Ctrl+F2将焦点转移到类的下拉框上

15、Alt+F7=Ctrl+Tab

16、Alt+F11新开VS2005并编辑宏

17、Alt+F12查找=Ctrl+F

2. local function definitions areillegal解决办法

这个没有别的原因就是少了一个右大括号“}”,报错的个数和这个函数的位置有关,好像也和作用域有关,或者和它的使用频度有关,反正报错的个数不太一样,是主应用程序的一个函数少了一个“}”。解决的方法就是:如果函数的数量少就一个一个的用Ctrl+}来查,如果太多的话就的将最近改动过的来试,好像也没有什么好的方法。(一般报错的位置不是真正的出错位置,一般是报错位置的上一个函数)

3. 预编译头问题

程序中出现下面问题:

fatalerror C1010: unexpected end of file while looking for precompiled header. Didyou forget to add '#include "stdafx.h"' to your source?

解决方案:

右击“工程”,将“C/C++”à”PrecompiledHeader“中的预编译头,选择成不使用。

4. 注意栈的大小

在windows编程中往往遇到“Stack overflow”的错误,这是因为,在windows中栈的默认大小只有1M,如果你在程序为普通变量申请了太多的内存,就会出现这个问题。

5. VS行号

6. 找不到MSVCR90D.dll

设置工程属性中,采用FAT32文件系统

7. Stack overflow Error

projectproperty->Configuration Properties->Linker->System->Stack ReserveSize

改成10000000,就可以了,注意是7个0哦

8. ZY03RC处理模块从Linux下转到Windows下,主要问题及解决方法

1) 成像时间与时间节点的长度缩短成10位

由于Windows下atol()函数最大转换值的限制,将Linux下原先使用13位long数据进行时间节点比较,修改给10位long比较,相应的将成像时间只去前10位

strncpy(timestr,
tmpstr, 10);
tptime =
atol(timestr);

并且,将”503.cfg”文件中各个时间节点的起点修改为10位

2) NAD函数栈溢出错误

NAD运行时修改了栈大小,不然无法运行

将栈大小改为10000000(7个0)。

3) 读写修改

将Linux下对大图像的打开、读取及存储使用的open, read, write均修改成Windows下的_open, _read, _write。

Linux:

fp_image= open( str_256b, O_RDWR);

lseek(fp_image,ii*LINES_PER_TIME*configParam.totalWidth*2+ configParam.totalWidth*j*2,SEEK_SET);

read(fp_image,tempbuffBefore,2*configParam.totalWidth);

close(fp_image);

Windows:

long fp_image = _open(str_256b,_O_RDONLY|_O_BINARY);

long pos = _lseek(fp_image, 0L, SEEK_END );

_read(fp_image, buffer, 2*12000);

_close(fp_image);

_write(out,tmpBuff, singlewidth*sizeof(unsigned short));

4) 保存Raw图像乱码

直接使用Linux下的存储代码,出现莫名其妙的错误

Linux:

FILE*fp_after;

sprintf(str_256b,"%s/RC_img_band%d_after_nochongdieregion.raw",inputParam.cLocalWorkDir,band+1);

fp_after= fopen(str_256b,"wb");

unsignedshort img_per_line[9216-196*2];

for(i=0;i<inputParam.lAP_TotalLine;i++)

{

for(j=0; j<8192; j++)

img_per_line[j] =img_raw_after[i*24576+j];

for(j=8192+22; j<8192*2; j++)

img_per_line[j-22] =img_raw_after[i*24576+j];

for(j=8192*2+22; j<8192*3; j++)

img_per_line[j-22*2] =img_raw_after[i*24576+j];

fwrite(img_per_line, 2, 24576-22*2, fp_after);

}

//Be carefull ! 2013 03 04

fclose(fp_after);

Windows:

sprintf(str_256b,"%s/RC_img_band%d_after_nochongdieregion.raw",inputParam.cLocalWorkDir,band+1);

unsigned short img_per_line[9216-196*2];

char *Result_byte = new char[8824*2];

fstream outResult;

outResult.open(str_256b, ios::out|ios::binary|ios::trunc);

if (outResult.fail())

{

cout<<"Can notopen nochongdieregion.raw\n";

return -2;

}

for(i=0;i<inputParam.lAP_TotalLine;i++)

{

for(j=0; j<8192;j++)

img_per_line[j]= img_raw_after[i*24576+j];

for(j=8192+22;j<8192*2; j++)

img_per_line[j-22]= img_raw_after[i*24576+j];

for(j=8192*2+22;j<8192*3; j++)

img_per_line[j-22*2]= img_raw_after[i*24576+j];

//fwrite(img_per_line, 2, 24576-22*2, fp_after);

for (int k=0;k<8824; k++)

{

Result_byte[2*k]= static_cast<char>(img_per_line[k]>>8);

Result_byte[2*k+1]= static_cast<char>(img_per_line[k]);

}

outResult.write(Result_byte,8824*2);

}

outResult.close();

delete [] Result_byte;

三.其他知识
1. GDAL的安装及使用

GDAL安装
(1)下载gdal的安装文件,http://download.osgeo.org/gdal/gdal142.zip,解压到某目录下
,如C:\gdalsrc下。

这里我们假定VC6的安装在默认目录C:\ProgramFiles\Microsoft Visual Studio8下。

(2)启动cmd,即打开控制台窗口。进入VC6的安装目录下,如cdC:\Program
Files\Microsoft
VisualStudio8\VC\bin\,在此目录下有个文件VCVARS32.BAT,执行一下这个文件,然后重新回
到C:\gdalsrc下。运行命令nmake /f makefile.vc。编译完成后,用记事本打开文件
C:\gdalsrc\nmake.opt,根据自己的情况修改GDAL_HOME=
这一行,这个指的是最终GDAL的安装
目录,比如说我们安装在C:\GDAL,那么这一行就是GDAL_HOME = "C:\GDAL",在C:\gdalsrc下执
行nmake /f makefile.vc install,然后是nmake/f makefile.vc devinstall,然后我们需要
的东西就安装到了C:\GDAL下。

错误解决:
在C:\gdalsrc目录下搜索包含“# definevsnprintf _vsnprintf”的头文件,并将其注释掉,重新从“nmake
/f makefile.vc”开始运行…..。

GDAL使用
初次使用visual studio
对工具不熟悉,有些步骤可以配置的
(1)在VS2005中新建win32控制台程序
testGDALconsole,(向导中附加选项不能选为空项目)将C:\GDAL\bin\gdal14.dll拷贝到testGDALconsole目录下的debug目录中。(否则运行时会提示找不到gdal14.dll)

(2)在工程的Libraryfiles中和Includefiles中分别添加GDAL的LIB文件目录和头文件目录,
这步我不会,就直接将gdal_priv.h拷贝到testGDALconsole.cpp所在目录下
(3)添加一个文件gdal_i.lib。使用 #pragma comment(lib,"..\\lib\\gdal_i.lib")(这步没做)

(4)程序文件
样本程序如下:
#include"stdafx.h"
#include"gdal_priv.h"
#include<iostream>
using namespace std;
int main(int argc,char* argv[])
{
if(argc!=2)
{
return 0;
}
GDALDataset *poDataset;
GDALAllRegister();
poDataset = (GDALDataset *) GDALOpen( argv[1], GA_ReadOnly );
if( poDataset != NULL )
{
cout<<"RasterXSize:"<<poDataset->GetRasterXSize()<<endl;
cout<<"RasterYSize:"<<poDataset->GetRasterYSize()<<endl;
cout<<"RasterCount:"<<poDataset->GetRasterCount()<<endl;
}
return 0;
}
调试:设置调试路径和输入图像名称

2. Modtran使用说明

采用MODO对MODTRAN的输入文件tape5进行修改,

然后选择MoDO/bin下的已有模板

进入修改界面

另存后,修改为tape5,进行运行,结果保存在tape7.scn中

[雨林木风1]在构造函数里完成

[雨林木风2]直接放在构造函数里,会报内存出错,

放在layoutFunc()之后才没问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: