探测地球云层分布的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. 【新产品发布】EVC9001 USB 隔离器

     一. 简介 EVC9001采用Analog Device 公司的基于芯片级变压器的iCoupler 磁耦合隔离方案,完成了对USB接口双向隔离功能,隔离电压达 2500V(隔离电源模块 3000V隔 ...

  2. beta-2阶段组员贡献分分配

    组名:天天向上 组长:王森 组员:张政.张金生.林莉.胡丽娜 bera-2阶段各组员的贡献分分配如下: 姓名 个人工作量 组长评价 个人评价 团队贡献总分 胡丽娜 9 4 4 4.25 林莉 9 4 ...

  3. JavaWEB入门

    首先,我们已知的是Web资源分为:静态web资源(如html 页面):指web页面中供人们浏览的数据始终是不变.常用的静态web开发技术即为html:动态web 资源:指web页面中供人们浏览的数据是 ...

  4. shopnc编译安装IM服务器node.js

    编译安装IM服务器node.js下载地址http://www.nodejs.org/download/ 选择Source Code node-v0.12.0 #  ./configure # make ...

  5. twitter storm源码走读之8 -- TridentTopology创建过程详解

    欢迎转载,转载请注明出处,徽沪一郎. 从用户层面来看TridentTopology,有两个重要的概念一是Stream,另一个是作用于Stream上的各种Operation.在实现层面来看,无论是str ...

  6. CodeIgniter 发送邮件

    1. 在config目录中增加email.php $config['charset'] = 'utf-8'; $config['wordwrap'] = TRUE; $config['protocol ...

  7. php中json_decode()和json_encode()的使用方法

    php中json_decode()和json_encode()的使用方法 作者: 字体:[增加 减小] 类型:转载   json_decode对JSON格式的字符串进行编码而json_encode对变 ...

  8. Jquery--string

    --判断string是否为空 state !== undefined || state !== null || state != ""

  9. wordpress 添加自定义菜单到管理面板(wp-admin)

    如果你在做 wordpress 主题或插件的开发,通常需要在后台dashboard管理面板添加菜单方便用户做主题设置或插件设置.这篇文章要讨论的问题就是怎么样加这个菜单,加在哪里? 添加顶级菜单项 a ...

  10. add active class

    根据URI添加菜单的active css class Active item item in menu: <?php function aim($page) { if(stristr($_SER ...