private void btnOK_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(cmbSource.Text) || string.IsNullOrEmpty(cmbRegion.Text) || string.IsNullOrEmpty(txtTarget.Text)) { return; } try { //得到图层 ILayer pSourceLayer = ClsGDBDataCommon.GetLayerFromName(m_mapControl.Map, cmbSource.Text); ILayer pRegionLayer = ClsGDBDataCommon.GetLayerFromName(m_mapControl.Map, cmbRegion.Text); if (pSourceLayer == null || pRegionLayer == null) { return; } if (!(pSourceLayer is IRasterLayer)) { return; } IRaster raster = ((IRasterLayer)pSourceLayer).Raster; IRaster2 raster2 = raster as IRaster2; IRasterDataset rasterDatasetSource = raster2.RasterDataset; //得到裁切范围 IGeometry pGeometryRegion = null; if (pRegionLayer is IRasterLayer) { IRaster rasterRegion = ((IRasterLayer)pRegionLayer).Raster; IGeoDataset geoDatasetRegion = rasterRegion as IGeoDataset; IEnvelope pEnvelope = geoDatasetRegion.Extent; pGeometryRegion = pEnvelope as IGeometry; } else if (pRegionLayer is IFeatureLayer) { IFeatureLayer featureLayer = pRegionLayer as IFeatureLayer; if (featureLayer.FeatureClass != null) { if (featureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon) { IFeatureCursor pFeatureCursor = featureLayer.FeatureClass.Search(null, false); IFeature pFeature = pFeatureCursor.NextFeature(); //只裁切出第一个多边形 if (pFeature != null) { pGeometryRegion = pFeature.Shape; } } } } //裁切栅格 ClsGDBDataCommon cls = new ClsGDBDataCommon(); cls.RasterSubsetByPolygon(rasterDatasetSource, pGeometryRegion, txtTarget.Text); //加到地图中 IRasterLayer rasterLayerNew = new RasterLayerClass(); rasterLayerNew.CreateFromFilePath(txtTarget.Text); m_mapControl.AddLayer(rasterLayerNew); m_mapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); } catch (System.Exception ex) { MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } #region 原代码 //if (cmbSource.SelectedItem != null) //{ // string itemName = cmbSource.SelectedItem.ToString(); // for (int i=0;i<m_mapControl.Map.LayerCount;i++) // { // ILayer pLayer = m_mapControl.Map.get_Layer(i); // if (pLayer.Name==itemName) // { // if(pLayer is IRasterLayer) // { // IDataLayer pDatalayer = pLayer as IDataLayer; // IDatasetName pDname = (IDatasetName)pDatalayer.DataSourceName; // string layername = pDname.WorkspaceName.PathName + "\\" + pDname.Name; // if (!layername.Contains("\\\\")) // { // m_RasterPath=pDname.WorkspaceName.PathName + "\\" + pDname.Name; // } // else // { // layername = pDname.WorkspaceName.PathName + pDname.Name; // m_RasterPath=layername; // } // break; // } // } // } //} //else //{ // MessageBox.Show("请选择原始栅格数据", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); // return; //} //if (m_ResultPath == null) //{ // MessageBox.Show("请选择输出路径及文件名", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); // return; //} //if (cmbRegion.SelectedItem != null) //{ // //m_ShpPath = comboBoxEx1.SelectedItem.ToString(); // string itemName = cmbRegion.SelectedItem.ToString(); // for (int i = 0; i < m_mapControl.Map.LayerCount; i++) // { // ILayer pLayer = m_mapControl.Map.get_Layer(i); // if (pLayer.Name == itemName) // { // if(pLayer is IFeatureLayer) // { // IDataLayer pDatalayer = pLayer as IDataLayer; // IDatasetName pDname = (IDatasetName)pDatalayer.DataSourceName; // m_ShpPath=pDname.WorkspaceName.PathName + "\\" + pDname.Name + ".shp"; // break; // } // } // } //} //else //{ // MessageBox.Show("请选择矢量文件", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); // return; //} //RasterLayerClass rasterlayer = new RasterLayerClass(); //rasterlayer.CreateFromFilePath(m_RasterPath); //string str = m_ShpPath; //string str2 = str.Substring(str.LastIndexOf(@"\") + 1); //文件名 //string str3 = str.Substring(0, (str.Length - str2.Length) - 1); //路径 //IWorkspaceFactory PWorkSpaceFactory = new ShapefileWorkspaceFactory(); //IFeatureWorkspace pFeatureWorkSpace = (IFeatureWorkspace)PWorkSpaceFactory.OpenFromFile(str3, 0) ; //IFeatureLayer pFeatureLayer = new FeatureLayerClass(); //pFeatureLayer.FeatureClass = pFeatureWorkSpace.OpenFeatureClass(str2); //esriGeometryType pType = pFeatureLayer.FeatureClass.ShapeType; //if (pType != esriGeometryType.esriGeometryPolygon) //{ // MessageBox.Show("矢量文件必须是多边形图层!请重新输入!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); // return; //} //IFeatureCursor pFeatureCursor = pFeatureLayer.FeatureClass.Search(null, false); //IFeature pFeature = pFeatureCursor.NextFeature(); //IGeometry pGeometry = pFeature.Shape; //IPolygon pPolygon = pGeometry as IPolygon; //bool result = RasterClip(rasterlayer, pPolygon, m_ResultPath); //if (result == true) //{ // RasterLayerClass prasterlayer = new RasterLayerClass(); // rasterlayer.CreateFromFilePath(m_ResultPath + ".tif"); // m_mapControl.AddLayer(rasterlayer as ILayer); // m_mapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); //} //else //{ // return; //} #endregion }