探测地球云层分布的CloudSat和CALIPSO卫星

http://www.nasa.gov/mission_pages/calipso/main/index.html

http://www.nasa.gov/topics/earth/features/calipso-1billion.html

Cloud-Aerosol Lidar and Infrared Pathfinder Satellite Observation (CALIPSO)

The occasion was on CALIPSO's 9,491st orbit of Earth. Since its launch, on April 23, 2006, the satellite has traveled 260,198,685.3 miles. It has generated data that would fill almost 3,500 DVDs or more than 24,000 CDs, delighting scientists and researchers from 35 countries who are using the information to prove any number of theories about the atmosphere, about weather, about the past and how it will relate to the future.

数据格式

读取代码:

             double lonFrom = ;
double latFrom = ;
double lonTo = ;
double latTo = ;
OSGeo.GDAL.Gdal.AllRegister();
Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "Yes");
string path = string.Format(@"C:\Users\Desktop\lidar_track_image\CAL_LID_L1-ValStage1-V3-02.2013-01-01T18-30-59ZN_Subset.hdf", WorldSettings.StartupDirectory);
//path = string.Format(@"{0}\data\CAL_LID_L1-ValStage1-V3-02.2013-01-01T18-30-59ZN_Subset.hdf", WorldSettings.StartupDirectory);
byte[] pathUtf16 = Encoding.Unicode.GetBytes(path); byte[] byteUtf8 = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, pathUtf16); string pathUtf8 = Encoding.UTF8.GetString(byteUtf8); Encoding encoud = Encoding.GetEncoding();
byte[] byteGb2312 = Encoding.Convert(Encoding.Unicode, encoud, pathUtf16);
string pathGb2312 = encoud.GetString(byteGb2312); if (!File.Exists(path))
{
MessageBox.Show("Calpso数据不存在", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
//读取文件,获取子数据集信息
Dataset ds = Gdal.Open(path, Access.GA_ReadOnly);
string[] stMetadata = ds.GetMetadata("");
string[] strMetadata = ds.GetMetadata("SUBDATASETS");
string info = string.Empty;
for (int i = ; i < strMetadata.Length; i++)
{
info += strMetadata[i] + "\n";
}
info += "读取波段数据:----------------\n";
//纬度数据
string tmpstr = strMetadata[];
tmpstr = tmpstr.Substring(tmpstr.IndexOf("=") + );
Dataset dsLat = Gdal.Open(tmpstr, Access.GA_ReadOnly);
string strMetadata2 = dsLat.GetDescription(); info += string.Format("像素数目:{0} X {1}", dsLat.RasterXSize, dsLat.RasterYSize);
int count = dsLat.RasterCount;
Band bandLat = dsLat.GetRasterBand();
int Cols = dsLat.RasterXSize;
int Rows = dsLat.RasterYSize;
int width = dsLat.RasterXSize;
int height = dsLat.RasterYSize;
double min, max, no;
int hasvalue;
info += string.Format("类型Lat:{0}\n", bandLat.DataType);
if (bandLat.DataType == DataType.GDT_Float32)
{
bandLat.GetMaximum(out max, out hasvalue);
bandLat.GetMinimum(out min, out hasvalue);
bandLat.GetNoDataValue(out no, out hasvalue);
float[] data = new float[Cols * Rows];
bandLat.ReadRaster(, , width, height, data, Cols, Rows, , ); string ddd = string.Empty;
double min1, max1, mean, hasvalue1;
OSGeo.GDAL.Gdal.GDALProgressFuncDelegate dele = new Gdal.GDALProgressFuncDelegate(GDALProgressFunc);
bandLat.ComputeStatistics(false, out min1, out max1, out hasvalue1, out mean, dele, ddd);
lonFrom = data[];
lonTo = data[data.Length - ];
}
//经度数据
string tmpstrLon = strMetadata[];
tmpstrLon = tmpstrLon.Substring(tmpstrLon.IndexOf("=") + );
Dataset dsLon = Gdal.Open(tmpstrLon, Access.GA_ReadOnly);
info += string.Format("像素数目:{0} X {1}", dsLon.RasterXSize, dsLon.RasterYSize);
Band bandLon = dsLon.GetRasterBand();
int Cols2 = dsLon.RasterXSize;
int Rows2 = dsLon.RasterYSize;
int width2 = dsLon.RasterXSize;
int height2 = dsLon.RasterYSize;
double min2, max2, no2;
int hasvalue2;
info += string.Format("类型Lon:{0}\n", bandLon.DataType);
if (bandLon.DataType == DataType.GDT_Float32)
{
bandLon.GetMaximum(out max2, out hasvalue2);
bandLon.GetMinimum(out min2, out hasvalue2);
bandLon.GetNoDataValue(out no2, out hasvalue2);
float[] data2 = new float[Cols2 * Rows2];
bandLon.ReadRaster(, , width2, height2, data2, Cols2, Rows2, , ); string ddd = string.Empty;
double min1, max1, mean, hasvalue1;
OSGeo.GDAL.Gdal.GDALProgressFuncDelegate dele = new Gdal.GDALProgressFuncDelegate(GDALProgressFunc);
bandLon.ComputeStatistics(false, out min1, out max1, out hasvalue1, out mean, dele, ddd);
latFrom = data2[];
latTo = data2[data2.Length - ];
}
//读取雷达衰减系数
string tmpStrBackScatter = strMetadata[];
tmpStrBackScatter = tmpStrBackScatter.Substring(tmpStrBackScatter.IndexOf("=") + );
Dataset dsBackScatter = Gdal.Open(tmpStrBackScatter, Access.GA_ReadOnly);
info += string.Format("像素数目:{0} X {1}", dsBackScatter.RasterXSize, dsBackScatter.RasterYSize);
Band bandBackScatter = dsBackScatter.GetRasterBand();
int ColsBackScatter = dsBackScatter.RasterXSize;
int RowsBackScatter = ;// ds270.RasterYSize;读取3000个像素
int widthBackScatter = dsBackScatter.RasterXSize;
int heightBackScatter = ;// ds270.RasterYSize;
double min270, max270, no270;
int hasvalue270;
info += string.Format("类型衰减系数:{0}\n", bandBackScatter.DataType);
if (bandBackScatter.DataType == DataType.GDT_Float32)
{
bandBackScatter.GetMaximum(out max270, out hasvalue270);
bandBackScatter.GetMinimum(out min270, out hasvalue270);
bandBackScatter.GetNoDataValue(out no270, out hasvalue270);
string ddd = string.Empty;
double mean, has; OSGeo.GDAL.Gdal.GDALProgressFuncDelegate dele = new Gdal.GDALProgressFuncDelegate(GDALProgressFunc);
bandBackScatter.ComputeStatistics(false, out min270, out max270, out has, out mean, dele, ddd);
float[] data270 = new float[ColsBackScatter * RowsBackScatter];
bandBackScatter.ReadRaster(, , widthBackScatter, heightBackScatter, data270, ColsBackScatter, RowsBackScatter, , ); int x1width = heightBackScatter;
int y1height = widthBackScatter;//
Bitmap bitmap = new Bitmap(x1width, y1height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
int iPixelSize = ; CreateColorRamp createColorRamp = CreateColorRamps();
BitmapData bitmapdata = bitmap.LockBits(new Rectangle(, , x1width, y1height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
try
{
unsafe
{
for (int y = ; y < y1height; y++)
{
byte* row = (byte*)bitmapdata.Scan0 + (y * bitmapdata.Stride); for (int x = ; x < x1width; x++)
{
//int posSrc = x + y * x1width;
int posSrc = y + x * y1height;//图像顺时针旋转90度
double item = data270[posSrc];
if (item == no270)
{
Color? getColor = getColor = createColorRamp.GetColor(); ;
row[x * iPixelSize] = (byte)getColor.Value.B;
row[x * iPixelSize + ] = (byte)getColor.Value.G;
row[x * iPixelSize + ] = (byte)getColor.Value.R;
row[x * iPixelSize + ] = getColor.Value.A;
}
else
{
Color? getColor = null;
if (item < 0.0001 || item > 0.1)
{
getColor = createColorRamp.GetColor();
}
else
{
getColor = createColorRamp.GetColor(item);
}
if (getColor != null)
{
row[x * iPixelSize] = getColor.Value.B;
row[x * iPixelSize + ] = getColor.Value.G;
row[x * iPixelSize + ] = getColor.Value.R;
row[x * iPixelSize + ] = getColor.Value.A;
}
}
}
}
}
}
catch
{
}
finally
{
bitmap.UnlockBits(bitmapdata);
}
bitmap.Save("D:\\b.png");
Vector3d v1 = new Vector3d(lonFrom, latFrom, );
Vector3d v2 = new Vector3d(lonTo, latTo, );
Vector3d dir = v2 - v1; Vector3d v3 = v1 + (double)heightBackScatter / dsBackScatter.RasterYSize * dir.Normalize();
CalpsoRenderObject obj = new CalpsoRenderObject("", v1, v3);
}
  public CreateColorRamp CreateColorRamps()
{
CreateColorRamp createColorRamp = new CreateColorRamp();
List<ColorRamp> mColorRamp = new List<ColorRamp>();
double[] valueGray = new double[] {0.0, 0.0001,0.0002,0.0003,0.0004,0.0005,
0.0006,0.0007,0.0008,0.0009,0.001,
0.0015,0.002, 0.0025,0.003, 0.0035,
0.004, 0.0045,0.005, 0.0055, 0.006,
0.0065,0.007, 0.0075,0.008, 0.01,
0.02, 0.03, 0.04, 0.05, 0.06,
0.07, 0.08, 0.09, 0.1};
int[] Rv = new int[] {, , , , , , , , , , ,
,,,,,,,,,,
,,,,,,,,,,
,,,};
int[] Gv = new int[] {,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,
,,,};
int[] Bv = new int[] {,,,,,,,,,,
,,,,,,,,,,,
,,,,, ,,,,,
,,,}; for (int i = ; i < ; i++)
{
ColorRamp clr = new ColorRamp();
clr.start = valueGray[i];
if (i < )
{
clr.end = valueGray[i + ];
}
clr.ColorS = Color.FromArgb(, Rv[i], Gv[i], Bv[i]);
mColorRamp.Add(clr);
}
mColorRamp[mColorRamp.Count - ].end = ;
createColorRamp.ColorRampCollection = mColorRamp;
return createColorRamp;
}
int GDALProgressFunc(double Complete, IntPtr Message, IntPtr Data)
{
return ;
}

CreateColorRamp

  public class ColorRamp
{
public double start;
public double Interval;
public double end; public Color ColorS;
}
public class CreateColorRamp
{
public List<ColorRamp> ColorRampCollection { get; set; }
public Color? GetColor(double val)
{
if (ColorRampCollection == null)
{
throw new ArgumentNullException("颜色分级设置为空");
}
for (int i = ; i < ColorRampCollection.Count; i++)
{
ColorRamp colorRam = ColorRampCollection[i];
if (val >= colorRam.start && val < colorRam.end)
{
return colorRam.ColorS;
}
}
return null; }
}
}

GDAL C#封装还是没有解决中文字符的问题。C# 采用Unicode,GDAL的Dll采用多字节字符。所以只能在C++的代码中做些工作,将Unicode转换为多字节字符或者是Utf8。准备测试一下。

NASA上的图片:

[GDAL]读取HDF格式的calipso数据的更多相关文章

  1. GDAL打开HDF格式时遇到的中文路径问题(未解决)

    众所周知,中文环境下(VS2010 C++工程编码为多字节编码),在使用1.8.0版本以后的GDAL打开中文路径下的影像文件(如GeoTiff文件)时, 需对中文文件路径做特殊处理,有2种方法:(我使 ...

  2. pyhton读取json格式的气象数据

    原文关于读取pm25.in气象数据的pyhton方法,以及浅析python json的应用 以pm25.in网站数据为例. 1.方法介绍 首先感谢pm25.in提供了优质的空气污染数据,为他们的辛勤劳 ...

  3. Android读取JSON格式数据

    Android读取JSON格式数据 1. 何为JSON? JSON,全称为JavaScript Object Notation,意为JavaScript对象表示法. JSON 是轻量级的文本数据交换格 ...

  4. R语言笔记001——读取csv格式数据

    读取csv格式数据 数据来源是西南财经大学 司亚卿 老师的课程作业 方法一:read.csv()函数 file.choose() read.csv("C:\\Users\\Administr ...

  5. C语言函数sscanf()的用法-从字符串中读取与指定格式相符的数据(转)

    C语言函数sscanf()的用法 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( string str, string fmt, mixed var ...

  6. 读取xml格式的字符串和上下文中的xml数据

    1.读取xml格式的字符串 假设有一段下面的xml格式的字符串: <xml>     <return_code><![CDATA[SUCCESS]]></re ...

  7. GDAL读取的坐标起点在像素左上角还是像素中心?

    目录 1. 问题 2. 结论 3. 例外 1. 问题 笔者在处理地理栅格数据的时候,总是会发生偏差半个像素的问题. 比如说通过ArcMap打开一张.tif,查看其地理信息:同时用记事本打开.tfw,比 ...

  8. GDAL读取Shp问题解决:Unable to open EPSG support file gcs.csv

    在GIS软件的开发中,经常用到开源库GDAL读取Shp数据,当shp数据中包含投影信息时,可能会遇到“Unable to open EPSG support file gcs.csv”错误提示,该错误 ...

  9. FY2E HDF格式数据处理绘图

    圆盘标称投影数据时静止气象卫星常见的数据产品,比如FY2E静止气象卫星就有很多这样的产品(可以从国家卫星气象中心网站上下载).所谓的圆盘标称投影就是Geostationary投影,主要的投影参数有中央 ...

随机推荐

  1. 对于flat_interface与public_interface的理解

    对于这两个interface含义的理解一波三折,下面我把各种理解都记录下来.   2014-9-23   #可以把flat_interface理解为Openstack整套生态系统内部的网络接口,内部各 ...

  2. Excel 中单元格和范围的引用(即访问的表示方法)

    计算机中,无非是数据和数据的处理这两件事.Excel的工作表能存储大量数据,除了这些原始数据,我们还要用函数来处理这些数据,比如求和求积,求平均值,排序等等,并把处理结果也存在单元格里.在Excel中 ...

  3. Web 在线文件管理器学习笔记与总结(5)修改文件内容

    ① 读出要修改的文件的内容 ② 进行修改 ③ 将修改后的内容写进文件 index.php: <?php require 'dir.func.php'; require 'file.func.ph ...

  4. PHP测试用例练习

    本测试用例是一个判断三角形类型的练习测试用例,基于Netbeans 8.1IDE环境,和phpunit-5.2.10以及脚手架工具phpunit-skelgen-2.0.1.具体的环境搭建可参照: h ...

  5. HTML标签之间不是可以随便嵌套的

    深究:我们先来认识in-line内联元素和block-line块元素,因为HTML里几乎所有元素都属于内联元素或者块元素中的一种. in-line这个词有很多种解释:内嵌.内联.行内.线级等,但是,它 ...

  6. Linux+postfix+extmail+dovecot打造基于web页面的邮件系统

    原文地址:http://blog.csdn.net/deansrk/article/details/6717720 最终效果图: 准备阶段:需要手动下载的软件包: postfix-2.6.5.tar. ...

  7. Aliasing 走样

    Computer Science An Overview _J. Glenn Brookshear _11th Edition Have you ever noticed the weird &quo ...

  8. Delphi 200X、XE中如何用并行实现循环的计算

    interface uses Classes, SysUtils; type TParallelProc = reference to procedure(i: Integer; ThreadID: ...

  9. bpel 之伙伴

    一.伙伴链接类型(Partner Link Types) 1.交互过程 伙伴之间的交互过程共分为两种典型情况: 流程调用伙伴后同步等待返回结果.这种情况通常是伙伴能很快返回结果,流程不需要等待很长时间 ...

  10. Ubuntu 14.04 LTS 64bit 编译SDL的问题

    http://blog.csdn.net/jhting/article/details/38523945 Ubuntu 14.04 LTS 64bit 编译SDL的问题 分类: C/C++2014-0 ...