Cesium 坑-不支持地形

效果图:

southeast2.jpg

源码:

<template>
    <div id="cesiumContainer">
    </div>
</template>

<script setup>
import { onMounted } from "vue";
import * as turf from '@turf/turf';

let viewer, globe;
let center = [109.70171, 18.22181];
let radius = 30;
let options = { steps: 128, units: 'meters' };

const loadStHelens = () => {
    let circle = turf.circle(center, radius, options);
    let coordinates = circle.geometry.coordinates[0];
    coordinates = coordinates.splice(0, coordinates.length - 1);
    const points = [];
    coordinates.forEach(coordinate => {
        points.push(Cesium.Cartesian3.fromDegrees(coordinate[0], coordinate[1], 0))
    });
    const pointsLength = points.length;
    const clippingPlanes = [];
    for (let i = 0; i < pointsLength; ++i) {
        const nextIndex = (i + 1) % pointsLength;
        let midpoint = Cesium.Cartesian3.add(
            points[i],
            points[nextIndex],
            new Cesium.Cartesian3()
        );
        midpoint = Cesium.Cartesian3.multiplyByScalar(
            midpoint,
            0.5,
            midpoint
        );
        const up = Cesium.Cartesian3.normalize(
            midpoint,
            new Cesium.Cartesian3()
        );
        let right = Cesium.Cartesian3.subtract(
            points[nextIndex],
            midpoint,
            new Cesium.Cartesian3()
        );
        right = Cesium.Cartesian3.normalize(right, right);
        let normal = Cesium.Cartesian3.cross(
            right,
            up,
            new Cesium.Cartesian3()
        );
        normal = Cesium.Cartesian3.normalize(normal, normal);
        const originCenteredPlane = new Cesium.Plane(normal, 0.0);
        const distance = Cesium.Plane.getPointDistance(
            originCenteredPlane,
            midpoint
        );
        clippingPlanes.push(new Cesium.ClippingPlane(normal, distance));
    }
    globe.clippingPlanes = new Cesium.ClippingPlaneCollection({
        planes: clippingPlanes,
        edgeWidth: 0.0,
        edgeColor: Cesium.Color.WHITE,
        enabled: true,
    });
    globe.backFaceCulling = true;
    globe.showSkirts = true;
}

onMounted(() => {
    viewer = new Cesium.Viewer("cesiumContainer");
    globe = viewer.scene.globe;
    viewer.entities.add({
        name: "Bowl",
        position: Cesium.Cartesian3.fromDegrees(center[0], center[1], 0),
        ellipsoid: {
            radii: new Cesium.Cartesian3(30.0, 30.0, 30.0),
            innerRadii: new Cesium.Cartesian3(29.0, 29.0, 29.0),
            minimumCone: Cesium.Math.PI_OVER_TWO,
            material: new Cesium.ImageMaterialProperty({
                image: "../images/southeast2.jpg",
                repeat: new Cesium.Cartesian2(1, 1),
            }),
            outline: false,
        }
    });
    viewer.zoomTo(viewer.entities);
    loadStHelens();

    let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
    handler.setInputAction((event) => {
        let ray = viewer.camera.getPickRay(event.position);
        let cartesian = viewer.scene.globe.pick(ray, viewer.scene);
        let cartographic = Cesium.Cartographic.fromCartesian(cartesian);
        let lng = Cesium.Math.toDegrees(cartographic.longitude); // 经度
        let lat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度
        let alt = cartographic.height; // 高度
        let coordinate = {
            longitude: Number(lng.toFixed(6)),
            latitude: Number(lat.toFixed(6)),
            altitude: Number(alt.toFixed(2))
        };
        console.log(coordinate);
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
});

</script>

<style scoped></style>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值