SuperMap iObjects.Net之三维点插值构建体元栅格

170 篇文章 52 订阅

nannan

       体元栅格体数据属于光栅数据,光栅数据采用网格形式组织并使用二维栅格的像素值来记录数据,每个栅格(cell)代表一个像素要素,栅格值可以描述各种数据信息。体元栅格体数据集中每一个栅格存储的是三维体数据以切片采样方式的值。

       SuperMap iDesktop构建体元栅格请参考https://blog.csdn.net/supermapsupport/article/details/88812811

       本文主要讲三维点差值构建体元栅格在组件iObjects.Net里的代码实现过程,三维点插值构建体元栅格可以分成距离反比权重和普通克吕金两种方式。请看下文:

1.数据准备

       如果是测验直接用idesktop里日照分析生成点数据集,对该点数据集进行体元栅格构建。
       如果是项目中的数据,需根据项目自行采集生成带有特征值的点数据集。下图为日照分析生成的点数据集:
在这里插入图片描述

2.距离反比权重

       距离反比权重插值(Inverse Distance Weighted,简称 IDW)基于样点相近相似的原理。假设两个样点距离越近,则它们的性质越相似,反之,距离越远则相似性越小。它通过计算与到附近区域样点的加权平均值来估算出单元格的值,距离样点中心越近则权重值越大。这是一种简单有效的数据内插方法,运算速度相对较快。

@用于插值的源数据集中必须有个数值型字段,作为插值字段。
@距离反比权重插值法是一种比较精确的插值方法,适用呈均匀分布且密集程度能够反映局部差异的样点数据集。
@距离反比权重插值使用样点间的加权平均距离,平均值不可能大于输入的最大值或小于输入最小值,因此生成的结果数据中,每一栅格值均处于采样数据的最大值与最小值范围之内。
@如果已知的观测点数据中不包含有某个局部地区的最大值(比如某一山峰的峰值)时,在该出现最大值的地方,获得的插值会低于附近周围其他点的值,可能与实际情况不符。因此要求样点数据集中最好包含插值区域的最大值和最小值采样点。
主要用到的接口为:InterpolationIDWParameter3D、Interpolator3D.Interpolate

            DatasetVector datasetVector = workspace.Datasources[0].Datasets["SunLight"] as DatasetVector;

            //距离反比权值插值
            InterpolationIDWParameter3D interpolationIDWParameter3D = new InterpolationIDWParameter3D();
            interpolationIDWParameter3D.Bounds = datasetVector.Bounds;//设置三维插值分析的范围
            interpolationIDWParameter3D.ExpectedCount = 25;//期望参与插值运算的点数
            interpolationIDWParameter3D.Resolution = 1;//三维插值运算所获得的栅格数据的分辨率
            interpolationIDWParameter3D.SearchMode = SearchMode.KdTreeFixedRadius;//设置在三维插值运算时,查找参与运算点的方式(定长查找)
            interpolationIDWParameter3D.SearchRadius = 0;//设置查找参与运算点的查找半径
            double[] dou = { 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 };
            interpolationIDWParameter3D.SliceAltitudes = dou;//设置体数据集各剖切面的高程值集合

            //如果数据集集合中包含名称为“距离反比”数据集,则删除
            String datasetVolumeName = "距离反比";
            if (workspace.Datasources[0].Datasets.Contains(datasetVolumeName))
            {
                workspace.Datasources[0].Datasets.Delete(datasetVolumeName);
            }

            //三维差值分析
            Interpolator3D.Interpolate(interpolationIDWParameter3D, datasetVector, "ShadowRatio", 100, workspace.Datasources[0], "距离反比", PixelFormat.Double);

            DatasetVolume datasetVolume = workspace.Datasources[0].Datasets["距离反比"] as DatasetVolume;
            Layer3DSettingVolume layer3DSettingVolume = new Layer3DSettingVolume();
            sceneControl.Scene.Layers.Add(datasetVolume, layer3DSettingVolume, true);

            sceneControl.Scene.Refresh();

