cesium 学习(八) 基础绘制(点线面)

一、前言

  对于一个地图GIS场景,绘制点、线、面属于是基础功能,无论是二维地图还是三维地图场景均是如此,尤其对于三维场景来说比二维应该是更加困难了些。

但是基础的简单绘制不用考虑太多,下面我们开始学习在Cesium的三维场景中如何进行基础绘制的实现。

二、使用原始Cesium的Entity方法绘制

  Cesium中封装了几何对象的接口,也就是点、线、面、圆柱体、长方体、圆锥体等等,还有特殊的几何对象:corridor、ellipse、ellipsoid;以及billboard和model。但这次主要是使用点、线、面这三个几何对象,其他的几何对象都是类似的,使用方法大同小异,主要是看每个几何对象自身内部所需要的参数有哪些罢了。

2.1绘制点Entity

  首先看看PointGraphics点几何对象,它需要的参数是点的位置(坐标、最主要的),样式(颜色、轮廓的宽度、颜色等)。那么我们传给它这些属性即可实现绘制点的功能。

核心代码如下:

1、使用handler构建鼠标事件:

//绘制点
        document.getElementById("drawpoint").addEventListener("click", function () {
            var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
            handler.setInputAction(function (movement) {
                tooltip.style.left = movement.endPosition.x + 10 + "px";
                tooltip.style.top = movement.endPosition.y + 20 + "px";
            }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
            handler.setInputAction(function (movement) {
                position = viewer.camera.pickEllipsoid(movement.position, viewer.scene.globe.ellipsoid);
                let point = drawPoint(position);
                tempEntities.push(point);
            }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
            handler.setInputAction(function () {
                handler.destroy();//关闭事件句柄
                handler = null;
            }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
            handler.setInputAction(function () {
                handler.destroy();//关闭事件句柄
                handler = null;
            }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
        });

2、使用entity添加点:

function drawPoint(position, config) {
            var config = config ? config : {};
            var pointGeometry = viewer.entities.add({
                name: "点几何对象",
                position: position,
                point: {
                    color: Cesium.Color.SKYBLUE,
                    pixelSize: 10,
                    outlineColor: Cesium.Color.YELLOW,
                    outlineWidth: 3,
                    disableDepthTestDistance: Number.POSITIVE_INFINITY
                }
            });
            return pointGeometry;
        };

3、效果图:

2.2绘制线Entity

  可以看看PolylineGraphics对象中的属性,两点连成线,positions属性就是用来存放各个拐点的;还有线的宽度width,样式等和点类似。

1、使用handler构建鼠标事件:

//绘制线
        document.getElementById("drawline").addEventListener("click", function () {
            handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
            var tempPoints = [];
            //鼠标移动事件
            handler.setInputAction(function (movement) {
                tooltip.style.left = movement.endPosition.x + 10 + "px";
                tooltip.style.top = movement.endPosition.y + 20 + "px";
            }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
            //左键点击操作
            handler.setInputAction(function (click) {
                //调用获取位置信息的接口
                position = viewer.camera.pickEllipsoid(click.position, viewer.scene.globe.ellipsoid);
                tempPoints.push(position);
                let tempLength = tempPoints.length;
                //调用绘制点的接口
                let point = drawPoint(tempPoints[tempPoints.length - 1]);
                tempEntities.push(point);
                if (tempLength > 1) {
                    let pointline = drawPolyline([tempPoints[tempPoints.length - 2], tempPoints[tempPoints.length - 1]]);
                    tempEntities.push(pointline);
                }
                else {
                    tooltip.innerHTML = "请绘制下一个点,右键结束";
                }
                return;
            }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
            //右键点击操作
            handler.setInputAction(function (click) {
                tooltip.style.display = "none";
                tooltip.innerHTML = "左键单击绘制,右键结束绘制";
                tempPoints = [];
                handler.destroy();//关闭事件句柄
                handler = null;
            }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
        });

2、使用entity添加线:

function drawPolyline(positions, config) {
            if (positions.length < 1) return;
            var config = config ? config : {};
            var polylineGeometry = viewer.entities.add({
                name: "线几何对象",
                polyline: {
                    positions: positions,
                    width: config.width ? config.width : 5.0,
                    material: new Cesium.PolylineGlowMaterialProperty({
                        color: config.color ? new Cesium.Color.fromCssColorString(config.color) : Cesium.Color.GOLD,
                    }),
                    depthFailMaterial: new Cesium.PolylineGlowMaterialProperty({
                        color: config.color ? new Cesium.Color.fromCssColorString(config.color) : Cesium.Color.GOLD,
                    }),
                }
            });
            return polylineGeometry;
        };

3、效果图:

2.3绘制面Entity

  面几何对象,我们使用PolygonGraphics来绘制。绘制一个面,我们会绘制多个点、多条线组合成。它的属性也是类似的,其中positions属性同线对象是一样的。

1、使用handler构建鼠标事件:

//绘制面
        document.getElementById("drawploy").addEventListener("click", function () {
            var tempPoints = [];
            handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
            tooltip.style.display = "block";
            //鼠标移动事件
            handler.setInputAction(function (movement) {
                tooltip.style.left = movement.endPosition.x + 10 + "px";
                tooltip.style.top = movement.endPosition.y + 20 + "px";
            }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
            //左键点击操作
            handler.setInputAction(function (click) {
                //调用获取位置信息的接口
                position = viewer.camera.pickEllipsoid(click.position, viewer.scene.globe.ellipsoid);
                tempPoints.push(position);
                let tempLength = tempPoints.length;
                //调用绘制点的接口
                let point = drawPoint(position);
                tempEntities.push(point);
                if (tempLength > 1) {
                    let pointline = drawPolyline([tempPoints[tempPoints.length - 2], tempPoints[tempPoints.length - 1]]);
                    tempEntities.push(pointline);
                } else {
                    tooltip.innerHTML = "请绘制下一个点,右键结束";
                }
                return;

            }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
            //右键点击操作
            handler.setInputAction(function (click) {
                let cartesian = viewer.camera.pickEllipsoid(click.position, viewer.scene.globe.ellipsoid);
                if (cartesian) {
                    let tempLength = tempPoints.length;
                    if (tempLength < 3) {
                        alert(‘请选择3个以上的点再执行闭合操作命令‘);
                    } else {
                        //闭合最后一条线
                        let pointline = drawPolyline([tempPoints[tempPoints.length - 1], tempPoints[0]]);
                        tempEntities.push(pointline);
                        drawPolygon(tempPoints);
                        tempEntities.push(tempPoints);
                        handler.destroy();//关闭事件句柄
                        handler = null;
                    }
                }
            }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
        });

2、使用entity添加面:

function drawPolygon(positions, config) {
            if (positions.length < 2) return;
            var config = config ? config : {};
            var polygonGeometry = viewer.entities.add({
                name: "线几何对象",
                polygon: {
                    height: 0.1,
                    hierarchy: new Cesium.PolygonHierarchy(positions),
                    material: config.color ? new Cesium.Color.fromCssColorString(config.color).withAlpha(.2) : new Cesium.Color.fromCssColorString("#FFD700").withAlpha(.2),
                    perPositionHeight: true,
                }
            });
            return polygonGeometry;
        };

3、效果图:

三、DrawHandler插件

  网上有很多大佬们写了自己的DrawHandler For Ceisum的插件,其中的功能更加丰富,非常适合偷懒者使用(ˇ∀ˇ)。当然也是学习的好资料,其中绘制的方法是不一样的,我上面的是简单的绘制,且没有实时将线绘制出来,面也是,而drawhandler插件实现的方式却是实时绘制出来的。下面我们来看看。

3.1绘制点

3.2绘制线

3.3绘制面

四、总结

  使用自己制作的基础绘制工具,其优点是方便、快捷,缺点是简陋,但好方法、好技术都是慢慢积累出来的,这里我只是使用了Cesium的Entity中的点、线、面绘制,Entity中还有很多的几何对象绘制,可以自行查看API学习,如果之后有时间会考虑再补充。

  插件是好东西,对于我们使用来说极其方便,用起来也是好用,但是对于我们理解Cesium来说就少了些内容,如果有时间应当自己去模仿一下插件的实现,或者阅读其源码,看看它是如何实现的。

原文地址:https://www.cnblogs.com/CreateFree/p/11488492.html

时间: 2024-08-30 09:09:07

cesium 学习(八) 基础绘制(点线面)的相关文章

Swift学习——Swift基础详解(八)

Assertions    断言 可选可以让你判断值是否存在,你可以在代码中优雅地处理值缺失的情况.然而,在某些情况下,如果值缺失或者值并不满足特定的条件,你的代码可能并不需要继续执行.这时,你可以在你的代码中触发一个断言(assertion)来结束代码运行并通过调试来找到值缺失的原因. Debugging with Assertions    使用断言进行调试 断言会在运行时判断一个逻辑条件是否为true.从字面意思来说,断言"断言"一个条件是否为真.你可以使用断言来保证在运行其他代

一步步学习javascript基础篇(3):Object、Function等引用类型

我们在<一步步学习javascript基础篇(1):基本概念>中简单的介绍了五种基本数据类型Undefined.Null.Boolean.Number和String.今天我们主要介绍下复杂数据类型(即引用数据类型) Object类型 我们用的最多的引用类型就属object类型了,一般用来存储和传输数据是再好不过的.然,它的两种创建方式我们是否了解呢? 1.通过构造函数来创建 如: var obj = new Object(); 在js中的引用类型有个非常灵活的用法,可以动态的附加属性和赋值.

WPF3D学习,立方体的绘制

原文:WPF3D学习,立方体的绘制 以此为一个好的开始吧!一直都太懒,坚持写文章是个不错的开始!碰巧最近在研究WPF3D这块的知识,也为了练练自己的写作水平,整理这篇文章.新手上路,多多关照! 本文先以一个简单的立方体来系统的阐述WPF中三维场景中的各元素. 练练功底,我就简单说下,说不清楚大家可以移步到http://msdn.microsoft.com/zh-cn/library/ms747437.aspx这里,微软说的很清楚. 先来说一些基础的东西. 三位坐标系 在3-D坐标系中,原点位于呈

大数据系统学习零基础入门到精通加项目实战2017最新全套视频教程

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

cesium 学习(七) HeadingPitchRoll

cesium 学习(七) HeadingPitchRoll 一.前言 对于模型旋转变换.相机视角变换以及方向变换的处理操作,也就是改变heading.pitch.roll这三个的值.这三个值代表什么意思呢?接下来就专门介绍一下Cesium的HeadingPitchRoll. 二.HeadingPitchRoll HeadingPitchRoll其实也就是欧拉(Euler)角:   机体坐标系与地面坐标系的关系是三个Euler角:yaw,pitch,roll,反应了飞机相对地面的姿态.也就是说Ya

Linux学习 -- Shell基础 -- 概述

Shell是什么? 命令解释器 编程语言 Linux支持的Shell类型 cat /etc/shells 主要学习 bash 脚本执行方式 echo echo -e 单引号 -- 原始字符串  双引号 -- 支持转义字符串 \e[1;31m xxx  开启颜色 \e[0m    关闭颜色 首行:#!/bin/bash #写好注释 执行方式: 方式1 sh xxx.sh 方式2 chmod 755 xxx.sh  ./xxx.sh 或 绝对路径 Linux学习 -- Shell基础 -- 概述

Ant学习-001-ant 基础知识及windows环境配置

一.Ant 概要基础知识 Apache Ant 是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发,用以构建应用,或结合其他开源测试工具例如 git.TestNG等搭建持续集成测试开发环境,从而高效.高质量的构建产品. Ant 有以下一些优点: 跨平台,可移植.Ant 是 Java 语言编写的,所以有很好的跨平台性和可移植性,无论是在 windows.Linux,还是 mac. 操作简单. Ant 是由一个内置任务和可选任务组成的,运行时需要一个构

Linux学习 -- Shell基础 -- Bash基本功能

历史命令 history -c   clear -w   写入 ~/.bash_history 默认保存1000条, 可在/etc/profile中修改 调用 Tab补全 命令.目录.文件 命令别名 alias 别名='原命令' 命令执行顺序: 绝对路径或相对路径 > 别名 > Bash的内部命令 > $PATH环境变量中找到的第一个命令(外部命令) 配置文件:/root/.bashrc 删除:unalias 别名 常用快捷键 输入输出重定向 标准输入输出 输出重定向 注意:2和>

学习pyqt4 基础 2

学习pyqt4 基础 2 回顾 之前有句话这么说:QWidget 部件是PyQt4 中所有用户界面类的父类. 突然想起,在上节中,或许会碰到中文乱码问题,在字符串前面加上u,表示unicode(具体原理也不清楚).解决办法:比如 u'你好'. 在下面的例子中有体现. 主窗口 QMainWindow类用来创建应用程序的主窗口.通过该类,我们可以创建一个包含状态栏,工具栏和菜单栏的经(老)典(套)应用程序框架.(虽老套,但基础还是要尽量牢固) 状态栏 #! /usr/bin/python # -*-