天天看點

C#+AE 疊加分析一、疊加分析二、疊加分析-裁剪三、實作效果四、小結

文章目錄

  • 一、疊加分析
  • 二、疊加分析-裁剪
  • 三、實作效果
  • 四、小結

一、疊加分析

疊加分析,也稱為疊置分析,它是将同一區域相同參考系統、相同比例尺的兩個或多個資料進行疊加而産生一個新的資料層的操作。這樣子做的最大的好處,就是可以使得我們獲得多層要素的屬性資訊和我們感興趣的區域。

總的來講,疊加分析(本文隻針對矢量資料分析)所針對的對象就隻是點、線、面而言,在沒有深入了解疊加分析之前呢,我的印象裡也總是以為疊加分析隻是對圖層簡單的裁剪,但是在深入了解之後就發現其實疊加操作可以有很多種處理方式。

1、裁剪方法:這也是我的第一印象*~*,将輸入要素集與裁剪要素集的重疊部分裁剪出來就可以了,這種做法不會改變原有資料集(輸入要素集)的屬性資訊。

2、融合方法:這種方法是将具有相同類别的要素合并為一個新的要素,例如:可以将具有相同屬性的兩個相鄰多邊形合并成一個多邊形。這有點類似于我們經常說的聚類操作,将相同類别的元素聚成一類。

3、相交方法:這種方法類似于裁剪方法,都是要提取多個圖層的重疊部分,隻不過相交方法的處理結果是保留了多個圖層資料集的所有屬性資訊,而裁剪方法隻是保留了一個圖層資料集(輸入資料集)的屬性資訊。

4、合并方法:這種方法是将相同幾何類型的多個要素類合并到一個新的要素類裡面,常用于幾何接邊等操作。

5、聯合方法:這種方法是将兩個多邊形要素集的要素合并到一個新的要素集中,并保留兩個要素集的屬性和空間範圍。要注意的是,聯合隻能合并多邊形類型的要素類。

二、疊加分析-裁剪

建立一個窗體:

C#+AE 疊加分析一、疊加分析二、疊加分析-裁剪三、實作效果四、小結

OverlayAnalysis.cs:

