靜止衛星是位於地球赤道上空約3.58萬km處,與地面始終保持相對靜止的衛星,靜止衛星的特色是覆蓋區域廣,具備很強的機動靈活性,可以對特定區域進行分鐘級高重複觀測,可快速監測災害目標的動態變化。目前風雲2系列、風雲4系列、葵花(Himawari)系列、高分4衛星均爲靜止衛星。緩存
[靜止衛星位置示意圖] [衛星運行軌跡圖]ide
[FY2G數據成像圖] [GF4數據成像圖]優化
PIE支持靜止衛星數據的顯示和瀏覽,同時提供了針對經常使用靜止衛星數據顯示的優化方案,下面以FY4A數據爲例來進行介紹。spa
[FY4A數據成像圖]3d
FY4A衛星是氣象衛星,其數據採用HDF方式存儲,包括4000、2000、1000、500四種分辨率的數據,不一樣分辨率數據包括不一樣的通道。其各通道均爲默認標稱投影的全圓盤的數據,其星下點和衛星姿態等信息均存儲中HDF的對應數據集下。code
[FY4A數據文件截圖]orm
[HDF Explorer查看FY4A的4000分辨率數據]視頻
HDF數據是採用了高效率壓縮的數據,實現了高效的存儲、分發。但卻形成了數據的顯示瀏覽緩慢(每次數據瀏覽,都須要從壓縮文件中解壓出原始數據,再獲取到要顯示瀏覽的數據),而且整個過程會佔用大量的內存資源,爲了保證數據的高效瀏覽效率,咱們建議將HDF中的各通道數據生成一份支持快速瀏覽查看的tiff本地緩存數據,以知足瀏覽查看的需求。blog
下面咱們以FY4A 4000m數據的NOMChannel13通道爲例,來演示如何完成對FY4A數據的快速讀取、瀏覽。教程
讀取靜止衛星的數據的思路爲把靜止衛星數據中的對應通道(NOMChannel13)保存爲一份本地的柵格數據,再經過對柵格數據的瀏覽,完成對靜止衛星數據的瀏覽。
第一步 |
打開靜止衛星數據爲多數據集 |
第二步 |
獲取指定通道的柵格數據集 |
第三步 |
讀取第二步中的數據集的數據至內存中 |
第四步 |
建立與靜止衛星同數據類型、同寬高、同波段數的目標柵格文件 |
第五步 |
將數據寫入目標柵格數據文件 |
第六步 |
對目標柵格數據賦值空間參考和六參數 |
接口/類 |
方法 |
說明 |
DataSource.DatasetFactory
|
OpenDataset |
打開數據集 |
CreateRasterDataset |
建立柵格數據集 |
|
DataSource.IRasterDataset
|
Read |
將柵格數據讀取至內存中 |
Write |
將內存數據寫入至柵格數據中 |
項目路徑 |
百度雲盤地址下/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 } |