PIE SDK打开静止卫星数据

news/2024/7/7 23:30:56

 

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

示例代码

 1  /// <summary>
 2 /// 加载静止卫星数据
 3 /// </summary>
 4 /// <param name="sender"></param>
 5 /// <param name="e"></param>
 6 private void toolStripButton_AddStatic_Click(object sender, EventArgs e)
 7 {
 8 OpenFileDialog openFile = new OpenFileDialog();
 9 openFile.Filter = "HDF数据|*.hdf";
10 if (openFile.ShowDialog() != DialogResult.OK) return
11 
12 string channelName = "NOMChannel13";//波段名称
13 string tempTif = System.IO.Path.GetDirectoryName(openFile.FileName) + "\\NOMChannel13.tiff";//输出tiff路径
14 ISpatialReference spatialReference = new ProjectedCoordinateSystem();//目标空间参考
15 spatialReference.ImportFromUserInput("+proj=geos +h=35785863 +a=6378137.0 +b=6356752.3 +lon_0=104.7 +no_defs");
16 
17 IRasterLayer rasterLayer = OpenStaticData(openFile.FileName, channelName, tempTif, spatialReference);
18 if (rasterLayer == null) return;
19 mapControlMain.FocusMap.AddLayer(rasterLayer as ILayer);
20 mapControlMain.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
21 }
22 
23 /// <summary>
24 /// 打开风云4A、风云2G等静止卫星数据,读取指定波段数据为tiff
25 /// </summary>
26 /// <param name="filePath">hdf路径</param>
27 /// <param name="channelName">波段通道名称</param>
28 /// <param name="tiffPath">生成tiff路径</param>
29 /// <param name="spatialReference">空间参考</param>
30 /// <returns></returns>
31 private IRasterLayer OpenStaticData(string filePath, string channelName, string tiffPath, ISpatialReference spatialReference)
32 {
33 IRasterLayer rasteLayer = null;
34 //打开MultiDataset          
35 IMultiDataset hdfDataset = PIE.DataSource.DatasetFactory.OpenDataset(filePath, OpenMode.ReadOnly) as IMultiDataset;
36 if (hdfDataset == null) return null;
37 //遍历,查找指定通道的Dataset,进行数据格式转换
38 for (int i = 0; i < hdfDataset.GetDatasetCount(); i++)
39 {
40     //1、获取操作数据
41     IDataset pTempDataset = hdfDataset.GetDataset(i);
42     if (pTempDataset.Name != channelName) continue;             
43     IRasterDataset hdfRasterDatasetBand = pTempDataset as IRasterDataset;
44 
45     //2、读写栅格数据形成新的栅格数据集
46     int nWidth = hdfRasterDatasetBand.GetRasterXSize();
47     int nHeight = hdfRasterDatasetBand.GetRasterYSize();
48     PixelDataType pixDataType = hdfRasterDatasetBand.GetRasterBand(0).GetRasterDataType();
49     int bandCount = hdfRasterDatasetBand.GetBandCount();
50     int[] bandMap = new int[bandCount];
51     for (int j = 0; j < bandCount; j++)
52     {
53         bandMap[j] = j + 1;
54     }
55     UInt16[] arr = new UInt16[nWidth * nHeight * bandCount];
56     bool IsOk = hdfRasterDatasetBand.Read(0, 0, nWidth, nHeight, arr, nWidth, nHeight, pixDataType, bandCount, bandMap);
57 
58     IRasterDataset newRasterDataset = DatasetFactory.CreateRasterDataset(tiffPath, nWidth, nHeight, bandCount, pixDataType, "GTiff", null);
59     bool flag = newRasterDataset.Write(0, 0, nWidth, nHeight, arr, nWidth, nHeight, pixDataType, bandCount, bandMap);
60     newRasterDataset.SpatialReference = spatialReference;
61     newRasterDataset.GetRasterBand(0).SetNoDataValue(65535);
62 
63     //六参数,根据输入坐标的不同需要进行动态设置,本示例代码以风云4A-4000m的数据作为实验数据。
64     int beginLineNum = 0;
65     int nReslution = 4000;
66     double[] geoTransform = new double[6];
67     geoTransform[0] = -5496000;
68     geoTransform[1] = nReslution;
69     geoTransform[2] = 0;
70     geoTransform[3] = 5496000 - beginLineNum * nReslution;
71     geoTransform[4] = 0;
72     geoTransform[5] = -nReslution;
73     newRasterDataset.SetGeoTransform(geoTransform);
74 
75     (newRasterDataset as IDisposable).Dispose();
76     (hdfRasterDatasetBand as IDisposable).Dispose();
77     rasteLayer = PIE.Carto.LayerFactory.CreateDefaultLayer(tiffPath) as IRasterLayer;
78     break;
79 }
80 return rasteLayer;
81 }
View Code

