CesiumJS 案例 P15:检测标记、鼠标点击移动标记、鼠标拖动标记

CesiumJS


一、检测标记

html 复制代码
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title>Billboard - 检测标记</title>
		<link rel="stylesheet" href="../js/Cesium-1.112/Build/Cesium/Widgets/widgets.css" />
		<style>
			* {
				margin: 0;
				padding: 0;
				box-sizing: border-box;
			}

			html,
			body {
				width: 100%;
				height: 100%;
			}

			.container {
				width: 100%;
				height: 100%;
			}

			.btn-remove-marker {
				position: fixed;
				left: 0px;
				top: 0px;
			}

			.btn-check-marker {
				position: fixed;
				left: 0px;
				top: 50px;
			}
		</style>
	</head>

	<body>
		<div id="container"></div>
		<button class="btn-remove-marker">删除标记</button>
		<button class="btn-check-marker">检测标记</button>
	</body>

	<script src="../js/Cesium-1.112/Build/Cesium/Cesium.js"></script>
	<script>
		const viewer = new Cesium.Viewer("container");

		const billboards = viewer.scene.primitives.add(new Cesium.BillboardCollection());

		const billboard = billboards.add({
			image: "../img/marker-icon.png",
			position: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883),
			verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
		});

		const btnRemoveMarker = document.querySelector(".btn-remove-marker");
		const btnCheckMarker = document.querySelector(".btn-check-marker");

		btnRemoveMarker.addEventListener("click", () => {
			billboards.remove(billboard);
		});

		btnCheckMarker.addEventListener("click", () => {
			console.log(billboards.contains(billboard));
		});
	</script>
</html>

二、鼠标点击移动标记

