unsafe private IRasterDataProvider GetSubPrd <T>(IRasterDataProvider dstPrd, IRasterDataProvider rst, RasterIdentify rasterIdentify, int offsetX, int offsetY) { string ExtInfos = rasterIdentify.ExtInfos; rasterIdentify.ExtInfos = DateTime.Now.ToString("HHmmss"); IInterestedRaster <T> dst = new InterestedRaster <T>(rasterIdentify, new Size(rst.Width, rst.Height), rst.CoordEnvelope, rst.SpatialRef); switch (dstPrd.DataType) { case enumDataType.Int16: Int16[] dataBlock = new Int16[rst.Width * rst.Height]; fixed(Int16 *buffer = dataBlock) { IntPtr ptr = new IntPtr(buffer); dstPrd.Read(offsetX, offsetY, rst.Width, rst.Height, ptr, dstPrd.DataType, rst.Width, rst.Height, 1, new int[] { 1 }, enumInterleave.BSQ); IRasterBand bp = dst.HostDataProvider.GetRasterBand(1); bp.Write(0, 0, rst.Width, rst.Height, ptr, enumDataType.Int16, rst.Width, rst.Height); } break; case enumDataType.UInt16: UInt16[] dataBlockUint = new UInt16[rst.Width * rst.Height]; fixed(UInt16 *buffer = dataBlockUint) { IntPtr ptr = new IntPtr(buffer); dstPrd.Read(offsetX, offsetY, rst.Width, rst.Height, ptr, dstPrd.DataType, rst.Width, rst.Height, 1, new int[] { 1 }, enumInterleave.BSQ); IRasterBand bp = dst.HostDataProvider.GetRasterBand(1); bp.Write(0, 0, rst.Width, rst.Height, ptr, enumDataType.UInt16, rst.Width, rst.Height); } break; } rasterIdentify.ExtInfos = ExtInfos; return(dst.HostDataProvider); }
public unsafe void ReadMvgFile_smaller() { // _fname = @"C:\工作\3.13\SNW_DBLV_FY3A_VIRR_1000M_NULL_P001_200911131356.mvg"; IGeoDataDriver drv = GeoDataDriver.GetDriverByName("MVG"); IRasterDataProvider prd = drv.Open(_fname, enumDataProviderAccess.ReadOnly) as IRasterDataProvider; Assert.NotNull(prd); Int16[] data = new Int16[prd.Width / 2 * prd.Height]; Console.WriteLine("prd.Width = " + prd.Width); Console.WriteLine("prd.Height = " + prd.Height); int[] bandMap = { 1 }; fixed(Int16 *ptr = data) { IntPtr buffer = new IntPtr(ptr); prd.Read(0, 0, prd.Width, prd.Height, buffer, enumDataType.Int16, prd.Width / 2, prd.Height, 1, bandMap, enumInterleave.BSQ); } string dstFname = @"e:\mvg";//@"C:\工作\3.13\read"; WriteBandToFile(data, dstFname + "_smaller" + "_prdRead" + ".dat"); }
/// <summary> /// /// </summary> /// <param name="rasterFile">土地利用类型文件</param> /// <param name="dblvFile">二值图文件</param> /// <returns></returns> private unsafe string GenerateNetImageFile(string rasterFile, string dblvFile) { using (IRasterDataProvider rasterprd = GeoDataDriver.Open(rasterFile) as IRasterDataProvider) { using (IRasterDataProvider dblvprd = GeoDataDriver.Open(dblvFile) as IRasterDataProvider) { //step1:将文件转换为类型一致 IRasterDataProviderConverter converter = new RasterDataProviderConverter(); string dstFileName = MifEnvironment.GetFullFileName("1.dat"); using (IRasterDataProvider dstDataProvider = converter.ConvertDataType <UInt16, Byte>(dblvprd, enumDataType.Byte, dstFileName, (v) => { return((Byte)v); })) { //step2:裁切文件以保证大小一致 using (IRasterDataProvider sameSizeDataProvider = GetSameSizeDataProvider(rasterprd, dstDataProvider)) { byte[] dataBlock = new byte[sameSizeDataProvider.Width * sameSizeDataProvider.Height]; fixed(byte *buffer = dataBlock) { IntPtr ptr = new IntPtr(buffer); sameSizeDataProvider.GetRasterBand(1).Read(0, 0, sameSizeDataProvider.Width, sameSizeDataProvider.Height, ptr, enumDataType.Byte, sameSizeDataProvider.Width, sameSizeDataProvider.Height); sameSizeDataProvider.Read(0, 0, sameSizeDataProvider.Width, sameSizeDataProvider.Height, ptr, enumDataType.Byte, sameSizeDataProvider.Width, sameSizeDataProvider.Height, 1, new int[] { 1 }, enumInterleave.BSQ); } if (sameSizeDataProvider == null) { return(null); } //step3:生成虚拟文件 VirtualRasterDataProvider vrd = new VirtualRasterDataProvider(new IRasterDataProvider[] { sameSizeDataProvider, dstDataProvider }); //step4:遍历虚拟文件生成结果 ArgumentProvider ap = new ArgumentProvider(vrd, null); RasterPixelsVisitor <Byte> visitor = new RasterPixelsVisitor <Byte>(ap); //生成结果 MemPixelFeatureMapper <Byte> memresult = new MemPixelFeatureMapper <Byte>("NIMG", 1000, new Size(vrd.Width, vrd.Height), vrd.CoordEnvelope, vrd.SpatialRef); visitor.VisitPixel(new int[] { 1, 2 }, (index, values) => { if (values[0] == 0) { memresult.Put(index, 0); } else if (values[1] == 0) { memresult.Put(index, 100); } else if (values[1] == 1) { memresult.Put(index, (byte)(100 + values[0])); } }); //保存文件 RasterIdentify idNIMG = new RasterIdentify(dblvFile); idNIMG.ThemeIdentify = "CMA"; idNIMG.ProductIdentify = "SNW"; idNIMG.SubProductIdentify = "NIMG"; idNIMG.GenerateDateTime = DateTime.Now; idNIMG.Satellite = dblvprd.DataIdentify.Satellite; idNIMG.Sensor = dblvprd.DataIdentify.Sensor; string fileName = MifEnvironment.GetFullFileName(idNIMG.ToLongString() + ".dat"); if (File.Exists(fileName)) { idNIMG.GenerateDateTime = DateTime.Now.AddSeconds(1); } IInterestedRaster <Byte> iirNIMG = new InterestedRaster <Byte>(idNIMG, new Size(sameSizeDataProvider.Width, sameSizeDataProvider.Height), sameSizeDataProvider.CoordEnvelope.Clone(), sameSizeDataProvider.SpatialRef); iirNIMG.Put(memresult); iirNIMG.Dispose(); if (File.Exists(dstFileName)) { File.Delete(dstFileName); } return(iirNIMG.FileName); } } } } }