克里金插值

由于用SuperMap Objects 没有解决插值范围的问题(见本版帖子“求助!哪位大侠在用SuperMap Objects,请教一个插值区域的问题”),改用ArcGIS Engine来做,现在遇到同样的问题。使用IInterpolationOp的krige方法已经实现了插值,但范围局限于气象站点的外框范围,查遍帮助,知到可以通过IRasterAnalysisEnvironment的SetExtent进行设置,下面是我写C#代码,如果使用克里金,但一旦添加了pEnv.SetExtent(esriRasterEnvSettingEnum.esriRasterEnvValue, ref extentProvider, ref snapRasterData);这句便会出现错误unable to estimate the Semi-Variogram ,同样的设置在用反距离IDW插值中没有问题。刚刚接触ArcGIS Engine,想必气象部门也有在用ArcGIS Engine的同仁吧,请帮忙看看,到底哪里出了问题,谢谢!
    顺便说一句,最近收集了许多SuperMap Objects 和SuperMap Objects以及地理信息方面的资料,包括电子书、示例代码等,愿意和大家共享,更期望和大家交流。QQ:93313198,Email:ybfuqiang@sina.com.

       private void Mlayer_Krige_Click(object sender, EventArgs e)
        {
            // 用克里金Krige插值生成的栅格图像。如下:
            IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();
            string pPath = Application.StartupPath + @"\data\ybdata_point_point.shp";
            string pFolder = System.IO.Path.GetDirectoryName(pPath);
            string pFileName = System.IO.Path.GetFileName(pPath);
            IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(pFolder, 0);
            IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
            IFeatureClass oFeatureClass = pFeatureWorkspace.OpenFeatureClass(pFileName);
            IFeatureClassDescriptor pFCDescriptor = new FeatureClassDescriptorClass();
            pFCDescriptor.Create(oFeatureClass, null, "value");

            IInterpolationOp pInterpolationOp = new RasterInterpolationOpClass();
            IRasterAnalysisEnvironment pEnv = pInterpolationOp as IRasterAnalysisEnvironment;

            object Cellsize = 0.004;//Cell size for output raster;
            pEnv.SetCellSize(esriRasterEnvSettingEnum.esriRasterEnvValue, ref Cellsize);
            //设置输出范围

      object snapRasterData = Type.Missing;
            IEnvelope pExtent;
            pExtent = new EnvelopeClass();
            Double xmin = 103.60;
            Double xmax = 105.36;

            Double ymin = 27.84;
            Double ymax = 29.27;
            pExtent.PutCoords(xmin, ymin, xmax, ymax);
            object extentProvider = pExtent;
            //pEnv.SetExtent(esriRasterEnvSettingEnum.esriRasterEnvValue, ref extentProvider, ref snapRasterData);
            Double dSearchD = 10;
            object pSearchCount = 3;
            object missing = Type.Missing; 
            IRasterRadius pRadius= new RasterRadius();
            pRadius.SetFixed(dSearchD , ref pSearchCount);
           //pRadius.SetVariable((int)pSearchCount, ref dSearchD);

            IGeoDataset poutGeoDataset = pInterpolationOp.Krige((IGeoDataset)pFCDescriptor, esriGeoAnalysisSemiVariogramEnum.esriGeoAnalysisGaussianSemiVariogram, pRadius, false, ref missing);
          
            IRaster pOutRaster = poutGeoDataset as IRaster;
            IRasterLayer pOutRasLayer = new RasterLayer();
            pOutRasLayer.CreateFromRaster(pOutRaster);
            IMap pMap = Frmmain.Fmap.axMapControl1.Map;
            pMap.AddLayer(pOutRasLayer);
            Frmmain.Fmap.axTOCControl1.Refresh();
            Frmmain.Fmap.axMapControl1.ActiveView.Refresh();

        }

        private void Mlayer_IDW_Click(object sender, EventArgs e)
        {
            // 用反距离IDW插值生成的栅格图像。如下:
      IInterpolationOp pInterpolationOp = new RasterInterpolationOpClass();

            IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();
            string pPath = Application.StartupPath + @"\data\ybdata_point_point.shp";
            string pFolder = System.IO.Path.GetDirectoryName(pPath);
            string pFileName = System.IO.Path.GetFileName(pPath);

            IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(pFolder, 0);

            IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
            IFeatureClass oFeatureClass = pFeatureWorkspace.OpenFeatureClass(pFileName);
            IFeatureClassDescriptor pFCDescriptor = new FeatureClassDescriptorClass();
            pFCDescriptor.Create(oFeatureClass, null, "value");
            IRasterRadius pRadius = new RasterRadiusClass();

            object objectMaxDistance = null;
            object objectbarrier = null;
            object missing = Type.Missing;
            pRadius.SetVariable(12, ref objectMaxDistance);

            object dCellSize = 0.013;
            object snapRasterData = Type.Missing;
            IEnvelope pExtent;
            pExtent = new EnvelopeClass();
            Double xmin = 103.60;
            Double xmax = 105.36; 
            Double ymin = 29.27;
            Double ymax = 27.84;
            pExtent.PutCoords(xmin, ymin, xmax, ymax);
            object extentProvider = pExtent;
            IRasterAnalysisEnvironment pEnv = pInterpolationOp as IRasterAnalysisEnvironment;
            pEnv.SetCellSize(esriRasterEnvSettingEnum.esriRasterEnvValue, ref dCellSize);
            pEnv.SetExtent(esriRasterEnvSettingEnum.esriRasterEnvValue, ref extentProvider, ref snapRasterData);
            IGeoDataset poutGeoDataset = pInterpolationOp.IDW((IGeoDataset)pFCDescriptor, 2, pRadius, ref objectbarrier);
            ISurfaceOp surOp = new RasterSurfaceOpClass();


            IRaster pOutRaster = poutGeoDataset as IRaster;

            IRasterLayer pOutRasLayer = new RasterLayer();
            pOutRasLayer.CreateFromRaster(pOutRaster);
            IMap pMap = Frmmain.Fmap.axMapControl1.Map;
            pMap.AddLayer(pOutRasLayer);
            Frmmain.Fmap.axTOCControl1.Refresh();
            Frmmain.Fmap.axMapControl1.ActiveView.Refresh();


        }
