Example #1
0
        /// <summary>
        /// Occurs when this command is clicked
        /// </summary>
        public override void OnClick()
        {
            // TODO: Add CmdRasterResample.OnClick implementation
            IMapControl2 pMapCtr = (((IToolbarControl)m_hookHelper.Hook).Buddy) as IMapControl2;

            if (pMapCtr != null)
            {
                m_frmRasterResample = new FrmRasterResample();
                IRasterProps pRasterProps = pRasterLayer.Raster as IRasterProps;
                m_frmRasterResample.Cellsize = pRasterProps.MeanCellSize().X;
                if (m_frmRasterResample.ShowDialog() == DialogResult.OK)
                {
                    IGeoDataset         pGeodataset         = pRasterLayer.Raster as IGeoDataset;
                    IRasterGeometryProc pRasterGeometryProc = new RasterGeometryProcClass();
                    ITransformationOp   pTransOP            = new RasterTransformationOpClass();
                    string name = pRasterLayer.Name;
                    if (m_frmRasterResample.resampleType == 0)
                    {
                        IGeoDataset pGeodataset2 = pTransOP.Resample(pGeodataset, m_frmRasterResample.Cellsize, esriGeoAnalysisResampleEnum.esriGeoAnalysisResampleNearest);
                        pRasterLayer.CreateFromDataset(pGeodataset2 as IRasterDataset);
                        pRasterLayer.Name = name;
                    }
                    if (m_frmRasterResample.resampleType == 1)
                    {
                        IGeoDataset pGeodataset2 = pTransOP.Resample(pGeodataset, m_frmRasterResample.Cellsize, esriGeoAnalysisResampleEnum.esriGeoAnalysisResampleBilinear);
                        pRasterLayer.CreateFromDataset(pGeodataset2 as IRasterDataset);
                        pRasterLayer.Name = name;
                    }
                    if (m_frmRasterResample.resampleType == 2)
                    {
                        IGeoDataset pGeodataset2 = pTransOP.Resample(pGeodataset, m_frmRasterResample.Cellsize, esriGeoAnalysisResampleEnum.esriGeoAnalysisResampleCubic);
                        pRasterLayer.CreateFromDataset(pGeodataset2 as IRasterDataset);
                        pRasterLayer.Name = name;
                    }
                    pMapCtr.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewAll, null, null);
                }
            }
        }
Example #2
0
        //采用另一种方法实现互换XY,不会改变影像的分辨率
        public bool NorthEastToEastNorth(IRasterLayer pRasterLayer, string szFilename)//坐标系x,y变换
        {
            if (pRasterLayer == null || szFilename == null)
            {
                return(false);
            }

            try
            {
                ITransformationOp          dstTrans = new RasterTransformationOpClass();
                IRasterAnalysisEnvironment pDstAnalysisEnvironment = dstTrans as IRasterAnalysisEnvironment;
                if (pDstAnalysisEnvironment == null)
                {
                    return(false);
                }

                //设置分辨率
                IRaster2     pRaster2       = pRasterLayer.Raster as IRaster2;
                IRasterProps pProps         = pRaster2 as IRasterProps;
                double       dbCellSizeX    = pProps.MeanCellSize().X;
                double       dbCellSizeY    = pProps.MeanCellSize().Y;
                double       dbCellSizeMean = (dbCellSizeX + dbCellSizeY) / 2;
                //pDstAnalysisEnvironment.SetCellSize(esriRasterEnvSettingEnum.esriRasterEnvValue, dbCellSizeMean);

                //定义原始数据集和目标数据集
                IGeoDataset pSrcGeoDataset = pRasterLayer.Raster as IGeoDataset;
                IGeoDataset pDstGeoDataset = null;
                IGeoDataset pTmpGeoDataset = null;

                //顺时针旋转90度
                IPoint pt = new PointClass();
                pt.X           = 0;
                pt.Y           = 0;
                pTmpGeoDataset = dstTrans.Rotate(pSrcGeoDataset, esriGeoAnalysisResampleEnum.esriGeoAnalysisResampleCubic, 90, pt);
                //pDstGeoDataset = pTmpGeoDataset;

                //水平旋转
                pSrcGeoDataset = dstTrans.Flip(pTmpGeoDataset);

                //由于翻转是以图像中心为界,所以要加上偏移量
                IEnvelope pExtent   = pSrcGeoDataset.Extent;
                double    dbCenterY = (pExtent.UpperLeft.Y + pExtent.LowerRight.Y) / 2;
                double    dbDeltaX  = 0;
                double    dbDeltaY  = -dbCenterY * 2;
                //pDstGeoDataset = dstTrans.Flip(pTmpGeoDataset);
                pDstGeoDataset = dstTrans.Shift(pSrcGeoDataset, dbDeltaX, dbDeltaY, null);
                if (pDstGeoDataset == null)
                {
                    return(false);
                }

                IRasterLayer pLayer = new RasterLayerClass();
                pLayer.CreateFromDataset(pDstGeoDataset as IRasterDataset);


                IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass();
                IWorkspace        inmemWor         = workspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(szFilename), 0);
                ISaveAs2          sa = pDstGeoDataset as ISaveAs2;
                //IRaster2 pR2 = ((IRasterDataset3)pDstGeoDataset).CreateDefaultRaster() as IRaster2;
                IRaster2    pR2 = pLayer.Raster as IRaster2;
                IRasterEdit pRe = pR2 as IRasterEdit;

                //pRe.Refresh();
                // sa = ((IRasterDataset3)pDstGeoDataset).CreateDefaultRaster() as ISaveAs2;
                sa = pRe as ISaveAs2;
                if (sa != null)
                {
                    sa.SaveAs(System.IO.Path.GetFileName(szFilename), inmemWor, "TIFF");
                    //sa.SaveAsRasterDataset()
                    pRe.Refresh();
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(pRe);
                    (pDstGeoDataset as IRasterDataset3).Refresh();
                }

                IRasterEdit pRasterEdit = pRaster2 as IRasterEdit;
                System.Runtime.InteropServices.Marshal.ReleaseComObject(pRasterEdit);
                return(true);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
                return(false);
            }
        }