PIE SDK打開靜止衛星數據

 

1. 功能簡介

    靜止衛星是位於地球赤道上空約3.58萬km處,與地面始終保持相對靜止的衛星,靜止衛星的特色是覆蓋區域廣,具備很強的機動靈活性,可以對特定區域進行分鐘級高重複觀測,可快速監測災害目標的動態變化。目前風雲2系列、風雲4系列、葵花(Himawari)系列、高分4衛星均爲靜止衛星。緩存

     

[靜止衛星位置示意圖]                                                      [衛星運行軌跡圖]ide

        

[FY2G數據成像圖]                                               [GF4數據成像圖]優化

    PIE支持靜止衛星數據的顯示和瀏覽,同時提供了針對經常使用靜止衛星數據顯示的優化方案,下面以FY4A數據爲例來進行介紹。spa

2. 功能實現說明

2.1. FY4A數據介紹

 

[FY4A數據成像圖]3d

    FY4A衛星是氣象衛星,其數據採用HDF方式存儲,包括4000、2000、1000、500四種分辨率的數據,不一樣分辨率數據包括不一樣的通道。其各通道均爲默認標稱投影的全圓盤的數據,其星下點和衛星姿態等信息均存儲中HDF的對應數據集下。code

 

[FY4A數據文件截圖]orm

 

[HDF Explorer查看FY4A4000分辨率數據]視頻

    HDF數據是採用了高效率壓縮的數據,實現了高效的存儲、分發。但卻形成了數據的顯示瀏覽緩慢(每次數據瀏覽,都須要從壓縮文件中解壓出原始數據,再獲取到要顯示瀏覽的數據),而且整個過程會佔用大量的內存資源,爲了保證數據的高效瀏覽效率,咱們建議將HDF中的各通道數據生成一份支持快速瀏覽查看的tiff本地緩存數據,以知足瀏覽查看的需求。blog

    下面咱們以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     //一、獲取操做數據
41     IDataset pTempDataset = hdfDataset.GetDataset(i);
42     if (pTempDataset.Name != channelName) continue;             
43     IRasterDataset hdfRasterDatasetBand = pTempDataset as IRasterDataset;
44 
45     //二、讀寫柵格數據造成新的柵格數據集
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  示例截圖

 

相關文章
相關標籤/搜索