Cesium高级教程-深度图-区域高差分析

Cesium高级教程-深度图-区域高差分析

高差分析

高差分析用来计算某个研究区域最高点和最低点,使用深度图来进行计算,可以很方便地获取这两个点。我们只需要在前一节的基础上,过滤出研究区域内的点,然后进行高程值对比即可。

在这里插入图片描述

结果过滤

对解析的坐标进行过滤,我们将其封装成一个方法,使用射线法判断点是否在多边形内

 function getInPolygonPositions(resultPositions, polygonPositions) {
     //转为笛卡尔 
     let transform = Cesium.Transforms.eastNorthUpToFixedFrame(polygonPositions[0]);
     let inverse = Cesium.Matrix4.inverse(transform, new Cesium.Matrix4);

     //转到局部坐标系
     let localPositions = [];
     positions.forEach(p => {
         localPositions.push(Cesium.Matrix4.multiplyByPoint(inverse, p, new Cesium.Cartesian3()));
     })
     //外包矩形
     let rect = Cesium.BoundingRectangle.fromPoints(localPositions, new Cesium.BoundingRectangle());
     ... 

     //判断是否在矩形内 
     let newPositions = [];
     resultPositions.forEach(position => {
         let p = Cesium.Matrix4.multiplyByPoint(inverse, position, new Cesium.Cartesian3());
         if (p.x >= rect.x && p.x <= rect.z && p.y >= rect.y && p.y <= rect.w) {
             points = localPositions;
             let nCount = points.length;

             let nCross = 0;
             for (let i = 0; i < nCount; i++) {
                 let p1 = points[i];
                 let p2;
                 if (i < nCount - 1) {
                     p2 = points[(i + 1)];
                 }
                 else {
                     p2 = points[0];
                 }
                 if (p1.y == p2.y) continue;
                 if (p.y < Math.min(p1.y, p2.y)) continue;
                 if (p.y >= Math.max(p1.y, p2.y)) continue;
                  ...;
             }
             if (nCross % 2 == 1) {
                 return newPositions.push(position);
             }
         }
     })


     return newPositions;
 } 

得到研究区域内的坐标数组后,只需要遍历一下,获取每个点的高程值进行一下对比,就能轻松获取这个区域的最高点和最低点。

positions = getInPolygonPositions(positions, polygonPositions);
positions.forEach((p, index) => {
    viewer.entities.add({
        position: p,
        point: {
            pixelSize: 3,
            color: Cesium.Color.RED,
        }
    })
})


let minHeight = 1000000;
let maxHeight = -100000;
let maxHeightPosition;
let minHeightPosition;
positions.forEach((position, index) => {
    const c = Cesium.Cartographic.fromCartesian(position);
    const d = [Cesium.Math.toDegrees(c.longitude), Cesium.Math.toDegrees(c.latitude), c.height];
    if (maxHeight < c.height) {
        maxHeight = c.height;
        maxHeightPosition = position;
    }

    if (minHeight > c.height) {
        minHeight = c.height;
        minHeightPosition = position;
    }
});

viewer.entities.add({
    position: maxHeightPosition,
    point: {
        pixelSize: 20,
        color: Cesium.Color.RED,
    },
    label: {
        text: "最高点",
        style: Cesium.LabelStyle.FILL_AND_OUTLINE,
        outline: true,
        outlineWidth: 5,
        outlineColor: Cesium.Color.BLACK,
        pixelOffset:new Cesium.Cartesian2(0,-30)
    }
})

viewer.entities.add({
    position: minHeightPosition,
    label: {
        text: "最低点",
        style: Cesium.LabelStyle.FILL_AND_OUTLINE,
        outline: true,
        outlineWidth: 5,
        outlineColor: Cesium.Color.BLACK,
        pixelOffset:new Cesium.Cartesian2(0,-30)
    },
    point: {
        pixelSize: 20,
        color: Cesium.Color.BLUE,

    }
})

在这里插入图片描述

示例效果可到 xt3d 官网 运行查看

更多内容见 Cesium高级教程-教程简介

性能与准确性

深度图纹理的大小决定了结果准确性的高低,越大结果越准确,但是性能越低,当然,渲染到深度图的过程没有影响,但是解析和判断点关系时点数量越多,需要的时间就越长。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

xt3d

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

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

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

打赏作者

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

抵扣说明:

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

余额充值