Cesium实战记录(五)天际线分析

老规矩看下效果:(版本是1.94的)

 实现思路:(引用网上大佬的)

利用Cesium 的边缘检测和后期处理效果的叠加。即在地图上检测此视角下的地形边缘,叠加标价效果层,叠加针对边缘实例和前一个边缘效果层的标记进行颜色处理和纹理处理。

主要用到的就是Cesium 提供的 Post Processing 功能:对整个场景后期处理的功能,类似模型描边,夜视效果,云雨雾之类的都用到。

直接贴代码吧,这个网上都很成熟了:

<template>
  <div className="box">
    <div class="map-tool">
      <el-button @click="add3DTiles">加载倾斜摄影</el-button>
      <el-button>移除倾斜摄影</el-button>
      <el-button @click="openSkylineAnay">打开天际线</el-button>
      <el-button @click="closeSkylineAnay">关闭天际线</el-button>
    </div>
    <div id="mapContainter"></div>
  </div>
</template>


<script>
import * as Cesium from 'cesium';
import "cesium/widgets.css";

export default {
  name: "skyline-analysis",
  data() {
    return {
      viewer: null,
      skylineAnayStages:null,
      silhouette:null,
    }
  },
  mounted() {
    this.initMap();
  },
  methods: {
    initMap() {
      Cesium.Ion.defaultAccessToken = this.CesiumToken;
      //初始化视图
      this.viewer = new Cesium.Viewer(
          "mapContainter",
          {
            selectionIndicator: false,//是否创建选择指示符小部件,也就是在选择实体时实体本身会出现一个绿色方块。如果设置为false,则不创建选择指示符小部件
            timeline: false,//时间轴,默认值 true
            infoBox: false,//显示信息框
            imageryProvider: new Cesium.WebMapTileServiceImageryProvider({
              url: 'http://{s}.tianditu.gov.cn/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=' + this.tdtToken,
              layer: 'img',
              style: 'default',
              format: 'tiles',
              tileMatrixSetID: 'w',
              subdomains: ['t0', 't1', 't2', 't3', 't4', 't5', 't6', 't7'],
              credit: new Cesium.Credit('天地图影像'),
              maximumLevel: 21
            }),
            terrainProvider: new Cesium.CesiumTerrainProvider({
              url: Cesium.IonResource.fromAssetId(1),
              requestVertexNormals: true,//顶点法线效果
              requestWaterMask: true,//水效果
            })
          }
      )

      // let h = new Cesium.ScreenSpaceEventHandler(this.viewer.canvas);
      // h.setInputAction((e)=>{
      //   let position =this.viewer.scene.pickPosition(e.position);
      //   var cartographic = Cesium.Cartographic.fromCartesian(position);
      //   //经纬度
      //   var x = Cesium.Math.toDegrees(cartographic.longitude);
      //   var y = Cesium.Math.toDegrees(cartographic.latitude);
      //   var z = cartographic.height;//高度
      //   let currenP={
      //     lon:x,lat:y,h:z
      //   }
      //   //heading
      //   var h = this.viewer.scene.camera.heading;
      //   // pitch
      //   var p = this.viewer.scene.camera.pitch;
      //   //roll
      //   var r = this.viewer.scene.camera.roll;
      //
      //   var info ={'head': h ,'pitch': p ,'roll': r};
      //   var cp = this.viewer.scene.camera.positionCartographic //with longitude and latitude expressed in radians and height in meters.
      //   //以下方式也可以获取相机位置只是返回的坐标系不一样
      //   // var position = viewer.scene.camera.position //cartesian3 空间直角坐标系
      //   // var ellipsoid = scene.globe.ellipsoid;
      //   // var position =ellipsoid.cartesianToCartographic(viewer.scene.camera.position)//
      //   // 弧度转经纬度
      //   var longitude = Cesium.Math.toDegrees(cp.longitude).toFixed(6)
      //   var latitude =  Cesium.Math.toDegrees(cp.latitude).toFixed(6)
      //   var height = cp.height
      //   let cameraP ={lon:longitude,lat:latitude,h:height}
      //   console.log(
      //       {"currenP":currenP,"cameraP":cameraP,mat:info})
      // },Cesium.ScreenSpaceEventType.LEFT_CLICK)
    },
    add3DTiles() {
      //加载大雁塔倾斜摄影
      this.viewer.scene.primitives.add(
          new Cesium.Cesium3DTileset({
            url: 'http://earthsdk.com/v/last/Apps/assets/dayanta/tileset.json',
            show: true,
            backFaceCulling: true,
          })
      ).readyPromise.then((tileset) => {
        //拉伸模型高度代码
        // let heightOffset = 0;
        // var boundingSphere = tileset.boundingSphere;
        // var cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);
        // var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0);
        // var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, heightOffset);
        // var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
        // tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
        // this.viewer.zoomTo(tileset)
        this.viewer.flyTo(tileset)
      })
    },
    //打开天际线分析
    openSkylineAnay(){
      if(this.skylineAnayStages){
        this.silhouette.enabled=true;
        return;
      }
      this.skylineAnayStages = this.viewer.scene.postProcessStages;
      let edgeDetection = Cesium.PostProcessStageLibrary.createEdgeDetectionStage();
      let postProccessStage = new Cesium.PostProcessStage({
        //此后处理阶段的唯一名称,供组合中其他阶段参考,如果未提供名称,将自动生成GUID
        // name:name,
        //unform着色器对象 textureScale
        fragmentShader: 'uniform sampler2D colorTexture;' +
            'uniform sampler2D depthTexture;' +
            'varying vec2 v_textureCoordinates;' +
            'void main(void)' +
            '{' +
            'float depth = czm_readDepth(depthTexture, v_textureCoordinates);' +
            'vec4 color = texture2D(colorTexture, v_textureCoordinates);' +
            'if(depth<1.0 - 0.000001){' +
            'gl_FragColor = color;' +
            '}' +
            'else{' +
            'gl_FragColor = vec4(1.0,0.0,0.0,1.0);' +
            '}' +
            '}'
      });

      //PostProcessStage:要使用的片段着色器。默认sampler2D制服是colorTexture和depthTexture。
      let postProccesStage_1 = new Cesium.PostProcessStage({
        // name:obj.name+'_1',
        fragmentShader: 'uniform sampler2D colorTexture;' +
            'uniform sampler2D redTexture;' +
            'uniform sampler2D silhouetteTexture;' +
            'varying vec2 v_textureCoordinates;' +
            'void main(void)' +
            '{' +
            'vec4 redcolor=texture2D(redTexture, v_textureCoordinates);' +
            'vec4 silhouetteColor = texture2D(silhouetteTexture, v_textureCoordinates);' +
            'vec4 color = texture2D(colorTexture, v_textureCoordinates);' +
            'if(redcolor.r == 1.0){' +
            'gl_FragColor = mix(color, vec4(5.0,0.0,0.0,1.0), silhouetteColor.a);' +
            '}' +
            'else{' +
            'gl_FragColor = color;' +
            '}' +
            '}',
        //uniform着色器对象
        uniforms: {
          redTexture: postProccessStage.name,
          silhouetteTexture: edgeDetection.name
        }
      });

      //如果inputPreviousStageTexture 是 true,则每个阶段输入是场景渲染到的输出纹理或之前执行阶段的输出纹理
      //如果inputPreviousStageTexture是false,则合成中每个阶段的输入纹理都是相同的
      this.silhouette= new Cesium.PostProcessStageComposite({
        //PostProcessStage要按顺序执行 的 s 或组合的数组。
        stages:[edgeDetection,postProccessStage,postProccesStage_1],
        //是否执行每个后处理阶段,其中一个阶段的输入是前一个阶段的输出。否则每个包含阶段的输入是组合之前执行的阶段的输出
        inputPreviousStageTexture:false,
        //后处理阶段制服的别名
        uniforms:edgeDetection.uniforms
      })
      this.skylineAnayStages.add(this.silhouette);
    },
    //关闭天际线分析
    closeSkylineAnay(){
      this.silhouette.enabled=false;
    }
  },
  components: {}
}
</script>

