探测地球云层分布的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. MySQL助理配置

    基本配置 你需要经常察看以下3个配置项.不然,可能很快就会出问题. innodb_buffer_pool_size:这是你安装完InnoDB后第一个应该设置的选项.缓冲池是数据和索引缓存的地方:这个值 ...

  2. Solr学习笔记之1、环境搭建

    Solr学习笔记之1.环境搭建 一.下载相关安装包 1.JDK 2.Tomcat 3.Solr 此文所用软件包版本如下: 操作系统:Win7 64位 JDK:jdk-7u25-windows-i586 ...

  3. 《Java核心技术卷二》笔记(一)流与文件

    一.流的概念 在Java中,可以提供字节序列的对象,或者可以接收字节序列的对象,都可以抽象成流.系统中的文件,网络,内存这些设备都可以读入或者写入字节,自然也可以用流的方式来操作.能向程序中提供字节序 ...

  4. Apache Spark源码走读之16 -- spark repl实现详解

    欢迎转载,转载请注明出处,徽沪一郎. 概要 之所以对spark shell的内部实现产生兴趣全部缘于好奇代码的编译加载过程,scala是需要编译才能执行的语言,但提供的scala repl可以实现代码 ...

  5. xml追加节点

    添加方法 public void XmlAppend(VisitM vm) { XmlDocument xmldoc = new XmlDocument(); string path = Server ...

  6. 不绑架输入--document.getElementById("linkage_"+id_type+"_echo").value="";--联动

    <script> function w_linkage(id_type) { var selected = $("#linkage_"+id_type+"_t ...

  7. Error:(12) No resource identifier found for attribute 'titles' in package 'com.itheima52.mobilesafe5

    http://stackoverflow.com/questions/5819369/error-no-resource-identifier-found-for-attribute-adsize-i ...

  8. Oracle数值处理函数 (绝对值、取整...)

    1.绝对值:abs()    select abs(-2) value from dual; 2.取整函数(大):ceil()    select ceil(-2.001) value from du ...

  9. Qt 之 去除窗口部件被选中后的焦点虚线框(设置Qt::NoFocus即可)

    http://blog.csdn.net/goforwardtostep/article/details/53420529

  10. pointer-events:none;穿透属性

    从属性字面上看可以理解为:手势时间无效. 当我们在ios下想复制一段文字是,不知道原因导致一些莫名的怪异现象:总是无法复制文字,却意外的发现无论怎么着复制的始终都是图片时, 当我们在一个半透明遮罩上想 ...