html 复制代码
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Billboard - 鼠标点击移动标记</title>
        <link rel="stylesheet" href="../js/Cesium-1.112/Build/Cesium/Widgets/widgets.css" />
        <style>
            * {
                margin: 0;
                padding: 0;
                box-sizing: border-box;
            }

            html,
            body {
                width: 100%;
                height: 100%;
            }

            .container {
                width: 100%;
                height: 100%;
            }
        </style>
    </head>

    <body>
        <div id="container"></div>
    </body>

    <script src="../js/Cesium-1.112/Build/Cesium/Cesium.js"></script>
    <script>
        const viewer = new Cesium.Viewer("container");

        const billboards = viewer.scene.primitives.add(new Cesium.BillboardCollection());

        const billboard = billboards.add({
            id: "billboard-test",
            image: "../img/marker-icon.png",
            position: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883),
            verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
        });

        let isSelect = false;

        viewer.screenSpaceEventHandler.setInputAction((click) => {
            if (isSelect) {
                // 获取左击位置的射线
                const pickRay = viewer.camera.getPickRay(click.position);

                // 在地球表面找到与射线相交的点
                const pickPosition = viewer.scene.globe.pick(pickRay, viewer.scene);

                if (Cesium.defined(pickPosition)) {
                    // 如果找到了交点,将其转换为地理弧度坐标(Cartographic)
                    const cartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(pickPosition);

                    // 这里转换成直观的地理度数坐标
                    console.log("落点在地球球面,地理坐标为:", Cesium.Math.toDegrees(cartographic.longitude), Cesium.Math.toDegrees(cartographic.latitude));

                    // 将地理弧度坐标(Cartographic)转换为笛卡尔坐标(Cartesian3)
                    const cartesian3 = Cesium.Ellipsoid.WGS84.cartographicToCartesian(cartographic);

                    billboard.position = cartesian3;
                } else {
                    console.log("落点不在地球球面");

                    alert("落点不在地球球面,请重新操作");
                }
                
                isSelect = false;

                return;
            }

            const pickedObject = viewer.scene.pick(click.position);

            if (Cesium.defined(pickedObject) && pickedObject.id === "billboard-test") {
                console.log("点击了标记!!!");
                isSelect = true;
            } else {
                console.log("未点击标记");
            }
        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
    </script>
</html>

三、鼠标拖动标记

html 复制代码
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Billboard - 鼠标拖动标记</title>
        <link rel="stylesheet" href="../js/Cesium-1.112/Build/Cesium/Widgets/widgets.css" />
        <style>
            * {
                margin: 0;
                padding: 0;
                box-sizing: border-box;
            }

            html,
            body {
                width: 100%;
                height: 100%;
            }

            .container {
                width: 100%;
                height: 100%;
            }
        </style>
    </head>

    <body>
        <div id="container"></div>
    </body>

    <script src="../js/Cesium-1.112/Build/Cesium/Cesium.js"></script>
    <script>
        const viewer = new Cesium.Viewer("container");

        const billboards = viewer.scene.primitives.add(new Cesium.BillboardCollection());

        const billboard = billboards.add({
            id: "billboard-test",
            image: "../img/marker-icon.png",
            position: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883),
            verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
        });

        let isSelect = false;
        let originPositon;

        viewer.screenSpaceEventHandler.setInputAction((click) => {
            if (isSelect) {
                // 获取左击位置的射线
                const pickRay = viewer.camera.getPickRay(click.position);

                // 在地球表面找到与射线相交的点
                const pickPosition = viewer.scene.globe.pick(pickRay, viewer.scene);

                if (Cesium.defined(pickPosition)) {
                    // 如果找到了交点,将其转换为地理弧度坐标(Cartographic)
                    const cartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(pickPosition);

                    // 这里转换成直观的地理度数坐标
                    console.log("落点在地球球面,地理坐标为:", Cesium.Math.toDegrees(cartographic.longitude), Cesium.Math.toDegrees(cartographic.latitude));

                    // 将地理弧度坐标(Cartographic)转换为笛卡尔坐标(Cartesian3)
                    const cartesian3 = Cesium.Ellipsoid.WGS84.cartographicToCartesian(cartographic);

                    billboard.position = cartesian3;
                } else {
                    console.log("落点不在地球球面");

                    alert("落点不在地球球面,请重新操作");

                    billboard.position = originPositon;
                }

                isSelect = false;

                return;
            }

            const pickedObject = viewer.scene.pick(click.position);

            if (Cesium.defined(pickedObject) && pickedObject.id === "billboard-test") {
                console.log("点击了标记!!!");
                isSelect = true;
                originPositon = billboard.position.clone();
            } else {
                console.log("未点击标记");
            }
        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

        viewer.screenSpaceEventHandler.setInputAction((movement) => {
            if (!isSelect) return;

            const pickRay = viewer.camera.getPickRay(movement.endPosition);
            const pickPosition = viewer.scene.globe.pick(pickRay, viewer.scene);
            if (Cesium.defined(pickPosition)) {
                const cartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(pickPosition);
                console.log("移动位置在地球球面,地理坐标为:", Cesium.Math.toDegrees(cartographic.longitude), Cesium.Math.toDegrees(cartographic.latitude));
                const cartesian3 = Cesium.Ellipsoid.WGS84.cartographicToCartesian(cartographic);
                billboard.position = cartesian3;
            } else {
                console.log("移动位置不在地球球面");
                alert("移动位置不在地球球面,请重新操作");
                billboard.position = originPositon;
                isSelect = false;
            }
        }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
    </script>
</html>
相关推荐
甲维斯几秒前
Opus5.0首测,瘫坐沙发!效果,时间,token皆无敌!
前端·人工智能
LVZ3 分钟前
Skill + PVM 绝了,AI 直接帮你搞定环境问题了
前端
颜进强7 分钟前
从零搭建私人 RAG 知识库:让项目决策真正“可检索、可追溯”
前端·后端·ai编程
颜进强10 分钟前
Embedding 模型介绍:热门模型对比与应用场景
前端·后端·ai编程
颜进强11 分钟前
LanceDB 基础使用:用 TypeScript 完成第一次向量检索
前端·后端·ai编程
xyphf_和派孔明12 分钟前
企业级微前端项目完整创建步骤,第二步:配置主应用
前端
默_笙18 分钟前
🔑 让 AI 学会"读"网页:我用 Cheerio 爬了一篇掘金文章,然后切成小块存进了向量库
前端·javascript
颜进强18 分钟前
Ollama 从入门到实践:本地模型运行、API 调用
前端·后端·ai编程
颜进强23 分钟前
Embedding 基础使用:用 Ollama 和 LangChain.js 生成文本向量
前端·后端·ai编程
颜进强27 分钟前
Vector Store 入门:什么是向量数据库,主流产品如何选择
前端·后端·ai编程