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. storm源码分析之任务分配--task assignment

    在"storm源码分析之topology提交过程"一文最后,submitTopologyWithOpts函数调用了mk-assignments函数.该函数的主要功能就是进行topo ...

  2. 实践作业3:白盒测试---细化明确任务DAY5

    收到老师给我写的评论,感觉老师真的太认真,每个博客都有仔细的,参考了老师发给我的博客,我才明白老师想要的博客内容原来是具体实际的进展记录.我们组其实这些东西早就确定了,会议也开了,但是我之前不明白博客 ...

  3. VMware下Ubuntu虚拟机NAT模式 连接Xshell

    1.Edit->Virtual NetWork Editor 2.选择NAT->NAT Settings 配置端口映射关系 很重要! Host port: 真实主机 一般是Windows端 ...

  4. javascript总结17:javascript 函数简介

    1 释义:函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. 2 格式:通过 function  关键字. function test(){ alert("您好"); } ...

  5. [转]history.back(-1)和history.go(-1)的区别

    目录: 1.这个方法的用途 2.两个方法的区别 3.总结 概述: H5页面做多了,自然就会做到页面上的返回功能,返回功能大致有两种:history.back(-1)和history.go(-1),今天 ...

  6. [python]模块及包

    一 .module 通常模块为一个文件,直接使用import来导入就好了.可以作为module的文件类型有".py".".pyo".".pyc&quo ...

  7. arp欺骗进行流量截获-1

    这边博文主要讲一下怎么使用arp欺骗进行流量截获,主要用于已经攻入内网以后,进行流量监听以及修改. 一.什么是arp     arp协议是以太网的基础工作协议,其主要作用是是一种将IP地址转化成物理地 ...

  8. 严选 Android 路由框架优化(上篇)

    0 背景 早前严选 Android 工程,使用原生 Intent 方式做页面跳转,为规范参数传递,做了编码规范,使用静态方法的方式唤起 Activity public static void star ...

  9. CENTOS7 使用 Nginx + Uwsgi 部署 Django 项目

    写在前面的话 最近总是见到有新学 Django 的朋友在部署自己的项目到 Linux 上面的时候运行不起来,所以就动手写了这篇博客. 对于不会搭建 Python 3 环境的朋友可以参考前面的博客[CE ...

  10. day1学python Hello Python

    Hello Python 本人使用的是Pycharm编译器 ----------------------------------------------- 1.输出 2.赋值 3.‘’‘/“”“ 多行 ...