本文基于ES6,采用React+Cesium的Webgis前端开发框架,目前threejs和cesium的结合正在研究中。此段代码采用原生javascript,可能过程中用到了es6的扁平化语法,如()=>{},list.map方法。

废话不多说了,直接上代码。

import Cesium from 'cesium/Source/Cesium';
import monitor from '../style/images/monitor.jpeg'; const ECesium = {
version: '0.1',
description: '自定义cesium组件',
copyright: '2018-enbo'
}; ECesium.Tools = function (viewer, callback) {
this.viewer = viewer;
this.init();
}; ECesium.Tools.prototype.init = function (back) {
//初始化事件
const viewer = this.viewer;
const scene = viewer.scene;
this.drawingMode = null;
this.measureMode = null;
this.geodesic = new Cesium.EllipsoidGeodesic();
this.handler = new Cesium.ScreenSpaceEventHandler(scene.canvas); this.dataSource = new Cesium.CustomDataSource('test1');
viewer.dataSources.add(this.dataSource);
console.log(viewer.dataSources.indexOf(this.dataSource));
}; ECesium.Tools.prototype.draw = function (type) {
if (!this.viewer) return console.error('this.viewer 未定义');
this.deactivate();
this.drawingMode = type;
switch (type) {
case this.DRAW_TYPE.Point:
this.DrawPoint();
break;
case this.DRAW_TYPE.PolyLine:
case this.DRAW_TYPE.Polygon:
this.DrawGraphics();
break;
default:
break;
}
}; ECesium.Tools.prototype.DrawPoint = function (callback) {
const viewer = this.viewer;
const this_ = this;
this.drawingMode = "point";
this.handler.setInputAction(function (evt) {
const ray = viewer.camera.getPickRay(evt.position);
const mapPosition = this_.getMapPoint(ray);
if (!mapPosition) return;
this_.dataSource.entities.add({
id: '云台' + Math.random(),
name: '林火监测点',
position: Cesium.Cartesian3.fromDegrees(mapPosition.x, mapPosition.y, mapPosition.z),
point: new Cesium.PointGraphics({
color: Cesium.Color.SKYBLUE,
pixelSize: 10,
outlineColor: Cesium.Color.YELLOW,
outlineWidth: 3,
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
}),
description: `<img style="height: 200px;" src=${monitor}>`
});
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
}; ECesium.Tools.prototype.DrawGraphics = function (callback) {
const viewer = this.viewer;
const this_ = this;
let activeShapePoints = [];
let activeShape, floatingPoint;
this.handler.setInputAction(function (event) {
if (!Cesium.Entity.supportsPolylinesOnTerrain(viewer.scene)) {
return console.log('This browser does not support polylines on terrain.');
}
const ray = viewer.camera.getPickRay(event.position);
const earthPosition = viewer.scene.globe.pick(ray, viewer.scene);
if (Cesium.defined(earthPosition)) {
if (activeShapePoints.length === 0) {
floatingPoint = this_.createPoint(earthPosition);
activeShapePoints.push(earthPosition);
const dynamicPositions = new Cesium.CallbackProperty(function () {
return activeShapePoints;
}, false);
activeShape = this_.drawShape(dynamicPositions);
} activeShapePoints.push(earthPosition);
this_.createPoint(earthPosition);
} }, Cesium.ScreenSpaceEventType.LEFT_CLICK); this.handler.setInputAction(function (event) {
if (Cesium.defined(floatingPoint)) {
const ray = viewer.camera.getPickRay(event.endPosition);
const newPosition = viewer.scene.globe.pick(ray, viewer.scene);
if (Cesium.defined(newPosition)) {
floatingPoint.position.setValue(newPosition);
activeShapePoints.pop();
activeShapePoints.push(newPosition);
}
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE); this.handler.setInputAction(function () {
terminateShape();
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK); function terminateShape() {
activeShapePoints.pop();
this_.drawShape(activeShapePoints);
this.dataSource.entities.remove(floatingPoint);
this.dataSource.entities.remove(activeShape);
floatingPoint = undefined;
activeShape = undefined;
activeShapePoints = [];
}
}; ECesium.Tools.prototype.getMapPoint = function (ray) {
const viewer = this.viewer;
const cartesian = viewer.scene.globe.pick(ray, viewer.scene);
if (!cartesian) {
return null;
} const cartographic = Cesium.Cartographic.fromCartesian(cartesian);
const lng = Cesium.Math.toDegrees(cartographic.longitude);//经度值
const lat = Cesium.Math.toDegrees(cartographic.latitude);//纬度值
//cartographic.height的值为地形高度。
return {x: lng, y: lat, z: cartographic.height};
}; ECesium.Tools.prototype.createPoint = function (worldPosition) {
return this.dataSource.entities.add({
position: worldPosition,
point: {
color: Cesium.Color.WHITE,
pixelSize: 5,
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
}
});
}; ECesium.Tools.prototype.drawShape = function (positionData) {
switch (this.drawingMode) {
case this.DRAW_TYPE.PolyLine:
return this.dataSource.entities.add({
polyline: {
positions: positionData,
clampToGround: true,
width: 3
}
});
case this.DRAW_TYPE.Polygon:
return this.dataSource.entities.add({
polygon: {
hierarchy: positionData,
material: new Cesium.ColorMaterialProperty(Cesium.Color.WHITE.withAlpha(0.7))
}
});
default:
return;
}
}; ECesium.Tools.prototype.measure = function (type) {
this.deactivate();
this.measureMode = type;
this.DrawMeasureGraphics();
}; ECesium.Tools.prototype.DrawMeasureGraphics = function () {
const viewer = this.viewer;
const this_ = this;
let activeShapePoints = [];
let activeShape, floatingPoint;
let measureDistance = 0, floatDistance = 0;
this.handler.setInputAction(function (event) {
if (!Cesium.Entity.supportsPolylinesOnTerrain(viewer.scene)) {
return console.log('This browser does not support polylines on terrain.');
}
const ray = viewer.camera.getPickRay(event.position);
const earthPosition = viewer.scene.globe.pick(ray, viewer.scene);
if (Cesium.defined(earthPosition)) {
if (activeShapePoints.length === 0) {
floatingPoint = this_.createMeasurePoint(earthPosition);
if (this_.measureMode === this_.MEASURE_TYPE.MEASURE_DISTANCE) {
floatingPoint.label = {
text: new Cesium.CallbackProperty(function (time) {
let distance = floatDistance = this_.getLatestLength(activeShapePoints);
return ((distance + measureDistance) / 1000).toFixed(2) + ' km';
}, false),
showBackground: true,
backgroundColor: new Cesium.Color(0, 0, 0, 0.5),
backgroundPadding: new Cesium.Cartesian2(7, 5),
font: '16px sans-serif',
}; this_.createLabel(earthPosition, '起点')
}
activeShapePoints.push(earthPosition);
const dynamicPositions = new Cesium.CallbackProperty(function () {
return activeShapePoints;
}, false);
activeShape = this_.drawMeasureShape(dynamicPositions);
} if (activeShapePoints.length > 1 && this_.measureMode === this_.MEASURE_TYPE.MEASURE_DISTANCE) {
measureDistance += floatDistance;
this_.createLabel(earthPosition, (measureDistance / 1000).toFixed(2) + ' km');
} activeShapePoints.push(earthPosition);
this_.createMeasurePoint(earthPosition);
} }, Cesium.ScreenSpaceEventType.LEFT_CLICK); this.handler.setInputAction(function (event) {
if (Cesium.defined(floatingPoint)) {
const ray = viewer.camera.getPickRay(event.endPosition);
const newPosition = viewer.scene.globe.pick(ray, viewer.scene);
if (Cesium.defined(newPosition)) {
floatingPoint.position.setValue(newPosition);
activeShapePoints.pop();
activeShapePoints.push(newPosition);
}
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE); this.handler.setInputAction(function () {
terminateShape();
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK); function terminateShape() {
activeShapePoints.pop();
this_.drawMeasureShape(activeShapePoints);
this_.dataSource.entities.remove(floatingPoint);
this_.dataSource.entities.remove(activeShape);
floatingPoint = undefined;
activeShape = undefined;
activeShapePoints = [];
measureDistance = 0;
}
}; ECesium.Tools.prototype.drawMeasureShape = function (positionData, callback) {
console.log("draw shape");
switch (this.measureMode) {
case this.MEASURE_TYPE.MEASURE_DISTANCE:
return this.dataSource.entities.add({
polyline: {
positions: positionData,
clampToGround: true,
width: 3
}
});
case this.MEASURE_TYPE.MEASURE_AREA:
return this.dataSource.entities.add({
polygon: {
hierarchy: positionData,
material: new Cesium.ColorMaterialProperty(Cesium.Color.WHITE.withAlpha(0.7))
}
});
default:
return;
}
}; ECesium.Tools.prototype.getLatestLength = function (activeShapePoints) {
const length = activeShapePoints.length;
const endPoint = activeShapePoints[length - 1];
const startPoint = activeShapePoints[length - 2];
const startCartographic = Cesium.Cartographic.fromCartesian(startPoint);
const endCartographic = Cesium.Cartographic.fromCartesian(endPoint);
this.geodesic.setEndPoints(startCartographic, endCartographic);
return Math.round(this.geodesic.surfaceDistance);
}; ECesium.Tools.prototype.createMeasurePoint = function (worldPosition, callback) {
return this.dataSource.entities.add({
position: worldPosition,
point: {
color: Cesium.Color.WHITE,
pixelSize: 8,
outlineColor: Cesium.Color.RED,
outlineWidth: 3,
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
scaleByDistance: new Cesium.NearFarScalar(0, 0, 1, 1)
}
});
}; ECesium.Tools.prototype.createLabel = function (worldPosition, text) {
return this.dataSource.entities.add({
position: worldPosition,
label: {
text: text,
showBackground: true,
backgroundColor: new Cesium.Color(1, 1, 1, 0.7),
backgroundPadding: new Cesium.Cartesian2(7, 5),
font: '16px sans-serif',
fillColor: Cesium.Color.BLACK,
outlineColor: Cesium.Color.BLACK,
pixelOffset: new Cesium.Cartesian2(-15, -15)
}
});
}; ECesium.Tools.prototype.deactivate = function () {
if (this.handler) {
this.handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
} this.drawingMode = null;
}; ECesium.Tools.prototype.DRAW_TYPE = {
Point: 'Point',
PolyLine: 'PolyLine',
Polygon: 'Polygon'
}; ECesium.Tools.prototype.MEASURE_TYPE = {
MEASURE_DISTANCE: 'MeasureTerrainDistance',
MEASURE_AREA: 'MeasureTerrainArea'
};
export default ECesium;

   使用时直接实例化ECesium

this.tool = new ECesium.Tools(this.viewer);

   绘制图形

this.tool.draw('Point/PolyLine/Polygon');

   测距

this.tool.measure(MeasureTerrainDistance);

Tips*面积测量没有添加计算方法,后期会加上。

Cesium 绘制点、线、面和测距的更多相关文章

  1. 【带着canvas去流浪(5)】绘制K线图

    目录 一. 任务说明 二. 重点提示 三. 示例代码 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文 ...

  2. CAD交互绘制样条线(网页版)

    在CAD设计时,需要绘制样条线,用户可以设置样条线线重及颜色等属性. 主要用到函数说明: _DMxDrawX::SendStringToExecuteFun 把命令当着函数执行,可以传参数.详细说明如 ...

  3. CAD交互绘制样条线(com接口)

    在CAD设计时,需要绘制样条线,用户可以设置样条线线重及颜色等属性. 主要用到函数说明: _DMxDrawX::SendStringToExecuteFun 把命令当着函数执行,可以传参数.详细说明如 ...

  4. CAD参数绘制样条线(com接口)

    在CAD设计时,需要绘制样条线,用户可以设置样条线线重及颜色等属性. 主要用到函数说明: _DMxDrawX::PathLineTo 把路径下一个点移到指定位置.详细说明如下: 参数 说明 DOUBL ...

  5. CAD参数绘制样条线(网页版)

    在CAD设计时,需要绘制样条线,用户可以设置样条线线重及颜色等属性. 主要用到函数说明: _DMxDrawX::PathLineTo 把路径下一个点移到指定位置.详细说明如下: 参数 说明 DOUBL ...

  6. CAD动态绘制样条线(网页版)

    在CAD设计时,需要绘制样条线,用户可以设置样条线线重及颜色等属性. 主要用到函数说明: _DMxDrawX::SendStringToExecuteFun 把命令当着函数执行,可以传参数.详细说明如 ...

  7. 带着canvas去流浪系列之五 绘制K线图

    [摘要] 用canvas原生API实现百度Echarts 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 任务说明 使用原生canvasAPI绘制 ...

  8. 用Python爬取股票数据,绘制K线和均线并用机器学习预测股价(来自我出的书)

    最近我出了一本书,<基于股票大数据分析的Python入门实战 视频教学版>,京东链接:https://item.jd.com/69241653952.html,在其中用股票范例讲述Pyth ...

  9. 使用Python的pandas模块、mplfinance模块、matplotlib模块绘制K线图

    目录 pandas模块.mplfinance模块和matplotlib模块介绍 pandas模块 mplfinance模块和matplotlib模块 安装mplfinance模块.pandas模块和m ...

  10. mapboxgl绘制3D线

    最近遇到个需求,使用mapboxgl绘制行政区划图层,要求把行政区划拔高做出立体效果,以便突出显示. 拿到这个需求后,感觉很简单呀,只需要用fill-extrusion方式绘制就可以啦,实现出来是这个 ...

随机推荐

  1. Java日志正确使用姿势

    前言 关于日志,在大家的印象中都是比较简单的,只须引入了相关依赖包,剩下的事情就是在项目中“尽情”的打印我们需要的信息了.但是往往越简单的东西越容易让我们忽视,从而导致一些不该有的bug发生,作为一名 ...

  2. 在MySQL中实现Rank高级排名函数【转】

    MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名 ...

  3. 【学习笔记Part 2● MySQL】

    数据库 为什么要用数据库 如何去存放数据?生活中有各种各样的数据.比如说人的姓名.年龄.成绩等.平时我们记录这些信息都是记在大脑中.人的记忆力有限,不可能什么都记住.所以后来人们把数据记录在石头上–& ...

  4. ArcGIS 网络分析[0] 介绍与博文目录【更新中】

    网络分析是个热点,理论上是属于计算机图形学和数据结构的,GIS以此为基础做出应用. 以下列举本人在学习中遇到的网络分析问题与经验总结. 1. 软件平台及数据准备 平台:Windows 10 操作系统, ...

  5. 一起学Android之Menu

    概述 菜单(Menu)在Android开发中,是一种常见的用户界面组件,通过使用菜单Api可以给用户提供常见的一致的体验.本文主要讲解三种菜单的相关内容. 菜单的分类 选项菜单(OptionsMenu ...

  6. DataPipeline联合Confluent Kafka Meetup上海站

    Confluent作为国际数据“流”处理技术领先者,提供实时数据处理解决方案,在市场上拥有大量企业客户,帮助企业轻松访问各类数据.DataPipeline作为国内首家原生支持Kafka解决方案的“iP ...

  7. JVM之GC算法、垃圾收集算法——标记-清除算法、复制算法、标记-整理算法、分代收集算法

    标记-清除算法 此垃圾收集算法分为“标记”和“清除”两个阶段: 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记对象,它的标记过程前面已经说过——如何判断对象是否存活/死去 死去的对象就会 ...

  8. 年末展望:Oracle 对 JDK收费和.NET Core 给我们的机遇

    2018年就结束了,马上就要迎来2019年,这一年很不平凡,中美贸易战还在继续,IT互联网发生急剧变化,大量互联网公司开始裁员,微软的市值在不断上升 ,在互联网公司的市值下跌过程中爬到了第一的位置,我 ...

  9. JNA 备注

    最近写JNA调用DLL的代码比较多.应该这样说,C的精华在于对指针的灵活运用,而用JNA调用C/C++最痛苦的也在于此.你不知道该用什么样的方式去对应C/C++的方法,特别是遇到指针.结构体指针.指针 ...

  10. AJAX快速上手和基本核心

    一.快速上手AJAX 使用ajax的过程可以类比平常我们访问网页过程 1.创建一个XMLHttpRequest类型的对象------相当于打开了浏览器 var xhr = new XMLHttpReq ...