<style scoped>
</style>

注释的代码段都是不用的。


参考博客:CESIUM例子学习(十)——PostProcessStage(fog)_luoyun620的博客-CSDN博客

Cesium源码剖析---Post Processing之物体描边(Silhouette)-布布扣-bubuko.com

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
### 回答1: 等高线是一种用于表示地理高程变化的空间分析方法,也是Cesium空间分析中的重要应用之一。在地理信息系统中,我们通常会使用高程数据来绘制等高线。 等高线的绘制过程可以简单理解为将相同高程的点连接起来形成一条曲线。这些曲线连接起来就形成了一系列的等高线,可以清晰地表示地形的变化和地势的起伏。 Cesium空间分析中,绘制等高线的方式类似于传统的卫星地图或地形模型。首先需要准备高程数据,这可以通过激光雷达、数字高程模型等方式获取。然后,将高程数据加载到Cesium的场景中,根据数据的分布和范围进行可视化设置。 在Cesium中,可以通过使用多边形实体和贴地线段来绘制等高线。首先,将高程数据转化为等高线数据,确定每条等高线的起始点和结束点。然后,使用Cesium的几何库中的方法创建多边形实体或贴地线段,将等高线数据转化为可视化对象。 绘制等高线时,还需要考虑地理坐标系和投影坐标系的转换。Cesium提供了丰富的坐标转换方法,可以在不同的坐标系统之间进行转化,确保等高线的准确性和一致性。 通过绘制等高线,我们可以更清晰地观察地形的特征和变化。例如,可以通过等高线密集程度来判断地形的陡峭程度,通过等高线的分布形态来分析地势的起伏情况。等高线在地图制图、城市规划、自然资源调查等领域都有着广泛的应用。 总而言之,Cesium空间分析中的等高线绘制是一种重要的地理信息分析方法,通过绘制等高线可以更好地理解和分析地理高程变化,为地理空间研究和决策提供有益的信息。 ### 回答2: 等高线是一种在地理空间中用来表示地形高度的方法。在cesium空间分析中,等高线通常用来展示地球表面上不同高度的区域。 Cesium空间分析中的等高线是通过分析地形数据生成的。首先,通过遥感技术或其他方法获取地球表面的高程数据。然后,使用算法来处理这些数据,识别出地形上不同高度的区域,并根据高度的变化生成等高线。 生成的等高线可以通过不同的方式呈现在Cesium的地球模型上。可以使用不同的颜色或线条宽度来表示不同高度的区域,使得用户能够清晰地看到地球表面的地形变化。这种可视化方式可以帮助用户更好地理解地形和地貌特征。 利用Cesium空间分析中的等高线,用户可以进行多种空间分析。例如,可以通过等高线识别出山脉、河流、山谷等地貌特征,更好地了解地球的地形。还可以通过等高线分析地坡陡峭程度,预测地质灾害风险,对土地利用进行规划等。等高线分析还可以用于制作地图、规划交通路线以及进行航空和航海导航等领域。 总之,Cesium空间分析中的等高线是一种重要的地形分析工具,可以帮助用户更好地了解地球表面的高度变化,并进行各种空间分析和规划。 ### 回答3: 等高线是一种用于表示地形高度的技术。在Cesium中,等高线是通过使用地形数据和矢量绘制技术来实现的。 首先,Cesium通过使用高程数据集来生成地形模型。这些高程数据通常是精确测量的地面高度信息,可以来自于激光雷达扫描或其他测量方法。Cesium会将这些数据整合到地形网格中,从而创建出一个可以精确表示地形高度变化的模型。 然后,Cesium使用矢量绘制技术来绘制等高线。矢量绘制是一种基于数学方程来绘制图形的方法,可以生成平滑的曲线和形状。在Cesium中,矢量绘制技术用于通过连接不同高度点的等高线,从而在地形模型上绘制出高度相等的线条。 使用Cesium进行等高线分析可以帮助我们更好地理解地形形状和地貌特征。通过绘制等高线,我们可以直观地看到地势的变化,比如山脉、山谷、峡谷等地形特征。这对于地质勘探、环境保护、城市规划等领域都非常有用。 总之,Cesium空间分析中的等高线技术利用地形数据和矢量绘制,能够精确表示地势高度变化,并能够帮助我们更好地理解地形特征。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Giser_往事随风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值