1. 功能简介

静止卫星是位于地球赤道上空约3.58万km处,与地面始终保持相对静止的卫星,静止卫星的特点是覆盖区域广,具有很强的机动灵活性,能够对特定区域进行分钟级高重复观测,可快速监测灾害目标的动态变化。目前风云2系列、风云4系列、葵花(Himawari)系列、高分4卫星均为静止卫星。

   

[静止卫星位置示意图]                                                      [卫星运行轨迹图]

        

[FY2G数据成像图]                                               [GF4数据成像图]

PIE支持静止卫星数据的显示和浏览,同时提供了针对常用静止卫星数据显示的优化方案,下面以FY4A数据为例来进行介绍。

2. 功能实现说明

2.1. FY4A数据介绍

[FY4A数据成像图]

FY4A卫星是气象卫星,其数据采用HDF方式存储,包括4000、2000、1000、500四种分辨率的数据,不同分辨率数据包括不同的通道。其各通道均为默认标称投影的全圆盘的数据,其星下点和卫星姿态等信息均存储中HDF的对应数据集下。

[FY4A数据文件截图]

[HDF Explorer查看FY4A4000分辨率数据]

HDF数据是采用了高效率压缩的数据,实现了高效的存储、分发。但却造成了数据的显示浏览缓慢(每次数据浏览,都需要从压缩文件中解压出原始数据,再获取到要显示浏览的数据),并且整个过程会占用大量的内存资源,为了保证数据的高效浏览效率,我们建议将HDF中的各通道数据生成一份支持快速浏览查看的tiff本地缓存数据,以满足浏览查看的需求。

下面我们以FY4A 4000m数据的NOMChannel13通道为例,来演示如何完成对FY4A数据的快速读取、浏览。

2.2.  实现思路及原理说明

读取静止卫星的数据的思路为把静止卫星数据中的对应通道(NOMChannel13)保存为一份本地的栅格数据,再通过对栅格数据的浏览,完成对静止卫星数据的浏览。

第一步

打开静止卫星数据为多数据集

第二步

获取指定通道的栅格数据集

第三步

读取第二步中的数据集的数据至内存中

第四步

创建与静止卫星同数据类型、同宽高、同波段数的目标栅格文件

第五步

将数据写入目标栅格数据文件

第六步

对目标栅格数据赋值空间参考和六参数

2.3.  核心接口与方法

接口/类

方法

说明

DataSource.DatasetFactory

OpenDataset

打开数据集

CreateRasterDataset

创建栅格数据集

DataSource.IRasterDataset

Read

将栅格数据读取至内存中

Write

将内存数据写入至栅格数据中

2.4  示例代码

项目路径

百度云盘地址下/PIE示例程序/03.数据加载/05.打开静止卫星数据

数据路径

