PIE SDK打开静止卫星数据

Posted piesat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

打开数据集

DataSource.DatasetFactory

CreateRasterDataset

创建栅格数据集

DataSource.IRasterDataset

Read

将栅格数据读取至内存中

DataSource.IRasterDataset

Write

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

2.4  示例代码

项目路径

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

数据路径

百度云盘地址下/PIE示例数据/科学数据集HDF文件夹下数据

视频路径

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

示例代码

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);// OpenStaticData方法的定义在下面

    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;

        try

        {

            //打开MultiDataset

            IMultiDataset hdfDataset = PIE.DataSource.DatasetFactory.OpenDataset(filePath, OpenMode.ReadOnly) as IMultiDataset;

            if (hdfDataset != null)

            {

                //遍历,查找指定通道的Dataset,进行数据格式转换

                for (int i = 0; i < hdfDataset.GetDatasetCount(); i++)

                {

                    IDataset pTempDataset = hdfDataset.GetDataset(i);

                    if (pTempDataset.Name == channelName)

                    {

                        //将RasterDataset写入指定tiff

                        IRasterDataset hdfRasterDatasetBand = pTempDataset as IRasterDataset;

 

                        int nWidth = hdfRasterDatasetBand.GetRasterXSize();

                        int nHeight = hdfRasterDatasetBand.GetRasterYSize();

 

                        PixelDataType eDateType = hdfRasterDatasetBand.GetRasterBand(0).GetRasterDataType();

                        int count = hdfRasterDatasetBand.GetBandCount();

 

                        int[] bandMap = new int[count];

                        for (int j = 0; j < count; j++)

                        {

                            bandMap[j] = j + 1;

                        }

                        string[] tempList = null;

                        IPixelBuffer pixBuffer = hdfRasterDatasetBand.Read(0, 0, nWidth, nHeight, nWidth, nHeight, bandMap);

                        //创建输出栅格数据集

                        IRasterDataset tifRasterDataset = DatasetFactory.CreateRasterDataset(tiffPath, nWidth, nHeight, count, eDateType, "GTiff", tempList);

                        bool flag = tifRasterDataset.Write(0, 0, nWidth, nHeight, pixBuffer.GetData_Ref(), nWidth, nHeight, eDateType, count, bandMap);

                        tifRasterDataset.SpatialReference = spatialReference;

                        tifRasterDataset.GetRasterBand(0).SetNoDataValue(65535);

 

                        //六参数,根据输入坐标的不同需要进行动态设置,本示例代码以风云4A-4000m的数据作为实验数据。

                        int beginLineNum = 0;

                        int nReslution = 4000;

                        string beginlineNumStr = hdfDataset.GetMetadataItem("Begin_Line_Number", "");

                        if (string.IsNullOrEmpty(beginlineNumStr))

                        {

                            beginlineNumStr = hdfDataset.GetMetadataItem("geospatial_lat_lon_extent_begin_line_number", "");

                            if (string.IsNullOrEmpty(beginlineNumStr)) beginLineNum = 183;

                        }

 

                        if (!string.IsNullOrEmpty(beginlineNumStr))

                        {

                            StringBuilder sb = new StringBuilder();

                            foreach (char charStr in beginlineNumStr)

                            {

                                if ((charStr >= ‘0‘ && charStr <= ‘9‘) || charStr == ‘ ‘ || charStr == ‘-‘) sb.Append(charStr);

                            }

                            bool result = int.TryParse(sb.ToString(), out beginLineNum);

                        }

 

                        double[] geoTransform = new double[6];

                        geoTransform[0] = -5496000;

                        geoTransform[1] = nReslution;

                        geoTransform[2] = 0;

                        geoTransform[3] = 5496000 - beginLineNum * nReslution;

                        geoTransform[4] = 0;

                        geoTransform[5] = -nReslution;

                        tifRasterDataset.SetGeoTransform(geoTransform);

 

                        (tifRasterDataset as IDisposable).Dispose();

                        (hdfRasterDatasetBand as IDisposable).Dispose();

                        (pixBuffer as IDisposable).Dispose();

 

                        rasteLayer = PIE.Carto.LayerFactory.CreateDefaultLayer(tiffPath) as IRasterLayer;

                        break;

                    }

                }

            }

        }

        catch (Exception ex)

        {

            rasteLayer = null;

        }

        return rasteLayer;

        }

  

   mapControlMain.FocusMap.AddLayer(fLayer as ILayer);

   mapControlMain.ActiveView.PartialRefresh(PIE.Carto.ViewDrawPhaseType.ViewAll);

 

2.5  示例截图

 技术分享图片

 

以上是关于PIE SDK打开静止卫星数据的主要内容,如果未能解决你的问题,请参考以下文章

风云四号卫星运行的周期方向

卫星上的时间稍慢,用啥方法检测的?

如何利用GeoServer发布卫星地图服务

如何在 Global Mapper中打开谷歌卫星地图

星基增强系统(SBAS)

PIE-Engine 赋能河湖“四乱”及水环境监管