cesium天际线分析实现修改天际线粗细

cesium天际线分析已经很成熟了,今天分享一个在网上大佬的代码基础上,实现天际线自定义粗细功能(无需修改源码)。

参考文章:

Cesium实战记录(五)天际线分析_cesium天际线分析_Giser_往事随风的博客-CSDN博客

天际线分析的实现原理是边缘检测和结合像元深度信息的着色器处理。在原文中,将内置的边缘检测算法(Cesium.PostProcessStageLibrary.createEdgeDetectionStage())和自定义的两个着色器处理算法相结合(Cesium.PostProcessStageComposite())实现天际线着色。

实现自定义天际线粗细的思路是,将官方定义的边缘检测算法自定义成一个新的着色器算法(new Cesium.PostProcessStage)将官方的glsl代码传给fragmentShader参数。并在glsl中做小的修改。

官方原glsl代码:https://github.com/CesiumGS/cesium/blob/1.86/Source/Shaders/PostProcessStages/EdgeDetection.glslhttps://github.com/CesiumGS/cesium/blob/1.86/Source/Shaders/PostProcessStages/EdgeDetection.glsl修改后的glsl代码(${customWidth}传入自定义宽度)

    const edgeFs = `
      uniform sampler2D depthTexture;
uniform float length;
uniform vec4 color;

varying vec2 v_textureCoordinates;

void main(void)
{
    float directions[3];
    directions[0] = -1.0;
    directions[1] = 0.0;
    directions[2] = 1.0;

    float scalars[3];
    scalars[0] = 3.0;
    scalars[1] = 10.0;
    scalars[2] = 3.0;
    float czm_pixelRatio_width = float(${customWidth});
    float padx = czm_pixelRatio_width / czm_viewport.z;
    float pady = czm_pixelRatio_width / czm_viewport.w;

#ifdef CZM_SELECTED_FEATURE
    bool selected = false;
    for (int i = 0; i < 3; ++i)
    {
        float dir = directions[i];
        selected = selected || czm_selected(vec2(-padx, dir * pady));
        selected = selected || czm_selected(vec2(padx, dir * pady));
        selected = selected || czm_selected(vec2(dir * padx, -pady));
        selected = selected || czm_selected(vec2(dir * padx, pady));
        if (selected)
        {
            break;
        }
    }
    if (!selected)
    {
        gl_FragColor = vec4(color.rgb, 0.0);
        return;
    }
#endif

    float horizEdge = 0.0;
    float vertEdge = 0.0;

    for (int i = 0; i < 3; ++i)
    {
        float dir = directions[i];
        float scale = scalars[i];

        horizEdge -= texture2D(depthTexture, v_textureCoordinates + vec2(-padx, dir * pady)).x * scale;
        horizEdge += texture2D(depthTexture, v_textureCoordinates + vec2(padx, dir * pady)).x * scale;

        vertEdge -= texture2D(depthTexture, v_textureCoordinates + vec2(dir * padx, -pady)).x * scale;
        vertEdge += texture2D(depthTexture, v_textureCoordinates + vec2(dir * padx, pady)).x * scale;
    }

    float len = sqrt(horizEdge * horizEdge + vertEdge * vertEdge);
    gl_FragColor = vec4(color.rgb, len > length ? color.a : 0.0);
}`

自定义新的边缘检测算法:

    const myOwnEdgeDetection = new Cesium.PostProcessStage({
      name: 'myEdgeDetection',
      fragmentShader: edgeFs,
      uniforms: {
        length: 0.5,
        color: Cesium.Color.BLACK
      }
    })

然后把他们Composite起来

    const silhouette = new Cesium.PostProcessStageComposite({
      name: 'czm_skyline',
      stages: [myOwnEdgeDetection, postProccessStage, postProccessStage1],
      inputPreviousStageTexture: false,
      uniforms: myOwnEdgeDetection.uniforms
    })

最后将自定义的着色串传到viewer.scene.postProcessStages中就完成了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Cesium等高线分析是一种地球科学中常用的空间数据分析方法,主要用于研究地表高程变化。它通过建立坐标系和测量高程数据来描绘地表的形态特征,并通过绘制等高线图展示高程的分布情况。 Cesium等高线分析的核心是通过测量不同位置的高程数据,以划分等高面来呈现地表高程的变化。首先,需要通过各种地面测量技术收集到不同位置的高程数据。这些数据可以使用全球定位系统(GPS)、激光雷达、航空摄影测量等方法获取。 然后,将收集到的高程数据制作成数字地形模型(DTM),并将其导入Cesium等高线分析软件中。利用该软件的工具,可以根据高程数据的分布情况绘制等高线图。等高线图中的等高线代表了地表上具有相同高程数值的点,通过绘制这些等高线,可以清晰地展示地表的高程分布情况,从而帮助我们更好地理解和分析地形。 Cesium等高线分析在地质勘探、土地资源规划、城市规划等领域有着广泛的应用。例如,在地质勘探中,等高线分析可以帮助确定地下矿产资源分布的变化趋势;在土地资源规划中,可以利用等高线图来评估土壤的适宜性,选择合适的农作物种植区域;在城市规划中,可以利用等高线图来分析城市地势,从而规划道路和建筑物的布局。 总的来说,Cesium等高线分析是一种重要的空间数据分析方法,它通过绘制等高线图来展示地表高程的分布情况,为地球科学研究和相关领域的决策提供了有力的支持。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值