距离反比权重效果图:
在这里插入图片描述

3.普通克吕金

       克吕金插值法以数据的空间自相关性为基础,使用变异函数模型,对有限区域内的未知样本点进行无偏估计的插值方法。在样本点存在空间自相关性或者方向性趋势时,克吕金是最合适的插值方法。同一个分布区内的样点数据之间存在的相互依赖性,即空间自相关性。并且距离越近的两个样点之间,相关性越强。目前克吕金插值方法被广泛的应用于土壤学和地质学中。
       普通克里金法是使用最普通和广泛的克里金方法。该方法假定用于插值的字段值的期望(平均值)未知且恒定。
@普通克里金法使用的数据应符合数据变化成正态分布的前提假设。
@普通克里金插值最大的特色不仅是提供一个最小估计误差的预测值,并且可明确的指出误差值的大小。
@普通克里金法采用两种方式来获取参与插值的采样点,进而获得相应位置点的预测值:一个是在待计算预测值位置点周围一定范围内,获取该范围内的所有采样点,通过特定的插值计算公式获得该位置点的预测值;另一个是在待计算预测值位置点周围获取一定数目的采样点,通过特定的插值计算公式获得该位置点的预测值。
主要用到的接口为:InterpolationKrigingParameter3D、Interpolator3D.Interpolate

 DatasetVector datasetVector = workspace.Datasources[0].Datasets["SunLight"] as DatasetVector;
            //克吕金(Kriging)内插法
            InterpolationKrigingParameter3D interpolationKrigingParameter3D = new InterpolationKrigingParameter3D();
            interpolationKrigingParameter3D.Bounds = datasetVector.Bounds;//设置三维插值分析的范围
            interpolationKrigingParameter3D.ExpectedCount = 25;//期望参与插值运算的点数
            interpolationKrigingParameter3D.Resolution = 1;//三维插值运算所获得的栅格数据的分辨率
            interpolationKrigingParameter3D.SearchMode = SearchMode.KdTreeFixedCount;//设置在三维插值运算时,查找参与运算点的方式(变长查找)
            interpolationKrigingParameter3D.SearchRadius = 0;//设置查找参与运算点的查找半径
           
            double[] dou = new double[10];
            dou[0] = 5;
            dou[1] = 10;
            dou[2] = 15;
            dou[3] = 20;
            dou[4] = 25;
            dou[5] = 30;
            dou[6] = 35;
            dou[7] = 40;
            dou[8] = 45;
            dou[9] = 50;
        
            interpolationKrigingParameter3D.SliceAltitudes = dou;//设置体数据集各剖切面的高程值集合
            interpolationKrigingParameter3D.VariogramMode =VariogramMode.Exponential;//设置克吕金(Kriging)插值时的半变函数类型

            //如果数据集集合中包含名称为“克吕金”数据集,则删除
            String datasetVolumeName = "克吕金";
            if (workspace.Datasources[0].Datasets.Contains(datasetVolumeName))
            {
                workspace.Datasources[0].Datasets.Delete(datasetVolumeName);
            }
            //三维插值分析
            Interpolator3D.Interpolate(interpolationKrigingParameter3D, datasetVector, "ShadowRatio", 100, workspace.Datasources[0], "克吕金", PixelFormat.Double);

            DatasetVolume datasetVolume = workspace.Datasources[0].Datasets["克吕金"] as DatasetVolume;
            Layer3DSettingVolume layer3DSettingVolume = new Layer3DSettingVolume();
            sceneControl.Scene.Layers.Add(datasetVolume, layer3DSettingVolume, true);

            sceneControl.Scene.Refresh();

普通克吕金效果图:
在这里插入图片描述
本文详细代码请参见:https://download.csdn.net/download/supermapsupport/11904474

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值