示例#1
0
        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);
        }
示例#2
0
        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");
        }
示例#3
0
        /// <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);
                        }
                    }
                }
            }
        }