public partial class OverlayAnalysis : DevExpress.XtraEditors.XtraForm
  {
      public OverlayAnalysis()
      {
          InitializeComponent();
      }

      //定義全局變量
      public IMap pMap { get; set; }
      public AxMapControl axMapControl { get; set; }

      //窗體加載事件
      private void OverlayAnalysis_Load(object sender, EventArgs e)
      {
          try
          {
              pMap = axMapControl.Map;
              if (pMap == null)
                  return;
              //清空combobox
              comboBox_InputDataset.Properties.Items.Clear();
              comboBox_ClipDataset.Properties.Items.Clear();

              string layerName;   //用于儲存圖層名字
            
              for (int i = 0; i < pMap.LayerCount; i++)
              {
                  layerName = pMap.Layer[i].Name;
                  comboBox_InputDataset.Properties.Items.Add(layerName);
                  comboBox_ClipDataset.Properties.Items.Add(layerName);
              }

          }
          catch (Exception ex)
          {

              MessageBox.Show(ex.Message);
          }
      }

      private void button2_OK_Click(object sender, EventArgs e)
      {
         
          if (pMap == null)
              return;
          //擷取資料集
          ILayer inputDataset = GetLayerByName(pMap, comboBox_InputDataset.Text.Trim());
          ILayer clipDataset = GetLayerByName(pMap, comboBox_ClipDataset.Text.Trim());

          if (inputDataset!=null && clipDataset!=null)
          {
              IFeatureLayer inputLayer = inputDataset as IFeatureLayer;
              IFeatureLayer clipLayer = clipDataset as IFeatureLayer;
              //利用裁剪方法來進行疊加分析
              IBasicGeoprocessor bGP = new BasicGeoprocessorClass();
              bGP.SpatialReference = pMap.SpatialReference;   //設定空間參考

              IFeatureClassName pOutput = new FeatureClassNameClass();    //建立FeatureClassNameClass對象,用于擷取輸入資料集的一些基本資訊
              pOutput.FeatureType = inputLayer.FeatureClass.FeatureType;
              pOutput.ShapeFieldName = inputLayer.FeatureClass.ShapeFieldName;
              pOutput.ShapeType = inputLayer.FeatureClass.ShapeType;

              //利用IDataset獲得IWorkspaceName
              string fileDirectory = System.IO.Path.GetDirectoryName(textEdit_Output.Text.Trim());
              string fileName = System.IO.Path.GetFileName(textEdit_Output.Text.Trim());
              
              IWorkspaceFactory pWsFc = new ShapefileWorkspaceFactoryClass();
              IWorkspace pWs = pWsFc.OpenFromFile(fileDirectory, 0);	//建立一個工作空間對象
              IDataset pDataset = pWs as IDataset;	
              IWorkspaceName pWsN = pDataset.FullName as IWorkspaceName;	//擷取工作空間的資訊(擷取輸出路徑)

              IDatasetName pDatasetName = pOutput as IDatasetName;	//擷取或設定資料集中成員的名稱資訊
              pDatasetName.Name = fileName;	//設定資料集中的資料成員的名字
              pDatasetName.WorkspaceName = pWsN;	//設定輸出的工作空間(輸出路徑)

              IFeatureClass featureClass = bGP.Clip(inputLayer.FeatureClass as ITable, false, clipLayer.FeatureClass as ITable, false, 0.01, pOutput);

              if (featureClass!=null)
              {
                  IFeatureLayer featLayer = new FeatureLayerClass();
                  featLayer.FeatureClass = featureClass;
                  featLayer.Name = featureClass.AliasName;
                  //将結果添加到控件中
                  axMapControl.AddLayer(featLayer);
                  axMapControl.Refresh();
              }
          }

      }

      private void simpleButton_Cancel_Click(object sender, EventArgs e)
      {
          this.Close();
      }

      private ILayer GetLayerByName(IMap pMap,string layerName)
      {
          ILayer pLayer = null;
          ILayer tempLayer = null;
          try
          {
              for (int i = 0; i < pMap.LayerCount; i++)
              {
                  tempLayer = pMap.Layer[i];
                  if (tempLayer.Name.ToUpper()==layerName.ToUpper())      //判斷名字大寫是否一緻
                  {
                      pLayer = tempLayer;
                      break;
                  }
              }
          }
          catch (Exception ex)
          {

              MessageBox.Show(ex.Message);
          }
          return pLayer;
      }

      private void simpleButton_Output_Click(object sender, EventArgs e)
      {
          SaveFileDialog flg = new SaveFileDialog();
          flg.Title = "儲存路徑";
          flg.Filter = "ShpFile(*shp)|*.shp";
          flg.ShowDialog();

          textEdit_Output.Text = flg.FileName;
      }
  }
           

MainForm.cs:

//疊加分析
private void barButtonItem_OverlayAnalysis_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
    OverlayAnalysis oA = new OverlayAnalysis();
    oA.axMapControl = axMapControl_MapView;
    oA.ShowDialog();
}
           

三、實作效果

C#+AE 疊加分析一、疊加分析二、疊加分析-裁剪三、實作效果四、小結
C#+AE 疊加分析一、疊加分析二、疊加分析-裁剪三、實作效果四、小結
C#+AE 疊加分析一、疊加分析二、疊加分析-裁剪三、實作效果四、小結

四、小結

疊加分析的其他方法我沒有都嘗試一下,主要是現在沒有現成的資料哈哈,不過過程應該和裁剪的方法是一樣的。特别要注意的是,裁剪方法的檔案輸出使用的是IDatasetName這個接口,通過這個接口我們可以設定資料集的工作空間、名稱等等資訊,這種建立資料集的方式的确讓我耳目一新*~*。