当下,有许多优秀的程序是能够方便的从网上获得的,但是程序的作者当时解决问题时的思路可能和我们要解决问题的思路并不一样,我们并不能直接拿来使用。这时我们就要取其精华去其糟粕。本文以6S模型(气溶胶计算模型)为例,如何在自己的应用中方便调用别人的EXE来计算。
首先讲解一下6S模型,它是由Fortran语言编写的并编译生成的EXE文件,他需要多个参数输入:
1 输入卫星的几何条件(Geometrical conditions):
0-7中的数字:0.use definition(用户自定义)1.meteosat observation2.goes east observation3.goes west4.avhrr ( PM noaa ) 5.avhrr ( AM noaa )6.hrv( spot ) 7.tm( landsat )
2 根据输入对应时间,角度
3 输入大气的模型( Atmospheric model )
3 输入大气的模型( Atmospheric model )
4 输入气溶胶模型(Aerosols model)
5 输入气溶胶模型的浓度(可见度)
在集合{-1,0,>0的正值}中选一个值,我们输入v=10km
8 输入传感器的波段代号
9 输入地表状况0代表均匀1代表不均匀
10 输入RAPP 的空气校正参数
也就是说,我们在做遥感图像解析时,我们对每个像素都要输入一遍参数,才能获得6S模型在这张相片上的结果,其工作量是无法想象的,所以必须实现机器自动调用.
然而6S模型用C#等语言再重新实现一遍又过于麻烦,所以最直接的办法是我们建立一个新的程序,实现对6S,EXE的调用,自动输入数据。其实现步骤如下
using System;
using System.IO;
using System.Diagnostics;
using System.ComponentModel;
namespace Process_StandardInput_Sample
{
class StandardInputTest
{
static void Main()
{
Console.WriteLine("向目标程序中输入数据...");
// 启动 6S.exe 进程,进行重定向输入.建立一个新进程来运行目标程序。
Process myProcess = new Process();
myProcess.StartInfo.FileName = "6s.exe ";//6s.exe存放位置
//只有UseShellExecute、RedirectStandardInput进行设置才能重定向输入
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.RedirectStandardInput = true;
myProcess.Start();
//写数据流,向进程中写数据。
StreamWriter myStreamWriter = myProcess.StandardInput;
// Prompt the user for input text lines to sort.
// Write each line to the StandardInput stream of
// the sort command.
String inputText;
int numLines = 0;
FileStream fs = new FileStream("DATA.txt", FileMode.Open);//参数文件,按行排列。
StreamReader sr = new StreamReader(fs);
inputText = sr.ReadLine();
while (inputText!=null)
{
myStreamWriter.WriteLine(inputText);//程序的核心,向目标程序中写入数据。
inputText = sr.ReadLine();
numLines ++;//行数统计
}
fs.Close();
// Write a report header to the console.
if (numLines > 0)
{
Console.WriteLine(" {0} sorted text line(s) ", numLines);
Console.WriteLine("------------------------");
Console.WriteLine("按任意键结束");
Console.ReadLine();
}
else
{
Console.WriteLine(" 没有数据输入");
Console.ReadLine();
}
// End the input stream to the sort command.
// When the stream closes, the sort command
// writes the sorted text lines to the
// console.
myStreamWriter.Close();
// Wait for the sort process to write the sorted text lines.
myProcess.WaitForExit();
myProcess.Close();
}
}
}