### ArcGIS 中克里金法进行空间插值的方法教程 #### 使用克里金法进行空间插值的基础概念 克里金插值是一种基于统计学的空间插值方法,适用于具有随机性和趋势性的数据集。这种方法假设数据的变化遵循一定的概率分布模型,并通过半变异函数来描述空间相关性[^2]。 在 ArcGIS Pro 或其他版本的 ArcGIS 软件中,可以通过 Geostatistical Analyst 工具箱中的 Kriging 插值工具完成这一操作。以下是具体的操作说明: --- #### 准备工作 1. **加载数据**: 将包含已知采样点及其属性值的数据导入到 ArcGIS 的地图文档中。这些数据通常以 shapefile 文件或其他矢量格式存储。 2. **安装扩展模块**: 如果尚未启用 Geostatistical Analyst 扩展,则需先激活此扩展模块以便访问高级插值功能[^3]。 --- #### 步骤详解 ##### 1. 启动 Kriging/Co-Kriging Wizard 打开 `Geoprocessing` 工具栏,在其中找到并启动 `Kriging / Co-Kriging` 向导。这个向导会引导用户逐步设置参数以生成最终的插值表面图层。 ##### 2. 设置输入要素类和字段 - 在弹出窗口中指定要使用的输入要素类(即包含采样点的位置信息)以及对应的数值字段(表示待插值的目标属性)。例如,对于石家庄主城区住宅价格案例,“数值字段”应选择代表房价的相关列。 ##### 3. 定义变差函数模型 选择合适的变差函数模型是成功应用克里金的关键环节之一。常见的模型类型包括球形 (Spherical)、指数型 (Exponential) 和高斯型 (Gaussian)[^1]。每种模型对应不同的理论背景及适用场景;建议依据实际研究目标选取最贴合现状的那个选项。 ##### 4. 配置搜索邻居策略 为了提高效率与精度,还需要设定参与计算的最近邻域大小及相关约束条件。这一步涉及调整最大最小样本数目限制、扇区方向角度等细节配置项。 ##### 5. 输出栅格文件路径命名 最后确认好输出结果保存位置之后点击运行按钮即可得到由原始离散观测值得来的连续覆盖整个感兴趣区域内的预测值网格图像产品。 --- #### Python 实现示例代码 如果希望通过脚本自动化执行上述流程的话,也可以利用 arcpy 库编写如下所示的一段简单程序来进行批量处理作业: ```python import arcpy # 设定工作环境 arcpy.env.workspace = r"C:\path\to\your\data" # 输入点状特征类名称 in_features = "sample_points.shp" z_field = "value_column_name" # 创建临时目录存放中间成果物 temp_dir = "kriging_output.gdb" if not arcpy.Exists(temp_dir): arcpy.CreateFileGDB_management(arcpy.env.workspace, temp_dir) out_surface_raster = f"{temp_dir}/output_kriging.tif" # 运行克里金算法 arcpy.ga.Krige(in_features=in_features, zField=z_field, outSurfaceRaster=out_surface_raster, semivariogramModelType="SPHERICAL", cellSize=30, searchNeighborhood="RADIUS_VARIABLE(3)") print(f"已完成克里金插值运算,结果存于 {out_surface_raster}") ``` 以上代码片段展示了如何调用 arcpy 模块下的 geoprocessing API 来实现自动化的克里金插值过程。 --- #### 自定义可视化效果 当获得插值后的栅格数据后,还可以进一步定制渲染样式使其更直观易懂。比如按照预设好的分级色彩方案绘制专题地图等等。借助 arcgis api for javascript 则能够更加灵活便捷地达成此类需求[^5]。 --- ### 结论 综上所述,无论是手动交互还是编程接口方式下运用ArcGIS平台开展基于克里金技术框架下的空间数据分析任务都是可行且高效的解决方案途径之一[^1].
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值