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. C# 把本地文件上传到服务器上,和从服务器上下载文件

    方法一.通过Ajax方式上传文件(input file),使用FormData进行Ajax请求 <div  > <input type="file" name=& ...

  2. css总结13:CSS 伪类(Pseudo-classes)

    1 伪类作用:CSS伪类是用来添加一些选择器的特殊效果. 2 常用示例: 2.1anchor伪类:代码:   正常语法: a{color:#FF0000;}/* 文字颜色 */   伪类语法: a:l ...

  3. (转)每位设计师都应该拥有的50个CSS代码片段

    原文地址:http://www.cnblogs.com/fengyuqing/archive/2013/06/15/css_50.html 面对每年如此多的 新趋势 ,保持行业的领先是个很困难问题. ...

  4. 编写高质量代码改善C#程序的157个建议——建议4: TryParse比Parse好

    建议4: TryParse比Parse好 如果注意观察除string外的所有基元类型,会发现它们都有两个将字符串转型为本身的方法:Parse和TryParse.以类型double为例,这两个方法最简单 ...

  5. 【Android学习】实现卡片式ListView

    效果: 主要是设置xml文件 两种状态下的item card_background.xml <?xml version="1.0" encoding="utf-8& ...

  6. Git教程--廖雪峰

    Git简介 1.Git是目前世界上最先进的分布式版本控制系统(没有之一) 2.集中式和分布式版本控制系统有什么区别呢?      区别在于历史版本维护的位置:Git本地仓库包含代码库还有历史库,在本地 ...

  7. Js 正则获取Html元素

    var html = $("#summaryTemplate").html(); var imageMath = /<img [^<,>]*(?=target-t ...

  8. c# enum遍历

    public enum Suit { Spades, Hearts, Clubs, Diamonds } //遍历valueforeach (Suit suit in (Suit[]) Enum.Ge ...

  9. RequireJS 主入口加载模块经常会加载失败的问题

    在接入requirejs时,在main入口遇到了这样的问题,使用jquery,刷新10次页面会有3-4次加载失败,找不到$符号等等 require.config({ 'baseUrl': './mod ...

  10. WinForm中ListView的使用

    每一行是一个ListViewItem对象,每一项是一个ListViewSubItem对象 样式 整行选择:this.lvDataSourceSearchHistory.FullRowSelect = ...