cesium绘制点、线、面

这篇具有很好参考价值的文章主要介绍了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进行模型的绘制和加载文章来源地址https://www.toymoban.com/news/detail-514966.html

线

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);

到了这里,关于cesium绘制点、线、面的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • cesium-影像图&地形图&3dtiles模型

    ImageryLayer类: Cesium.ImageryLayer类用于表示Cesium中的影像图层,它就相当于皮毛、衣服,将数据源包裹在内,它需要数据源(imageryProvider)为其提供内在丰富的地理空间信息和属性信息,同时,通过该类还能设置影像图层相关属 性。 常用属性如下: name(名称), alpha(透明度) bri

    2024年02月06日
    浏览(61)
  • cesium 3dtiles地形遮挡、设置离地高度

    在开启 viewer.scene.globe.depthTestAgainstTerrain = true //开启地形深度检测 后加载3dtiles数据会导致被地形遮挡,导致3d tiles数据看不见 使用矩阵将模型高度提升

    2024年02月02日
    浏览(22)
  • 关于cesium根据地形画区域面积并覆盖在3d表面上

    最近一直在研究在3d地图上添加区域还有车辆路径路线,很是秃然啊!在不断的百度百度再百度,终于有了一套解决办法,先演示一下操作过程, drawLine()方法  drawPlane()方法 下面就来堆代码吧。 前提是开启了地形检测viewer.scene.globe.depthTestAgainstTerrain = true;一般开启会占用一定

    2024年02月11日
    浏览(25)
  • Cesium for UE4 加载离线地形和影像

    编译cesium-terrain-builder cesium native 解析 TMS 影像相关代码: 参见火星科技 发布三维数据服务将上述数据发布。 1、3DTiles Terrian Builder

    2024年02月11日
    浏览(26)
  • Cesium中加载地形影像切片,以及3dtiles和shp及kml方法

    1geoserver影像服务 2加载cesiumlab切出的地形切片 3加载geotif 4加载geojson 5加载kml 6加载shp 效果1     未完待续

    2024年02月11日
    浏览(30)
  • vue Cesium接入在线地图

    Cesium接入在线地图只需在创建时将imageryProvider属性换为在线地图的地址即可。 目录 天地图 OSM地图 ArcGIS 地图 谷歌影像地图

    2024年02月10日
    浏览(27)
  • 045:cesium加载OpenStreetMap地图

    第045个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中加载加载OpenStreetMap地图。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 注意OpenStreetMap国内加载有问题,需要曲线救图。 示例效果

    2023年04月08日
    浏览(25)
  • cesium绘制点、线、面

    点 线 面 在点云模型上绘制点线面与地形上类似 区别在于 取点坐标时需取模型上点的坐标 点 线 面 使用CZML进行模型的绘制和加载 线

    2024年02月11日
    浏览(27)
  • cesium模仿百度地图二三维切换

    百度地图二三维切换效果感觉比cesium自带的更平滑 不过百度地图的二三维切换只是简单的三维视角切换,二维是垂直视角

    2024年02月11日
    浏览(27)
  • Cesium教程(八):绘制几何形体

    目录 1、点要素 2、线要素 2.1 折线要素 2.2 轮廓线 3、面要素 4、体要素

    2024年02月08日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包