百度云盘地址下/PIE示例数据/栅格数据/00.FY/FY4A/**.tif

视频路径

百度云盘地址下/PIE视频教程/03.数据加载/05.打开静止卫星数据.avi

示例代码

  /// <summary>
/// 加载静止卫星数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void toolStripButton_AddStatic_Click(object sender, EventArgs e)
{
OpenFileDialog openFile = new OpenFileDialog();
openFile.Filter = "HDF数据|*.hdf";
if (openFile.ShowDialog() != DialogResult.OK) return string channelName = "NOMChannel13";//波段名称
string tempTif = System.IO.Path.GetDirectoryName(openFile.FileName) + "\\NOMChannel13.tiff";//输出tiff路径
ISpatialReference spatialReference = new ProjectedCoordinateSystem();//目标空间参考
spatialReference.ImportFromUserInput("+proj=geos +h=35785863 +a=6378137.0 +b=6356752.3 +lon_0=104.7 +no_defs"); IRasterLayer rasterLayer = OpenStaticData(openFile.FileName, channelName, tempTif, spatialReference);
if (rasterLayer == null) return;
mapControlMain.FocusMap.AddLayer(rasterLayer as ILayer);
mapControlMain.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
} /// <summary>
/// 打开风云4A、风云2G等静止卫星数据,读取指定波段数据为tiff
/// </summary>
/// <param name="filePath">hdf路径</param>
/// <param name="channelName">波段通道名称</param>
/// <param name="tiffPath">生成tiff路径</param>
/// <param name="spatialReference">空间参考</param>
/// <returns></returns>
private IRasterLayer OpenStaticData(string filePath, string channelName, string tiffPath, ISpatialReference spatialReference)
{
IRasterLayer rasteLayer = null;
//打开MultiDataset
IMultiDataset hdfDataset = PIE.DataSource.DatasetFactory.OpenDataset(filePath, OpenMode.ReadOnly) as IMultiDataset;
if (hdfDataset == null) return null;
//遍历,查找指定通道的Dataset,进行数据格式转换
for (int i = ; i < hdfDataset.GetDatasetCount(); i++)
{
//1、获取操作数据
IDataset pTempDataset = hdfDataset.GetDataset(i);
if (pTempDataset.Name != channelName) continue;
IRasterDataset hdfRasterDatasetBand = pTempDataset as IRasterDataset; //2、读写栅格数据形成新的栅格数据集
int nWidth = hdfRasterDatasetBand.GetRasterXSize();
int nHeight = hdfRasterDatasetBand.GetRasterYSize();
PixelDataType pixDataType = hdfRasterDatasetBand.GetRasterBand().GetRasterDataType();
int bandCount = hdfRasterDatasetBand.GetBandCount();
int[] bandMap = new int[bandCount];
for (int j = ; j < bandCount; j++)
{
bandMap[j] = j + ;
}
UInt16[] arr = new UInt16[nWidth * nHeight * bandCount];
bool IsOk = hdfRasterDatasetBand.Read(, , nWidth, nHeight, arr, nWidth, nHeight, pixDataType, bandCount, bandMap); IRasterDataset newRasterDataset = DatasetFactory.CreateRasterDataset(tiffPath, nWidth, nHeight, bandCount, pixDataType, "GTiff", null);
bool flag = newRasterDataset.Write(, , nWidth, nHeight, arr, nWidth, nHeight, pixDataType, bandCount, bandMap);
newRasterDataset.SpatialReference = spatialReference;
newRasterDataset.GetRasterBand().SetNoDataValue(); //六参数,根据输入坐标的不同需要进行动态设置,本示例代码以风云4A-4000m的数据作为实验数据。
int beginLineNum = ;
int nReslution = ;
double[] geoTransform = new double[];
geoTransform[] = -;
geoTransform[] = nReslution;
geoTransform[] = ;
geoTransform[] = - beginLineNum * nReslution;
geoTransform[] = ;
geoTransform[] = -nReslution;
newRasterDataset.SetGeoTransform(geoTransform); (newRasterDataset as IDisposable).Dispose();
(hdfRasterDatasetBand as IDisposable).Dispose();
rasteLayer = PIE.Carto.LayerFactory.CreateDefaultLayer(tiffPath) as IRasterLayer;
break;
}
return rasteLayer;
}

2.5  示例截图

PIE SDK打开静止卫星数据的更多相关文章

  1. PIE SDK打开Micaps数据

    1. 功能简介 Micaps数据是气象信息处理和天气预报制作中的一种气象数据格式.其包含多种气象信息产品(地面常规气象观测数据产品.高空常规气象观测数据产品等),目前Micaps数据被Micaps软件 ...

  2. PIE SDK打开网络地图数据

    1. 数据介绍 网络地图数据是在线地图服务发布出来的数据,其支持数据的网络查看和传输,极大的促进了GIS的发展. 目前PIE SDK支持百度地图.谷歌地图.高德地图.天地图.Bing地图.ArcGIS ...

  3. PIE SDK打开HDF、NC数据

    1. 功能简介 HDF 是美国国家高级计算应用中心(National Center for Supercomputing Application)为了满足各种领域研究需求而研制的一种能高效存储和分发科 ...

  4. PIE SDK打开GDB、Dwg数据

    1. 功能简介 目前不同的GIS软件平台具有自己独特支持的数据格式,如ESRI的File GeoDataBase和Personal GeoDataBase.MapInfo的mif数据.AutoCAD的 ...

  5. PIE SDK打开长时间序列数据

    1. 功能简介 时间序列数据(time series data)是在不同时间上收集到的数据,这类数据是按时间顺序收集到的,用于所描述现象随时间变化的情况.当前随着遥感卫星技术日新月异的发展,遥感卫星的 ...

  6. PIE SDK打开矢量数据

    1. 功能简介 GIS将地理空间数据表示为矢量数据和栅格数据.矢量数据模型使用点.线和多边形来表示具有清晰空间位置和边界的空间要素,如控制点.河流和宗地等,每个要素被赋予一个ID,以便与其属性相关联. ...

  7. PIE SDK打开栅格数据

    1. 功能简介 GIS将地理空间数据表示为矢量数据和栅格数据.矢量数据模型使用点.线和多边形来表示具有清晰空间位置和边界的空间要素,如控制点.河流和宗地等,每个要素被赋予一个ID,以便与其属性相关联. ...

  8. PIE SDK打开自定义栅格数据

    1. 数据介绍 信息提取和解译的过程中,经常会生成一部分中间临时栅格数据,这些数据在执行完对应操作后就失去了存在的价值,针对这种情况,PIE增加了内存栅格数据集,来协助用户完成对自定义栅格数据的读取和 ...

  9. PIE SDK打开自定义矢量数据

    1. 数据介绍 信息提取和解译的过程中,经常会生成一部分中间临时矢量数据,这些数据在执行完对应操作后就失去了存在的价值,针对这种情况,PIE增加了内存矢量数据集,来协助用户完成对自定义矢量数据的读取和 ...

随机推荐

  1. Jlabel实现内容自动换行

    Jlabel实现内容自动换行 摘自:https://blog.csdn.net/zhhtao89/article/details/50179695   2015年12月04日 21:09:27 阅读数 ...

  2. 利用 Aspose.Words 组件,在不依赖与 Office 组件的情况下把 Word 文件转换成 HTML 代码。

    首先利用 Nuget 获取 Aspose.Words.dll public ActionResult AsposeWordsDemo() { string srcFileName = Server.M ...

  3. 高级软件测试技术(测试管理工具实践day3)

    昨天在晚上由于安装bugzilla中有一些小问题,并且需要手工安装很多perl模块  ppm install XXX(模块名称).一直到过了十二点就没有继续更博了.所以由今天更. 继昨天的安装问题之后 ...

  4. 时间日期控件的处理-Selenium

    很多人问时间日期的空间怎么处理,但是时间日期控件各种各样,你可能遇到正常点的像这样: 当然也可能遇到难点的,像这样: 当然,也不排除会遇到变态的,像这样: 呵呵,真要一个个想着怎么去选择,简直是非人类 ...

  5. 编写高质量代码改善C#程序的157个建议——建议17:多数情况下使用foreach进行循环遍历

    建议17:多数情况下使用foreach进行循环遍历 由于本建议涉及集合的遍历,所以在开始讲解本建议之前,我们不妨来设想一下如何对结合进行遍历.假设存在一个数组,其遍历模式可以采用依据索引来进行遍历的方 ...

  6. 关于spring”通配符的匹配很全面, 但无法找到元素 'context:component-scan' 的声明“的错误

    关于spring配置的问题 近日学习spring时遇到了这个问题: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreExcept ...

  7. 学习如何用VS2010创建ocx控件

    1参考文章 (1)这一篇将使用vc创建ocx控件:http://blog.csdn.net/jiadelin/article/details/2917225 (2)这一篇文章有关vs2010创建act ...

  8. Markdown使用样例

    # 欢迎使用 Cmd - 在线 Markdown 编辑阅读器 ------ 我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,**Cmd Markdown** 是 ...

  9. vSphere 安装操作系统

    0.找到 vSphere Client 安装文件并安装 1.创建完成EXSI.Openfiler - 磁盘创建 * - 网卡设置 2.openfiler LVM 3.EXSI of ISCSI 4.s ...

  10. 跟我一起读postgresql源码(三)——Rewrite(查询重写模块)

    上一篇博文我们阅读了postgresql中查询分析模块的源码.查询分析模块对前台送来的命令进行词法分析.语法分析和语义分析后获得对应的查询树(Query).在获得查询树之后,程序开始对查询树进行查询重 ...