public bool CopyRaster(IRasterWorkspace2 pRW, string pFileName, IRasterWorkspaceEx pWorkSpace, string pDestName) { try { IRasterDataset pRds = pRW.OpenRasterDataset(pFileName); IRasterProps pRasterProps = (IRasterProps)pRds.CreateDefaultRaster(); IRasterStorageDef pRasterStorageDef = new RasterStorageDefClass(); IRasterDef pRasterDef = new RasterDefClass(); pRasterDef.SpatialReference = pRasterProps.SpatialReference; IGeometryDef pGeoDef = new GeometryDefClass(); IGeometryDefEdit pGeoDefEdit = pGeoDef as IGeometryDefEdit; pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon; pGeoDefEdit.AvgNumPoints_2 = 4; pGeoDefEdit.GridCount_2 = 1; pGeoDefEdit.set_GridSize(0, 1000); pGeoDefEdit.SpatialReference_2 = pRasterProps.SpatialReference; IRasterDataset pRasterDataset = pWorkSpace.SaveAsRasterDataset(pDestName, pRds.CreateDefaultRaster(), pRasterStorageDef, "", pRasterDef, pGeoDef); return(true); } catch (System.Exception ex) { return(false); } }
public bool CreateRaster(IRasterDataset pRDs, IRasterWorkspaceEx pWorkSpace) { IRasterProps pRasterProps = (IRasterProps)pRDs.CreateDefaultRaster(); IRasterStorageDef pRasterStorageDef = new RasterStorageDefClass(); pRasterStorageDef.CompressionType = esriRasterCompressionType.esriRasterCompressionJPEG2000; pRasterStorageDef.CompressionQuality = 50; pRasterStorageDef.PyramidLevel = 2; pRasterStorageDef.PyramidResampleType = rstResamplingTypes.RSP_BilinearInterpolation; pRasterStorageDef.TileHeight = 128; pRasterStorageDef.TileWidth = 128; IRasterDef pRasterDef = new RasterDefClass(); pRasterDef.Description = "RasterDataset"; pRasterDef.SpatialReference = pRasterProps.SpatialReference; IGeometryDef pGeoDef = new GeometryDefClass(); IGeometryDefEdit pGeoDefEdit = pGeoDef as IGeometryDefEdit; pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon; pGeoDefEdit.AvgNumPoints_2 = 4; pGeoDefEdit.GridCount_2 = 1; pGeoDefEdit.set_GridSize(0, 1000); pGeoDefEdit.SpatialReference_2 = pRasterProps.SpatialReference; IRasterDataset pRasterDataset = pWorkSpace.CreateRasterDataset("zzy", 3, rstPixelType.PT_UCHAR, pRasterStorageDef, "", pRasterDef, pGeoDef); pRasterDataset = pRDs; return(true); }
public bool CopyRaster(IRasterWorkspace2 pRW, string pFileName, IRasterWorkspaceEx pWorkSpace, string pDestName) { try { IRasterDataset pRds = pRW.OpenRasterDataset(pFileName); IRasterProps pRasterProps = (IRasterProps)pRds.CreateDefaultRaster(); IRasterStorageDef pRasterStorageDef = new RasterStorageDefClass(); IRasterDef pRasterDef = new RasterDefClass(); pRasterDef.SpatialReference = pRasterProps.SpatialReference; IGeometryDef pGeoDef = new GeometryDefClass(); IGeometryDefEdit pGeoDefEdit = pGeoDef as IGeometryDefEdit; pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon; pGeoDefEdit.AvgNumPoints_2 = 4; pGeoDefEdit.GridCount_2 = 1; pGeoDefEdit.set_GridSize(0, 1000); pGeoDefEdit.SpatialReference_2 = pRasterProps.SpatialReference; IRasterDataset pRasterDataset = pWorkSpace.SaveAsRasterDataset(pDestName, pRds.CreateDefaultRaster(), pRasterStorageDef, "", pRasterDef, pGeoDef); return true; } catch (System.Exception ex) { return false; } }
/// <summary> /// 设置栅格存储的参数 /// </summary> /// <returns></returns> private IRasterStorageDef CreaterRasterStoreDef() { IRasterStorageDef pRasterStorageDef = new RasterStorageDefClass(); pRasterStorageDef.CompressionType = GetCompression(); pRasterStorageDef.PyramidResampleType = GetResampleTpe(); if (txtPyramid.Text.Trim() != "") { pRasterStorageDef.PyramidLevel = Convert.ToInt32(txtPyramid.Text.Trim()); } pRasterStorageDef.TileHeight = Convert.ToInt32(tileH.Text.Trim()); pRasterStorageDef.TileWidth = Convert.ToInt32(tileW.Text.Trim()); return(pRasterStorageDef); }
//������ţ�RasterCreate-03 //��������createRasterStorageDef //�������ܣ�����դ��洢���� //��ע����Щ��ϢΪArcSDE��ѡ��Ϣ�������IJ���Ҫ // public IRasterStorageDef createRasterStorageDef() { // Create rasterstoragedef IRasterStorageDef rasterStorageDef = new RasterStorageDefClass(); //ѡ��ѹ����ʽ rasterStorageDef.CompressionType = esriRasterCompressionType.esriRasterCompressionJPEG2000;// esriRasterSdeCompressionTypeEnum.esriRasterSdeCompressionTypeJPEG2000; //����ѡ��ѹ���� //rasterStorageDef.CompressionQuality=75; //ѡ��������IJ��� rasterStorageDef.PyramidLevel = 2; //ѡ��������ز����ķ��� rasterStorageDef.PyramidResampleType = rstResamplingTypes.RSP_CubicConvolution; //�ֿ�Ĵ�С rasterStorageDef.TileHeight = 128; rasterStorageDef.TileWidth = 128; return rasterStorageDef; }
//函数编号:RasterCreate-03 //函数名:createRasterStorageDef //函数功能:创建栅格存储定义 //备注:这些信息为ArcSDE可选信息,其他的不需要 // public IRasterStorageDef createRasterStorageDef() { // Create rasterstoragedef IRasterStorageDef rasterStorageDef = new RasterStorageDefClass(); //选择压缩方式 rasterStorageDef.CompressionType = esriRasterCompressionType.esriRasterCompressionJPEG2000;// esriRasterSdeCompressionTypeEnum.esriRasterSdeCompressionTypeJPEG2000; //可以选择压缩比 //rasterStorageDef.CompressionQuality=75; //选择金字塔的层数 rasterStorageDef.PyramidLevel = 2; //选择金字塔重采样的方法 rasterStorageDef.PyramidResampleType = rstResamplingTypes.RSP_CubicConvolution; //分块的大小 rasterStorageDef.TileHeight = 128; rasterStorageDef.TileWidth = 128; return(rasterStorageDef); }
private IRasterDataset CreateRasterDataset(ref IRasterDataset pRasterDataset, string name, ref IWorkspace pWorkspace, ISpatialReference pSpatialReference) { IRasterWorkspaceEx pRasterWorkspaceEx = (IRasterWorkspaceEx)pWorkspace; IRasterDataset newRasterDataset = null; IRaster pRaster = pRasterDataset.CreateDefaultRaster(); IRasterBandCollection pRasterBandCollection = (IRasterBandCollection)pRaster; int numbands = pRasterBandCollection.Count; IRasterProps pRasterProps = (IRasterProps)pRaster; rstPixelType pPixelType = pRasterProps.PixelType; IRasterStorageDef pRasterStorageDef = null; if (pRasterStorageDef == null) { pRasterStorageDef = new RasterStorageDefClass(); pRasterStorageDef.CompressionType = esriRasterCompressionType.esriRasterCompressionLZ77; pRasterStorageDef.PyramidLevel = 2; pRasterStorageDef.PyramidResampleType = rstResamplingTypes.RSP_BilinearInterpolation; pRasterStorageDef.TileHeight = 128; pRasterStorageDef.TileWidth = 128; } IRasterDef pRasterDef = new RasterDefClass(); pRasterDef.SpatialReference = pSpatialReference; pRasterDef.IsRasterDataset = true; pRasterDef.Description = "rasterdataset"; try { newRasterDataset = pRasterWorkspaceEx.CreateRasterDataset(name, numbands, pPixelType, pRasterStorageDef, "", pRasterDef, this.createGeometryDef(pSpatialReference)); return(newRasterDataset); } catch (Exception ex) { MessageBox.Show(ex.Message); return(null); } }
/// <summary> /// Creates a new raster dataset based on the template Raster. If a raster with the same outRaster name exist it will be overwritten /// </summary> /// <param name="templateRaster">a raster that has the size and shape desired</param> /// <param name="outWks">the output workspace</param> /// <param name="outRasterName">the name of the raster</param> /// <param name="numBands">the number of raster bands</param> /// <param name="pixelType">the pixel type</param> /// <param name="env">the extent</param> /// <param name="meanCellSize"> the mean Cell Size of the new raster</param> /// <param name="spRf"> the spatial reference of the raster</param> /// <returns></returns> public IRasterDataset createNewRaster(IEnvelope env, IPnt meanCellSize,IWorkspace outWks, string outRasterName, int numBands, rstPixelType pixelType, rasterType rType, ISpatialReference spRf) { outRasterName = getSafeOutputName(outWks, outRasterName); IRasterDataset3 newRstDset = null; if (outWks.Type == esriWorkspaceType.esriFileSystemWorkspace) { outRasterName = getSafeOutputName(outWks, outRasterName); string rasterTypeStr = rType.ToString(); if (rType== rasterType.IMAGINE) { rasterTypeStr = "IMAGINE Image"; outRasterName = outRasterName + ".img"; } else if (rType == rasterType.TIFF) { outRasterName = outRasterName + ".tif"; } else if (rType == rasterType.GRID) { } else if (rType == rasterType.BMP) { outRasterName = outRasterName + ".bmp"; } else if (rType == rasterType.RST) { outRasterName = outRasterName + ".rst"; } else { rasterTypeStr = "IMAGINE Image"; outRasterName = outRasterName + ".img"; } double dX = meanCellSize.X; double dY = meanCellSize.Y; IRasterWorkspace2 rsWks = (IRasterWorkspace2)outWks; newRstDset = (IRasterDataset3)rsWks.CreateRasterDataset(outRasterName, rasterTypeStr, env.LowerLeft, System.Convert.ToInt32(env.Width / dX), System.Convert.ToInt32(env.Height / dY), dX, dY, numBands, pixelType, spRf, true); } else { IRasterWorkspaceEx rsWks = (IRasterWorkspaceEx)outWks; IRasterDef rsDef = new RasterDefClass(); IRasterStorageDef rsStDef = new RasterStorageDefClass(); rsStDef.Origin = env.LowerLeft; rsStDef.CellSize = meanCellSize; rsDef.SpatialReference = spRf; newRstDset = (IRasterDataset3)rsWks.CreateRasterDataset(outRasterName, numBands, pixelType, rsStDef, null, rsDef, null); } return newRstDset; }
public bool CreateRaster(IRasterDataset pRDs, IRasterWorkspaceEx pWorkSpace) { IRasterProps pRasterProps = (IRasterProps)pRDs.CreateDefaultRaster(); IRasterStorageDef pRasterStorageDef = new RasterStorageDefClass(); pRasterStorageDef.CompressionType = esriRasterCompressionType.esriRasterCompressionJPEG2000; pRasterStorageDef.CompressionQuality = 50; pRasterStorageDef.PyramidLevel = 2; pRasterStorageDef.PyramidResampleType = rstResamplingTypes.RSP_BilinearInterpolation; pRasterStorageDef.TileHeight = 128; pRasterStorageDef.TileWidth = 128; IRasterDef pRasterDef = new RasterDefClass(); pRasterDef.Description = "RasterDataset"; pRasterDef.SpatialReference = pRasterProps.SpatialReference; IGeometryDef pGeoDef = new GeometryDefClass(); IGeometryDefEdit pGeoDefEdit = pGeoDef as IGeometryDefEdit; pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon; pGeoDefEdit.AvgNumPoints_2 = 4; pGeoDefEdit.GridCount_2 = 1; pGeoDefEdit.set_GridSize(0, 1000); pGeoDefEdit.SpatialReference_2 = pRasterProps.SpatialReference; IRasterDataset pRasterDataset = pWorkSpace.CreateRasterDataset("zzy", 3, rstPixelType.PT_UCHAR, pRasterStorageDef, "", pRasterDef, pGeoDef); pRasterDataset = pRDs; return true; }
/// <summary> /// Raster图层导入到数据库 /// </summary> /// <param name="dbWorkspace">数据库</param> /// <param name="strRasterFileDir">本地栅格图层路径</param> /// <param name="strRasterFileName">本地栅格图层名称</param> /// <param name="strOutName">数据库栅格图层名称</param> /// <returns></returns> public IRasterDataset RasterFileIntoGDB(IWorkspace dbWorkspace, string strRasterFileDir, string strRasterFileName, string strOutName) { IWorkspace pSdeWorkSpace = dbWorkspace; try { //判断是否有重名现象 IWorkspace2 pWS2 = pSdeWorkSpace as IWorkspace2; //如果名称已存在 if (pWS2.get_NameExists(esriDatasetType.esriDTRasterDataset, strOutName)) { DialogResult result; result = MessageBox.Show("栅格文件名 " + strOutName + " 在数据库中已存在!" + "\r是否覆盖?", "相同文件名", MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1); //覆盖原栅格要素 if (result == DialogResult.Yes) { IRasterWorkspaceEx pRWs = pSdeWorkSpace as IRasterWorkspaceEx; IDataset pDataset = pRWs.OpenRasterDataset(strOutName) as IDataset; pDataset.Delete(); pDataset = null; } else if (result == DialogResult.No) { //不覆盖,则退出for循环,忽略这个要素,转入下一个要素的导入 return(null); } } IWorkspaceFactory pRasterWsFac = new RasterWorkspaceFactoryClass(); IWorkspace pWs = pRasterWsFac.OpenFromFile(strRasterFileDir, 0); IRasterDataset pRasterDs = null; IRasterWorkspace pRasterWs; if (!(pWs is IRasterWorkspace)) { MessageBox.Show("错误信息:" + strRasterFileDir + "不是栅格工作空间。"); return(null); } pRasterWs = pWs as IRasterWorkspace; pRasterDs = pRasterWs.OpenRasterDataset(strRasterFileName); ISaveAs2 saveAs2 = (ISaveAs2)pRasterDs; IRasterStorageDef rasterStorageDef = new RasterStorageDefClass(); IRasterStorageDef2 rasterStorageDef2 = (IRasterStorageDef2)rasterStorageDef; rasterStorageDef2.CompressionType = esriRasterCompressionType.esriRasterCompressionJPEG2000; rasterStorageDef2.CompressionQuality = 50; rasterStorageDef2.Tiled = true; rasterStorageDef2.TileHeight = 128; rasterStorageDef2.TileWidth = 128; saveAs2.SaveAsRasterDataset(strOutName, pSdeWorkSpace, "JP2", rasterStorageDef2); return(pRasterDs); } catch (Exception ex) { MessageBox.Show("错误信息:" + ex.Message); return(null); } }
private IRasterDataset CreateRasterDataset(ref IRasterDataset pRasterDataset, string name, ref IWorkspace pWorkspace, ISpatialReference pSpatialReference) { IRasterWorkspaceEx pRasterWorkspaceEx = (IRasterWorkspaceEx)pWorkspace; IRasterDataset newRasterDataset = null; IRaster pRaster = pRasterDataset.CreateDefaultRaster(); IRasterBandCollection pRasterBandCollection = (IRasterBandCollection)pRaster; int numbands = pRasterBandCollection.Count; IRasterProps pRasterProps = (IRasterProps)pRaster; rstPixelType pPixelType = pRasterProps.PixelType; IRasterStorageDef pRasterStorageDef = null; if (pRasterStorageDef == null) { pRasterStorageDef = new RasterStorageDefClass(); pRasterStorageDef.CompressionType = esriRasterCompressionType.esriRasterCompressionLZ77; pRasterStorageDef.PyramidLevel = 2; pRasterStorageDef.PyramidResampleType = rstResamplingTypes.RSP_BilinearInterpolation; pRasterStorageDef.TileHeight = 128; pRasterStorageDef.TileWidth = 128; } IRasterDef pRasterDef = new RasterDefClass(); pRasterDef.SpatialReference = pSpatialReference; pRasterDef.IsRasterDataset = true; pRasterDef.Description = "rasterdataset"; try { newRasterDataset = pRasterWorkspaceEx.CreateRasterDataset(name, numbands, pPixelType, pRasterStorageDef, "", pRasterDef, this.createGeometryDef(pSpatialReference)); return newRasterDataset; } catch (Exception ex) { MessageBox.Show(ex.Message); return null; } }
/// <summary> /// Raster图层导入到数据库 /// </summary> /// <params name="dbWorkspace">数据库</params> /// <params name="strRasterFileDir">本地栅格图层路径</params> /// <params name="strRasterFileName">本地栅格图层名称</params> /// <params name="strOutName">数据库栅格图层名称</params> /// <returns></returns> public IRasterDataset RasterFileIntoGDB(IWorkspace dbWorkspace,string strRasterFileDir, string strRasterFileName,string strOutName) { IWorkspace pSdeWorkSpace = dbWorkspace; try { //判断是否有重名现象 IWorkspace2 pWS2 = pSdeWorkSpace as IWorkspace2; //如果名称已存在 if (pWS2.get_NameExists(esriDatasetType.esriDTRasterDataset, strOutName)) { DialogResult result; result = MessageBox.Show("栅格文件名 " + strOutName + " 在数据库中已存在!" + "\r是否覆盖?", "相同文件名", MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1); //覆盖原栅格要素 if (result == DialogResult.Yes) { IRasterWorkspaceEx pRWs = pSdeWorkSpace as IRasterWorkspaceEx; IDataset pDataset = pRWs.OpenRasterDataset(strOutName) as IDataset; pDataset.Delete(); pDataset = null; } else if (result == DialogResult.No) { //不覆盖,则退出for循环,忽略这个要素,转入下一个要素的导入 return null; } } IWorkspaceFactory pRasterWsFac = new RasterWorkspaceFactoryClass(); IWorkspace pWs = pRasterWsFac.OpenFromFile(strRasterFileDir, 0); IRasterDataset pRasterDs = null; IRasterWorkspace pRasterWs; if (!(pWs is IRasterWorkspace)) { MessageBox.Show("错误信息:" + strRasterFileDir + "不是栅格工作空间。"); return null; } pRasterWs = pWs as IRasterWorkspace; pRasterDs = pRasterWs.OpenRasterDataset(strRasterFileName); ISaveAs2 saveAs2 = (ISaveAs2)pRasterDs; IRasterStorageDef rasterStorageDef = new RasterStorageDefClass(); IRasterStorageDef2 rasterStorageDef2 = (IRasterStorageDef2)rasterStorageDef; rasterStorageDef2.CompressionType = esriRasterCompressionType.esriRasterCompressionJPEG2000; rasterStorageDef2.CompressionQuality = 50; rasterStorageDef2.Tiled = true; rasterStorageDef2.TileHeight = 128; rasterStorageDef2.TileWidth = 128; saveAs2.SaveAsRasterDataset(strOutName, pSdeWorkSpace, "JP2", rasterStorageDef2); return pRasterDs; } catch (Exception ex) { MessageBox.Show("错误信息:" + ex.Message); return null; } }
//private rstPixelType GetRasterPixelType(string strType) //{ // if (strType == rstPixelType.PT_CHAR.ToString()) // { // return rstPixelType.PT_CHAR; // } // else if (strType == rstPixelType.PT_UCHAR.ToString()) // { // return rstPixelType.PT_UCHAR; // } // else if (strType == rstPixelType.PT_SHORT.ToString()) // { // return rstPixelType.PT_SHORT; // } // else if (strType == rstPixelType.PT_USHORT.ToString()) // { // return rstPixelType.PT_USHORT; // } // else if (strType == rstPixelType.PT_LONG.ToString()) // { // return rstPixelType.PT_LONG; // } // else if (strType == rstPixelType.PT_ULONG.ToString()) // { // return rstPixelType.PT_ULONG; // } // else if (strType == rstPixelType.PT_CSHORT.ToString()) // { // return rstPixelType.PT_CSHORT; // } // else if (strType == rstPixelType.PT_CLONG.ToString()) // { // return rstPixelType.PT_CLONG; // } // else if (strType == rstPixelType.PT_FLOAT.ToString()) // { // return rstPixelType.PT_FLOAT; // } // else if (strType == rstPixelType.PT_DOUBLE.ToString()) // { // return rstPixelType.PT_DOUBLE; // } // return rstPixelType.PT_CHAR; //} //private rstResamplingTypes GetRasterResample(string strType) //{ // if (strType == "NearestNeighbor") // { // return rstResamplingTypes.RSP_NearestNeighbor; // } // else if (strType == "BilinearInterpolation") // { // return rstResamplingTypes.RSP_BilinearInterpolation; // } // else if (strType == "CubicConvolution") // { // return rstResamplingTypes.RSP_CubicConvolution; // } // else if (strType == "Majority") // { // return rstResamplingTypes.RSP_Majority; // } // return rstResamplingTypes.RSP_NearestNeighbor; //} #endregion private bool ExportToTif() { if (!txtOutData.Text.EndsWith("tif")) { MessageBox.Show("输出文件名不是tif文件!"); return(false); } String strFullName = txtOutData.Text; string strPath = System.IO.Path.GetDirectoryName(strFullName); //导出文件路径 string strName = System.IO.Path.GetFileName(strFullName); //导出文件名 try { IRasterBandCollection bandsOut = m_pRaster as IRasterBandCollection; IRasterBandCollection rasterBands = m_pRaster.RasterDataset as IRasterBandCollection; double[] dNodata; int nBandOut = 1; //IRaster pRasterOut = null; IRasterBand pBand = null; if (comboBoxExBands.SelectedIndex == 0)//所有波段 { //添加其他波段 for (int i = 3; i < rasterBands.Count; i++) { pBand = rasterBands.Item(i); bandsOut.AppendBand(pBand); } nBandOut = rasterBands.Count; } else { #region 原代码 //pRasterOut = new RasterClass(); //IRasterBandCollection pRB2 = pRasterOut as IRasterBandCollection; //pRB2.AppendBand(rasterBands.Item(comboBoxExBands.SelectedIndex - 1)); //m_pRasterProps = pRasterOut as IRasterProps; #endregion //导出单波段时,不能用Clear(),会清除图层的几何校正属性 int nOut = bandsOut.Count; for (int i = 0; i < nOut; i++) { bandsOut.Remove(i); } pBand = rasterBands.Item(comboBoxExBands.SelectedIndex - 1); bandsOut.AppendBand(pBand); } //重新设置NoData dNodata = new double[nBandOut]; if (!string.IsNullOrEmpty(textNoData.Text)) { for (int i = 0; i < nBandOut; i++) { dNodata[i] = Convert.ToDouble(textNoData.Text); } m_pRasterProps.NoDataValue = dNodata; } //else //{ // for (int i = 0; i < nBandOut; i++) // { // dNodata[i] = ClsGDBDataCommon.getNoDataValue((rasterBands.Item(i) as IRasterProps).NoDataValue);// Convert.ToDouble((rasterBands.Item(i) as IRasterProps).NoDataValue); // } // m_pRasterProps.NoDataValue = dNodata; //} IWorkspaceFactory pWSF = new RasterWorkspaceFactoryClass(); IWorkspace pWS = pWSF.OpenFromFile(System.IO.Path.GetDirectoryName(txtOutData.Text), 0); //导出时要保持分辨率和行列数 m_pRasterProps.Width = Convert.ToInt32(txtOutColumns.Text); m_pRasterProps.Height = Convert.ToInt32(txtOutRows.Text); double dcellSizeX = double.Parse(txtCellSizeX.Text); double dcellSizeY = double.Parse(txtCellSizeY.Text); IEnvelope pEnvelope = new EnvelopeClass(); pEnvelope.XMin = m_pRasterProps.Extent.UpperLeft.X; pEnvelope.YMax = m_pRasterProps.Extent.UpperLeft.Y; pEnvelope.XMax = m_pRasterProps.Extent.UpperLeft.X + m_pRasterProps.Width * dcellSizeX; pEnvelope.YMin = m_pRasterProps.Extent.UpperLeft.Y - m_pRasterProps.Height * dcellSizeY; m_pRasterProps.Extent = pEnvelope; //设置存储位数 m_pRasterProps.PixelType = (rstPixelType)cmbPixelType.SelectedIndex; ISaveAs2 pSaveAs = m_pRasterProps as ISaveAs2; IRasterStorageDef pRSDef = new RasterStorageDefClass(); IRasterStorageDef2 pRsDef2 = pRSDef as IRasterStorageDef2; //将存储栅格的分辨率设置为与原始图像相同,其实经过上面行列计算之后已经是相同的 IPnt pPntdec = new PntClass(); pPntdec.X = dcellSizeX; pPntdec.Y = dcellSizeY; pRsDef2.CellSize = pPntdec; pRsDef2.PyramidResampleType = (rstResamplingTypes)cmbResample.SelectedIndex; IRasterDataset pDataset = pSaveAs.SaveAsRasterDataset(System.IO.Path.GetFileName(txtOutData.Text), pWS, "TIFF", pRSDef); IRasterDatasetEdit3 rasterEdit3 = pDataset as IRasterDatasetEdit3; //rasterEdit3.DeleteStats();//This method is avaliable only on raster datasets in File and ArcSDE geodatabases. rasterEdit3.ComputeStatisticsHistogram(1, 1, null, true); //导出数据之后要恢复图像的原始属性 m_pRasterProps.SpatialReference = m_pSpatialRef; m_pRasterProps.Extent = m_Envelope; m_pRasterProps.Width = m_nCols; m_pRasterProps.Height = m_nRows; //加到当前地图中 IRasterLayer layerNew = new RasterLayerClass(); layerNew.CreateFromDataset(pDataset); m_pMap.AddLayer(layerNew); IActiveView activeView = m_pMap as IActiveView; activeView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); return(true); } catch (Exception exc) { MessageBox.Show(exc.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); return(false); } }
//拉伸到灰度图像 private bool stretchToGrayImage(IRaster pSrcRaster, string szOutputFilename, double dbMinThreshold = 0.02, double dbMaxThreshold = 0.98) { try { if (pSrcRaster == null || szOutputFilename == null) { return(false); } //深拷贝 IClone pSrcClone = pSrcRaster as IClone; IClone pDstClone = pSrcClone.Clone(); IRaster pDstRaster = pDstClone as IRaster; IRaster2 pDstRaster2 = pDstRaster as IRaster2; IRasterProps pRasterProps = pDstRaster as IRasterProps; //原始统计信息 bool bFlag = false; IRasterBand pRasterBand = (pDstRaster as IRasterBandCollection).Item(0); pRasterBand.HasStatistics(out bFlag); if (!bFlag) { pRasterBand.ComputeStatsAndHist(); } //得到原始栅格影像的最大最小值和步长 double dbSrcMaxValue = pRasterBand.Statistics.Maximum; double dbSrcMinValue = pRasterBand.Statistics.Minimum; double dbSrcStep = (dbSrcMaxValue - dbSrcMinValue) / 256; double dbStretchMaxValue = pRasterBand.Statistics.Maximum; double dbStretchMinValue = pRasterBand.Statistics.Minimum; #region 灰度映射,利用重分类来做 //第一次重分类 IReclassOp reclassOp = new RasterReclassOpClass(); INumberRemap numberRemap = new NumberRemapClass(); for (int i = 0; i < 256; i++) { numberRemap.MapRange(dbSrcMinValue + i * dbSrcStep, dbStretchMinValue + (i + 1) * dbSrcStep, i); } IRaster pRasterTemp = reclassOp.ReclassByRemap((IGeoDataset)(pDstRaster2.RasterDataset), (IRemap)numberRemap, true) as IRaster; IRaster2 pRasterTemp2 = pRasterTemp as IRaster2; IRasterProps pRasterTempProps = pRasterTemp as IRasterProps; //得到属性表 IRasterDatasetEdit3 pRasterDatasetEdit3 = pRasterTemp2.RasterDataset as IRasterDatasetEdit3; pRasterDatasetEdit3.ComputeStatisticsHistogram(1, 1, null, true); IRasterBand rasterBand = (pRasterTempProps as IRasterBandCollection).Item(0); IRasterHistogram rasterHistogram = rasterBand.Histogram; IRasterStatistics rasterStatistics = rasterBand.Statistics; double[] pHistogramCount = (double[])rasterHistogram.Counts; int nCurrentCount = 0; int nIndex = 0; int nPixelCount = 0;//pRasterProps.Width * pRasterProps.Height; //double dSum = 0.0; for (int i = 0; i < 256; i++) { nPixelCount += (int)pHistogramCount[i]; } //得到拉伸的最大最小值 while (Convert.ToDouble(nCurrentCount) / nPixelCount < dbMinThreshold) { nCurrentCount += Convert.ToInt32(pHistogramCount[nIndex++]); } dbStretchMinValue = nIndex * dbSrcStep + dbSrcMinValue; while (Convert.ToDouble(nCurrentCount) / nPixelCount < dbMaxThreshold) { nCurrentCount += Convert.ToInt32(pHistogramCount[nIndex++]); } dbStretchMaxValue = nIndex * dbSrcStep + dbSrcMinValue; dbSrcStep = (dbStretchMaxValue - dbStretchMinValue) / 256; #endregion #region 拉伸 INumberRemap numberRemapForStretch = new NumberRemapClass(); numberRemapForStretch.MapRange(dbSrcMinValue, dbStretchMinValue + dbSrcStep, 0); for (int i = 1; i < 255; i++) { numberRemapForStretch.MapRange(dbStretchMinValue + i * dbSrcStep, dbStretchMinValue + (i + 1) * dbSrcStep, i); } numberRemapForStretch.MapRange(dbStretchMinValue + 255 * dbSrcStep, dbSrcMaxValue, 255); IRaster pRasterStretch = reclassOp.ReclassByRemap((IGeoDataset)((pDstRaster as IRaster2).RasterDataset), (IRemap)numberRemapForStretch, true) as IRaster; IRasterProps pRasterStretchProps = pRasterStretch as IRasterProps; #region 注释代码 ////拉伸 //IPixelBlock3 pixelBlock3 = null; //IRasterCursor rasterCursor = (pDstRaster as IRaster2).CreateCursorEx(null);//null时为128*128 //do //{ // pixelBlock3 = rasterCursor.PixelBlock as IPixelBlock3; // int nWidth = pixelBlock3.Width; // int nHeight = pixelBlock3.Height; // System.Array pixels = (System.Array)pixelBlock3.get_PixelData(0); // for (int m = 0; m < nWidth; m++) // { // for (int n = 0; n < nHeight; n++) // { // double dbSrcValue = Convert.ToDouble(pixels.GetValue(m, n)); // if (double.IsNaN(dbSrcValue) || dbSrcValue == dbNoDataValue) // continue; // if (dbSrcValue >= dbStretchMaxValue) // pixels.SetValue(255, m, n); // else if (dbSrcValue <= dbStretchMinValue) // pixels.SetValue(0, m, n); // else // { // byte dbDstValue = Convert.ToByte((dbSrcValue - dbStretchMinValue) / (dbStretchMaxValue - dbStretchMinValue) * 255); // pixels.SetValue(dbDstValue, m, n); // } // } // } // pixelBlock3.set_PixelData(0, (System.Array)pixels); // //修改数据 // pRasterEdit.Write(rasterCursor.TopLeft, pixelBlock3 as IPixelBlock); // pRasterEdit.Refresh(); //} while (rasterCursor.Next() == true); #endregion #endregion #region 存储数据 IWorkspaceFactory pWorkspaceFactory = new RasterWorkspaceFactoryClass(); IWorkspace inmemWor = pWorkspaceFactory.OpenFromFile(System.IO.Path.GetDirectoryName(szOutputFilename), 0); pRasterStretchProps.PixelType = rstPixelType.PT_UCHAR; ISaveAs2 pSaveAs = pRasterStretchProps as ISaveAs2; if (pSaveAs == null) { return(false); } IRasterStorageDef pRSDef = new RasterStorageDefClass(); IRasterDataset pDataset = pSaveAs.SaveAsRasterDataset(System.IO.Path.GetFileName(szOutputFilename), inmemWor, "TIFF", pRSDef); (pDataset as IRasterDataset3).Refresh(); //IRasterEdit pRasterEdit = pDstRaster as IRasterEdit; IRasterEdit pRasterTempEdit = pRasterTemp as IRasterEdit; System.Runtime.InteropServices.Marshal.ReleaseComObject(pRasterTempEdit); IRasterEdit pRasterStretchEdit = pRasterStretch as IRasterEdit; System.Runtime.InteropServices.Marshal.ReleaseComObject(pRasterStretchEdit); #endregion return(true); } catch (System.Exception ex) { MessageBox.Show(ex.Message); return(false); } }
public IRasterDataset saveRasterToDataset(IRaster inRaster, string outName, IWorkspace wks,rasterType rastertype) { string rsTypeStr = rastertype.ToString(); string ext = ""; if (rastertype== rasterType.IMAGINE) { rsTypeStr = "IMAGINE Image"; ext = ".img"; } else if (rastertype == rasterType.HDF4) { ext = ".hdf"; } else if (rastertype == rasterType.ENV) { ext = ".hdr"; } else { ext = "." + rastertype.ToString().ToLower(); } esriWorkspaceType tp = wks.Type; if (tp == esriWorkspaceType.esriLocalDatabaseWorkspace) { rsTypeStr = rasterType.GDB.ToString(); } if (rastertype == rasterType.GRID || rastertype == rasterType.GDB) { outName = getSafeOutputName(wks, outName); if (outName.Length > 12) { outName.Substring(12); } if ((rastertype==rasterType.GRID)&&(((IRasterProps)inRaster).PixelType == rstPixelType.PT_FLOAT)) { inRaster = returnRaster(inRaster,rstPixelType.PT_FLOAT); } } else { if (outName.IndexOf(ext) == -1) { outName = outName + ext; } } if (geoUtil.ftrExists(wks, outName)) { outName = "_" + outName; } IRasterDataset rsDset = null; try { IRasterStorageDef2 rsStorDef = new RasterStorageDefClass(); rsStorDef.PyramidLevel = 0; ISaveAs2 sv = (ISaveAs2)inRaster; rsDset = (IRasterDataset)sv.SaveAsRasterDataset(outName, wks, rsTypeStr,rsStorDef); IRaster2 rs2 = (IRaster2)calcStatsAndHist(rsDset); ITable vat = rs2.AttributeTable; int rwCnt = 0; try { rwCnt = vat.RowCount(null); } catch { rwCnt = 0; } if (rwCnt > 0) { IRasterDatasetEdit2 rsDsetE = (IRasterDatasetEdit2)rsDset; rsDsetE.DeleteAttributeTable(); if (((IRasterBandCollection)rs2).Count == 1) { rsDsetE.BuildAttributeTable(); } } } catch (Exception e) { System.Windows.Forms.MessageBox.Show(e.ToString()); Console.WriteLine(e.ToString()); rsDset = ((IRaster2)returnRaster(wks.PathName + "\\" + outName)).RasterDataset; } return rsDset; }
//创建数据集(矢量数据集和影像数据集) private void button2_Click(object sender, EventArgs e) { featureWorkspace = workspace as IFeatureWorkspace; rasterWorkspace = workspace as IRasterWorkspaceEx; //定义空间参考 ISpatialReferenceFactory spatialReferenceFactory = new SpatialReferenceEnvironmentClass(); ISpatialReference spatialReference = spatialReferenceFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_Beijing1954); spatialReference.SetDomain(-1000, -1000, 1000, 1000); IEnumDatasetName enumDatasetName; IDatasetName datasetName; string dsName = ""; enumDatasetName = workspace.get_DatasetNames(esriDatasetType.esriDTFeatureDataset); datasetName = enumDatasetName.Next(); bool isExist = false; //创建矢量数据集 dsName = "SDE." + this.textBox6.Text; while (datasetName != null) { if (datasetName.Name == dsName) { isExist = true; } datasetName = enumDatasetName.Next(); } if (isExist == false) { featureDataset = featureWorkspace.CreateFeatureDataset(this.textBox6.Text, spatialReference); } //创建影像数据集 isExist = false; enumDatasetName = workspace.get_DatasetNames(esriDatasetType.esriDTRasterDataset); datasetName = enumDatasetName.Next(); dsName = "SDE." + this.textBox6.Text; while (datasetName != null) { if (datasetName.Name == dsName) { isExist = true; } datasetName = enumDatasetName.Next(); } if (isExist == false) { //设置存储参数 IRasterStorageDef rasterStorageDef = new RasterStorageDefClass(); rasterStorageDef.CompressionType = esriRasterCompressionType.esriRasterCompressionUncompressed; rasterStorageDef.PyramidLevel = 1; rasterStorageDef.PyramidResampleType = rstResamplingTypes.RSP_BilinearInterpolation; rasterStorageDef.TileHeight = 128; rasterStorageDef.TileWidth = 128; //设置坐标系统 IRasterDef rasterDef = new RasterDefClass(); ISpatialReference rasterDpatialRefrence = new UnknownCoordinateSystemClass(); rasterDef.SpatialReference = rasterDpatialRefrence; IGeometryDef geometryDef = new GeometryDefClass(); IGeometryDefEdit geometryDefedit = (IGeometryDefEdit)geometryDef; geometryDefedit.AvgNumPoints_2 = 5; geometryDefedit.GridCount_2 = 1; geometryDefedit.set_GridSize(0, 1000); geometryDefedit.GeometryType_2 = esriGeometryType.esriGeometryPolygon; ISpatialReference spatialReference2 = new UnknownCoordinateSystemClass(); geometryDefedit.SpatialReference_2 = spatialReference2; rasterDataset = rasterWorkspace.CreateRasterDataset(this.textBox7.Text, 1, rstPixelType.PT_LONG, rasterStorageDef, "DEFAULTS", rasterDef, geometryDef); } }
private void ExportToTif() { string strFloder = txtOutData.Text; for (int i = 0; i < m_pMapControl.Map.LayerCount; i++) { if (m_pMapControl.Map.get_Layer(i) is IRasterLayer) { //导入数据 IRasterLayer pRLayer = m_pMapControl.Map.get_Layer(i) as IRasterLayer; IRaster2 pRaster = pRLayer.Raster as IRaster2; IRawBlocks pRawBlocks = pRaster as IRawBlocks; IRasterInfo pRInfo = pRawBlocks.RasterInfo; IPnt pPnt = pRInfo.CellSize; double dcellSize = pPnt.X; double dcellsizeY = pPnt.Y; string sCellSize = Convert.ToInt32(dcellSize * 10).ToString(); string strFileName = "R" + sCellSize + "_" + pRLayer.Name; string strFullName = txtOutData.Text + "\\" + strFileName; //设置空间参考 ISpatialReference pSpatialRef; if (rdoLayer.Checked)//与原图相同 { IGeoDataset pGeo = (IGeoDataset)pRLayer; pSpatialRef = pGeo.SpatialReference; } else//与工作空间相同 { pSpatialRef = m_pMapControl.Map.SpatialReference; } try { //IRasterLayerExport pRLayerExport = new RasterLayerExportClass(); //pRLayerExport.RasterLayer = pRLayer; //pRLayerExport.SpatialReference = pSpatialRef; //pRLayerExport.SetSize(pRLayer.ColumnCount, pRLayer.RowCount); IWorkspaceFactory pWSF = new RasterWorkspaceFactoryClass(); IWorkspace pWS = pWSF.OpenFromFile(txtOutData.Text, 0); //IRasterDataset pRDset = pRLayerExport.Export(pWS, strFileName, "TIFF"); //System.Runtime.InteropServices.Marshal.ReleaseComObject(pRDset); IRasterProps pRasterProps = pRaster as IRasterProps; //pRasterProps.PixelType = pRInfo.PixelType; //投影发生变化,栅格的分辨率会发生变化 pRasterProps.SpatialReference = pSpatialRef; IRawBlocks pRBlocks = pRasterProps as IRawBlocks; IRasterInfo pRaInfo = pRBlocks.RasterInfo; //计算出重投影之后对应的栅格的行数和列数,行列数改变之后,它对应的栅格的分辨率也会变化为原始栅格的分辨率 //如果没有下面的计算行列的步骤,重投影之后的分辨率和原始影响的分辨率不同,行列数相同 pRasterProps.Width = Convert.ToInt32(pRasterProps.MeanCellSize().X *pRLayer.ColumnCount / dcellSize); pRasterProps.Height = Convert.ToInt32(pRasterProps.MeanCellSize().Y *pRLayer.RowCount / dcellsizeY); IEnvelope pEnvelope = new EnvelopeClass(); pEnvelope.XMin = pRasterProps.Extent.UpperLeft.X; pEnvelope.YMax = pRasterProps.Extent.UpperLeft.Y; pEnvelope.XMax = pRasterProps.Extent.UpperLeft.X + pRasterProps.Width * dcellSize; pEnvelope.YMin = pRasterProps.Extent.UpperLeft.Y - pRasterProps.Height * dcellsizeY; pRasterProps.Extent = pEnvelope; ISaveAs2 pSaveAs = pRasterProps as ISaveAs2; IRasterStorageDef pRSDef = new RasterStorageDefClass(); //将存储栅格的分辨率设置为与原始图像相同,其实经过上面行列计算之后已经是相同的 IPnt pPntdec = new PntClass(); pPntdec.X = dcellSize; pPntdec.Y = dcellsizeY; pRSDef.CellSize = pPntdec; IRasterDataset pDataset = pSaveAs.SaveAsRasterDataset(strFileName, pWS, "TIFF", pRSDef); pDataset.PrecalculateStats(0); System.Runtime.InteropServices.Marshal.ReleaseComObject(pDataset); } catch (Exception exc) { //MessageBox.Show(exc.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } } this.Close(); }