/// <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); } } }
//采用另一种方法实现互换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); } }