• PIE SDK打开静止卫星数据


     

    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  示例截图

     

  • 相关阅读:
    eclipse中svn的各种状态图标详解
    Invalid configuation file. File "**********" was created by a VMware product with more feature than this version of VMware Workstation and cannot be
    linux下tomcat无法访问问题(换一种说法:无法访问8080端口)
    安装MySQL start Service(无法启动服务)
    eclipse下SVN subclipse插件
    tomcat启动窗口中的时间与系统时间不一致
    关于如果从SQLSERVER中获取 数据库信息 或者 表信息
    有关google的appengine部署服务器的简单教程
    部署到Google App Engine时中途退出后引起的问题
    重温WCF之数据契约中使用枚举(转载)(十一)
  • 原文地址:https://www.cnblogs.com/PIESat/p/10143034.html
Copyright © 2020-2023  润新知