2.5  示例截图

 

 

转载于:https://www.cnblogs.com/PIESat/p/10143034.html


http://lihuaxi.xjx100.cn/news/269487.html

相关文章

3D视觉应用开发--机器人3D互动四大技术难点分析

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达先回顾一下需要达成的应用场景&#xff1a;简单说就是利用3D视觉传感技术实现人与机器之间的投球互动。玩家从“准备区”投出皮球&#xff0c;经过约半秒时间穿过飞行区&a…

Android深入浅出系列之Android工具的使用—模拟器(一)

前言  我们下载的SDK包里面有一个叫“Tools”的文件夹&#xff0c;里面为我们提供了许多与Android开发相关的工具&#xff0c;其中一些是必不可少的&#xff0c;现在我们就介绍一下模拟器 Android模拟器的创建  使用“Android SDK and AVD Manager”可以很方便的创建一个An…

Module ‘celery‘ has no attribute ‘celery‘问题

Module celery has no attribute celery问题 自己查阅好多博客文章&#xff0c;也没有找到是怎么回事&#xff0c;最后自己一直调试发现celery.py文件是直接建在项目文件下了&#xff0c;改成下面方式就可以了&#xff01;

AI又进阶!除了鉴别PS图片,还能一键卸妆

作者 | 马超编辑 | 伍杏玲封图 | 视觉中国出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;最近CVPR2020的论文集合在GitHub火了&#xff0c;CVPR2020-Paper- Code 的项目&#xff08;https://github.com/extreme-assistant/CVPR2020-Paper-Code-Interpretation&#…

html景图片怎么设置百分比,8个风光照片拍摄技巧

正确处理&#xff1a;母牛欧芹和金雀花都是很诱人的前景&#xff0c;能将观者的视线引入场景之中&#xff0c;并为远处的景致构成恰如其分的框架。广角镜头加上f/22的小光圈营造出很大的景深我们一起听听著名风光摄影师亚当-伯顿怎么设置前景&#xff1a;应该指出的是&#xff…

她是直播聊学习成“网红”的北大博士,毕业后入职民办学校,年薪70万

点击上方“视学算法”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达本文募格学术撰写。参考来源&#xff1a;钱江晚报、抖音相宜视频、刘忆宁科学网博客、看看新闻、百度百科等。在北大读博时&#xff0c;她经常在短视频媒体上分享自己的学习…

typeof操作符的返回值

使用typeof操作符 对一个值使用typeof操作符可能返回下列某个字符串: 1):undefined——如果这个值未定义 2):boolean——如果这个值是布尔值 3):string——如果这个值是字符串 4):number——如果这个值是数值 5):object——如果这个值是对象或null&#xff0c;数组&#xff0c;…

ValueError: not enough values to unpack (expected 3, got 0)问题

ValueError: not enough values to unpack (expected 3, got 0)问题 检查自己的电脑上是否有eventlet库 安装 pip install eventlet 然后启动worker的时候加一个参数&#xff0c;如下&#xff1a;&#xff08;执行任务&#xff09; celery worker -A celery_tasks -l INFO…