根据离散点内插生成等值线(c#+ArcGIS Engine )完整(转载)

转自https://blog.csdn.net/zyloveyrf/article/details/6735945

几点说明:
根据离散点生成等值线:
1.可判断等值线shapefile图层临时存放路径是否存在,如果不存在则创建,如果存在并不为空则删除重建;
2.可加【降雨量】字段并赋值,生成等值线后删除所加的字段;
3.根据所选的字段利用IDW内插生成raster,再设定间距生成contour并标注。
---------------------------------以下是源码----------------------------------

private void button1_Click(object sender, EventArgs e)
        {            
            //定义等值线临时shapefile图层存放路径
            string ls_TempSavePath = @"C:\HNYTTEMP" ;

            if (!Directory.Exists(ls_TempSavePath))//如果目录不存在,则创建
                Directory.CreateDirectory(ls_TempSavePath);

            DirectoryInfo di = new DirectoryInfo(ls_TempSavePath);
            FileInfo[] fi = null;
            fi = di.GetFiles();
            if (fi.Length != 0)//如果目录不为空,则删除目录,然后重建
            {
                Directory.Delete(ls_TempSavePath, true);
                Directory.CreateDirectory(ls_TempSavePath);
            }           

             IMap pMap  = axMapControl1.Map;  
             IInterpolationOp pInterpolationOp  = new RasterInterpolationOpClass();
  
             // Create the input point object
             IGeoDataset pInputDataset ;
             //雨量站图层【点】
             IFeatureLayer pFeatLayer = axMapControl1.get_Layer(0) as IFeatureLayer;
             // Calls function to open the point dataset from disk
  
             IFeatureClass pFeatCla  = pFeatLayer.FeatureClass;  
            
             IFeature pFeature ;  
             IField pField  = new FieldClass();
             IFieldEdit pFieldEdit = pField as IFieldEdit;
  
             pFieldEdit .Name_2 = "降雨量";
             pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
             pFieldEdit.Length_2 = 12;
             pFieldEdit.IsNullable_2 = false;
             pFieldEdit.DefaultValue_2 = 1111;

            pFeatCla.AddField(pFieldEdit);   //添加那个要用的字段进去

        for(int ii=0;ii<pFeatCla.FeatureCount(null) - 1;ii++)
            {
               pFeature = pFeatCla.GetFeature(ii);
               pFeature.set_Value(pFeature.Fields.FindField("降雨量"), 22+1999/(ii+2));
              //要素字段赋值,这里是自己随便赋的值,仅做测试用
          pFeature.Store();
            }
           pInputDataset = pFeatLayer as IGeoDataset;
           // Define the search radius
           IRasterRadius pRadius  = new RasterRadiusClass();
           
           object Missing = Type.Missing;
           pRadius.SetVariable(12, ref Missing);  
           //Create FeatureClassDescriptor using a value field

          IFeatureClassDescriptor pFCDescriptor = new FeatureClassDescriptorClass();
          pFCDescriptor.Create( pFeatLayer.FeatureClass, null, "降雨量");  

          //Set cellsize for output raster in the environment
          object cellSizeProvider = 20;
   
         IRasterAnalysisEnvironment pEnv  = pInterpolationOp as IRasterAnalysisEnvironment;
         pEnv.SetCellSize(esriRasterEnvSettingEnum.esriRasterEnvValue, ref  cellSizeProvider);
     
         //Perform the interpolation
         IRaster pOutRaster = pInterpolationOp.IDW(pFCDescriptor as IGeoDataset, 2, pRadius, ref Missing) as IRaster;
         
         //Add output into ArcMap as a raster layer   
         RasterLayer pOutRasLayer = new RasterLayerClass();
         pOutRasLayer.CreateFromRaster(pOutRaster);
         pOutRasLayer.Name = "栅格";
         //pMap.AddLayer(pOutRasLayer);
   
         IGeoDataset pGeoDataSet = pOutRaster as IGeoDataset;
         IWorkspaceFactory pWorkspaceFactory  = new ShapefileWorkspaceFactory();
         IWorkspace pShpWorkspace = pWorkspaceFactory.OpenFromFile(ls_TempSavePath, 0);
         ISurfaceOp2 pSurfaceOp2 = new RasterSurfaceOpClass();
         IRasterAnalysisEnvironment pRasterAnalysisEnvironment = pSurfaceOp2  as IRasterAnalysisEnvironment;

         pRasterAnalysisEnvironment.Reset();
         pRasterAnalysisEnvironment.SetCellSize(esriRasterEnvSettingEnum.esriRasterEnvValue, ref cellSizeProvider);
         pRasterAnalysisEnvironment.OutWorkspace = pShpWorkspace;
         double  dInterval   =5;  //间距
         IGeoDataset pOutputDataSet   = pSurfaceOp2.Contour(pGeoDataSet, dInterval,ref Missing,ref Missing);

         IFeatureClass pFeatureClass=  pOutputDataSet as IFeatureClass;
         IFeatureLayer pFeatureLayer = new FeatureLayerClass();
         pFeatureLayer.FeatureClass = pFeatureClass;

         IGeoFeatureLayer pGeoFeatureLayer  = pFeatureLayer as IGeoFeatureLayer;
         pGeoFeatureLayer.DisplayAnnotation = true;
         pGeoFeatureLayer.DisplayField = "Contour";
         pGeoFeatureLayer.Name = "降雨量等值线";

         pMap.AddLayer( pGeoFeatureLayer);
         axMapControl1.Refresh();
        
         //删除【降雨量】字段
      IFields pFields = pFeatCla.Fields;
         int lFieldnumber = pFields.FindField("降雨量");
         IField pField1 = pFields.get_Field(lFieldnumber);
         pFeatCla.DeleteField(pField);
        }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中使用VTK(Visualization Toolkit)来绘制坐标轴和网格线可以通过以下步骤实现: 1. 导入VTK库: ```csharp using Kitware.VTK; ``` 2. 创建vtkRenderer和vtkRenderWindow对象: ```csharp vtkRenderer renderer = vtkRenderer.New(); vtkRenderWindow renderWindow = vtkRenderWindow.New(); renderWindow.AddRenderer(renderer); ``` 3. 创建vtkRenderWindowInteractor对象并设置renderWindow: ```csharp vtkRenderWindowInteractor renderWindowInteractor = vtkRenderWindowInteractor.New(); renderWindowInteractor.SetRenderWindow(renderWindow); ``` 4. 创建vtkAxesActor对象来绘制坐标轴: ```csharp vtkAxesActor axesActor = vtkAxesActor.New(); axesActor.AxisLabelsOff(); // 关闭坐标轴标签 axesActor.SetTotalLength(1, 1, 1); // 设置坐标轴长度 axesActor.SetShaftTypeToCylinder(); // 设置坐标轴形状为圆柱体 axesActor.SetCylinderRadius(0.02); // 设置坐标轴圆柱体半径 axesActor.SetConeRadius(0.1); // 设置坐标轴锥形半径 vtkOrientationMarkerWidget axesWidget = vtkOrientationMarkerWidget.New(); axesWidget.SetOutlineColor(0.9300, 0.5700, 0.1300); // 设置边框颜色 axesWidget.SetOrientationMarker(axesActor); axesWidget.SetInteractor(renderWindowInteractor); axesWidget.EnabledOn(); ``` 5. 创建vtkCellArray和vtkPolyData对象来绘制网格线: ```csharp vtkCellArray cellArray = vtkCellArray.New(); vtkPolyData polyData = vtkPolyData.New(); polyData.SetPoints(points); // 设置网格坐标 for (int i = 0; i < numberOfLines; i++) { vtkLine line = vtkLine.New(); line.GetPointIds().SetId(0, lineIndices[i, 0]); line.GetPointIds().SetId(1, lineIndices[i, 1]); cellArray.InsertNextCell(line); } polyData.SetLines(cellArray); ``` 6. 创建vtkPolyDataMapper和vtkActor对象来渲染网格线: ```csharp vtkPolyDataMapper mapper = vtkPolyDataMapper.New(); mapper.SetInputData(polyData); vtkActor actor = vtkActor.New(); actor.SetMapper(mapper); actor.GetProperty().SetColor(1, 1, 1); // 设置网格线颜色 renderer.AddViewProp(actor); ``` 7. 最后,启动渲染循环: ```csharp renderWindow.Render(); renderWindowInteractor.Start(); ``` 以上是简单的示例代码,你可以根据你的需求进行修改和扩展。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值