cesium绘制点、线、面

cesium绘制点、线、面


地图地形上

let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (movement) {
	// 点击时获取经纬度
	let ray = viewer.camera.getPickRay(movement.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; // 高度

    viewer.entities.add({
        name: "点",
        position: Cesium.Cartesian3.fromDegrees(lng, lat, alt), // 点生成的位置
        point: {
            color: Cesium.Color.DEEPSKYBLUE,	// 点颜色
            outlineColor: Cesium.Color.SKYBLUE,	// 点边框颜色
            pixelSize: 10,						// 点大小
            outlineWidth: 2,					// 点边框大小
            disableDepthTestDistance: Number.POSITIVE_INFINITY,		 // 受地形遮挡
            heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, // 生成在地形表面
        }
    });
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

线

let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
const positions = [] // 用于存储点的位置数据数组
handler.setInputAction(function (movement) {
	let ray = viewer.camera.getPickRay(movement.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; // 高度

    positions.push(Cesium.Cartesian3.fromDegrees(lng, lat, alt))
    
    if (positions.length < 1) return;
    viewer.entities.add({
	    name: "线",
        polyline: {
        	positions: positions,  // 点位置数组
            width: 5.0,				// 线宽度
            material: new Cesium.PolylineGlowMaterialProperty({
            	color: new Cesium.Color.fromCssColorString('#000'),
            }),						// 颜色
            depthFailMaterial: new Cesium.PolylineGlowMaterialProperty({
                color: new Cesium.Color.fromCssColorString('#ccc'),
            }),						// 被地形覆盖的虚线颜色
            clampToGround: true,	// 是否贴和地型
        }
   });
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
const positions = [] // 用于存储点的位置数据数组
handler.setInputAction(function (movement) {
	let ray = viewer.camera.getPickRay(movement.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; // 高度

    positions.push(Cesium.Cartesian3.fromDegrees(lng, lat, alt))
    
    if (positions.length < 1) return;
    viewer.entities.add({
            name: "面",
            polygon: {
                hierarchy: positions,	// 点位置数组
                material: new Cesium.Color.fromCssColorString("#FFD700").withAlpha(.2),
                // 面颜色
            },
        });
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);


点云模型

在点云模型上绘制点线面与地形上类似 区别在于 取点坐标时需取模型上点的坐标

let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (evt) {
        if (viewer.scene.mode !== Cesium.SceneMode.MORPHING) {
            const pickedObject = viewer.scene.pick(evt.position);
            if (viewer.scene.pickPositionSupported && Cesium.defined(pickedObject)) {
                const cartesian = viewer.scene.pickPosition(evt.position);
                if (Cesium.defined(cartesian)) {
                    const cartographic = Cesium.Cartographic.fromCartesian(cartesian);
                    const lng = Cesium.Math.toDegrees(cartographic.longitude);
                    const lat = Cesium.Math.toDegrees(cartographic.latitude);
                    const height = cartographic.height; //模型高度
                    const mapPosition = { x: lng, y: lat, z: height };
                    // 获取到点云模型上的经度纬度高度
                    console.log(mapPosition);

                    viewer.entities.add({
                    	name: "点云点",
	                    position: Cesium.Cartesian3.fromDegrees(lng, lat, height),
                    	point: {
                    		color: Cesium.Color.DEEPSKYBLUE,
                    		outlineColor: Cesium.Color.SKYBLUE,
                    		pixelSize: 10,
                    		outlineWidth: 2,
                    		disableDepthTestDistance: Number.POSITIVE_INFINITY,
                            // heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
                            // 由于点需要定位在点云模型上 因此不能设置为显示在地面
	                    }
                   });
                }
            }
        }
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

线

let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
const positions = [] // 用于存储点的位置数据数组
handler.setInputAction(function (evt) {
	if (viewer.scene.mode !== Cesium.SceneMode.MORPHING) {
    	const pickedObject = viewer.scene.pick(evt.position);
        if (viewer.scene.pickPositionSupported && Cesium.defined(pickedObject)) {
        	const cartesian = viewer.scene.pickPosition(evt.position);
            if (Cesium.defined(cartesian)) {
            	const cartographic = Cesium.Cartographic.fromCartesian(cartesian);
                const lng = Cesium.Math.toDegrees(cartographic.longitude);
                const lat = Cesium.Math.toDegrees(cartographic.latitude);
                const height = cartographic.height;//模型高度
                const mapPosition = { x: lng, y: lat, z: height };
                console.log(mapPosition);

                positions.push(Cesium.Cartesian3.fromDegrees(lng, lat, height))
                if (positions.length < 1) return;
                viewer.entities.add({
                	name: "点云线",
                    polyline: {
                    	positions: positions,
                    	width: 5.0,
                    	material: new Cesium.PolylineGlowMaterialProperty({
                        	color: Cesium.Color.GOLD,
                        }),
                        depthFailMaterial: new Cesium.PolylineGlowMaterialProperty({
                                color: Cesium.Color.GOLD,
                            }),
                        // clampToGround: true,
                        // 由于线需要定位在点云模型上 因此不能设置为显示在地面
                        }
                    });
                }
            }
        }
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
const positions = [] // 用于存储点的位置数据数组
handler.setInputAction(function (evt) {
	if (viewer.scene.mode !== Cesium.SceneMode.MORPHING) {
    	const pickedObject = viewer.scene.pick(evt.position);
        if (viewer.scene.pickPositionSupported && Cesium.defined(pickedObject)) {
        	const cartesian = viewer.scene.pickPosition(evt.position);
            if (Cesium.defined(cartesian)) {
            	const cartographic = Cesium.Cartographic.fromCartesian(cartesian);
                const lng = Cesium.Math.toDegrees(cartographic.longitude);
                const lat = Cesium.Math.toDegrees(cartographic.latitude);
                const height = cartographic.height;//模型高度
                const mapPosition = { x: lng, y: lat, z: height };
                console.log(mapPosition);

                positions.push(Cesium.Cartesian3.fromDegrees(lng, lat, height))
                if (positions.length < 1) return;
                viewer.entities.add({
                        name: "点云面",
                        polygon: {
                            hierarchy: positions,
                            material: new Cesium.Color.fromCssColorString("#000").withAlpha(.8),
                        },
                 });
             }
         }
     }
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);


CZML

使用CZML进行模型的绘制和加载

线

const getCzmlLine = (cartographicDegrees) => {
        return [{
            "id": "document",
            "name": "CZML Geometries: Polyline",
            "version": "1.0"
        }, {
            "id": "fullLine",
            "name": "Yellow full line",
            "polyline": {
                "positions": {
                    "cartographicDegrees": cartographicDegrees
                },
                "material": {
                    "solidColor": {
                        "color": {
                            "rgba": [255, 255, 0, 255]
                        }
                    }
                }
            }
        }];
}
const  creatLine = (polyLinePositions) => {
        // 创建czml文件;得到czml数据源
        const polyLineSet = polyLinePositions.reduce((positionCollection, item) => ([...positionCollection, ...Object.values(item)]), [])
        const czmlLine = getCzmlLine(polyLineSet);
        // 加载提供的URL或CZML对象,替换任何现有数据。
        const dataSourcePromise = Cesium.CzmlDataSource.load(czmlLine);
        viewer.dataSources.add(dataSourcePromise);
        // 添加czml数据到三维球上
        // viewer.zoomTo(dataSourcePromise);
}

const positions = [] // 用于存储点的位置数据数组
handler.setInputAction(function (evt) {
        let ray = viewer.camera.getPickRay(evt.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 alt = 0; // 高度
        
        positions.push({lng, lat, alt})

        if (positions.length < 1) return; // 至少具有两组点的坐标 才划线
        creatLine(positions)
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
### 回答1: Cs.js是一个开源的WebGL框架,支持绘制线3D图形。它提供了一个简单的封装负责管理WebGL渲染流程和带有简单工具库的API。其中,cesium绘制点线面封装是其重要的功能之一。 cesium绘制点线面封装可以在3D场景中绘制不同的几何形状。它使用CeisumJS的基础结构,通过提供必要的参数,可以生成一个形状对象。这个形状对象可以在场景中随意移动、放大、旋转或者删除。除此之外,绘制线可以使用不同的样式和颜色。 通过cesium绘制点线面封装,用户可以创建简单的图形形状或是更加复杂的3D模型。例如,用户可以绘制一个球体、立方体、圆形或者多边形等形状。这些形状可以是实心的、空心的或者半透明的,且可以根据需要进行颜色和纹理的调整。 总的来说,cesium绘制点线面封装简化了3D场景的创建和管理流程。同时,它具有强大的可定制性,使得用户可以根据自己的需求和喜好制作精美的3D图形。 ### 回答2: Cesium是一种开放源代码的虚拟地球浏览器,它允许用户在浏览器中查看,操作和交互地理信息。Cesium提供了丰富的API,其中包括绘制多种类型的图形功能。Cesium绘制点线面封装,即是通过Cesium提供的API对点线面进行封装和自定义样式。 首先,可以使用Cesium的Entity API创建点线面,这些基本实体包括、直线、多段线以及它们的混合体,如多边形和多体。通过设置不同的样式和属性,例如颜色、透明度、线宽、纹理等,可以自定义图形样式。 其次,Cesium还提供了Primitive类型来提高绘制效率和性能。Primitive是Cesium中一种基于WebGL实现的渲染图元,它可以用来绘制所有类型的点线面图形。具体而言,可以使用GroundPrimitive类型绘制贴地图形,如粒子云、热力图等;使用ShadowVolume类型绘制视觉效果良好和高效的实时阴影。 最后,Cesium提供了与三维地球视图交互的接口,可以在地球上自由移动、旋转、缩放视图,并支持与用户输入交互。因此,Cesium绘制点线面封装可以轻松实现图形可视化和交互性。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Raccom

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

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

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

打赏作者

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

抵扣说明:

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

余额充值