Cesium绘制矩形
有个项目中,要求绘制多边形和矩形电子围栏。多边形的绘制很快做好了,但矩形花了一天多。官网的矩形示例是给定两个对角点坐标生成矩形,但这个不太对,它是水平垂直方向的。
我想要的效果是点击三次:
- 设置起点
- 设置方向
- 设置终点
一开始我想用修改官网示例来完成,通过矩形的旋转属性(rotation: Cesium.Math.toRadians(45)
)来完成,但旋转的中心点是矩形的中心点,无法设置起点为旋转中心。这样的效果会让甲方迷惑,行不通。
还得是用绘制多边形的方式,自动生成相邻点的坐标。
如上图所示,p0/p1/p2是依次点击的三个点位
生成点位C1
p1点不绘制,它是一个辅助点,用于确定c1点在这条延长线上。求取c1点的坐标,可以分为以下几个步骤:
1. 求取p0p2长度
借助turf.js
工具distance
计算两点的距离
import distance from "@turf/distance"
const length = distance(p0, p2, { units: 'miles' })
2. 求p1p0p2的夹角
rhumbBearing
求取两点与正北方向的夹角
import rhumbBearing from "@turf/rhumb-bearing"
const bearing1 = rhumbBearing(p0, p1)
const bearing2 = rhumbBearing(p0, p2)
const angle1 = bearing2 - bearing1
3. p0c1的长度
根据前面求得的角度和距离,将余弦与长度相乘
const len1 = Math.cos(angle1 / 180 * Math.PI) * length
4. c1点坐标
步骤2中已经求出p0p1点与正北方向的夹角bearing1,这里使用destination
求取目标点c1
const dest1 = destination(p0, len1, bearing1, { units: 'miles' })
看看绘制的效果:
肉眼可见是直角,接下来计算另一个点c2
生成点位C2
点位c2与c1原理相同,只是角度计算方式不同
1. 求p2p0c2角度
p1p0与p0c2垂直,所以
const angle2 = 90 - angle1
2. p0c2的长度
const len2 = Math.cos(angle2 / 180 * Math.PI) * length
3. c2点坐标
p0c1点与p0c2点差了90度,所以
const dest2 = destination(p0, len2, 90 + bearing1, { units: 'miles' })
看看最终效果:
总结
turf.js
是个好东西,我在项目中经常使用。前面的绘制一开始我是没用到turf
的,结果绘制出来的效果出乎意料,索性全部用turf中的工具进行了替换。
可能有些人会用到矩形绘制功能,这里把关键代码放在这里吧:
外部引入:
import { bearingToAzimuth, point } from "@turf/helpers"
import rhumbBearing from "@turf/rhumb-bearing"
import distance from "@turf/distance"
import destination from "@turf/destination"
绘制部分, points是数组,引用类型,所以只要在最开始调用一次就行了。
drawRectangle() {console.log('draw rectangle')this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas)const points = []let shape = this.renderRect(points)let step = 0this.handler.setInputAction(e => {let cartesian = viewer.scene.pickPosition(e.position);if (!Cesium.defined(cartesian)) {const ray = viewer.camera.getPickRay(e.position);cartesian = viewer.scene.globe.pick(ray, viewer.scene);}points[step] = cartesianstep++if (step === 3) {this.handler.destroy();}}, Cesium.ScreenSpaceEventType.LEFT_CLICK)this.handler.setInputAction(e => {let cartesian = viewer.scene.pickPosition(e.startPosition);if (!Cesium.defined(cartesian)) {const ray = viewer.camera.getPickRay(e.startPosition);cartesian = viewer.scene.globe.pick(ray, viewer.scene);}points[2] = cartesian}, Cesium.ScreenSpaceEventType.MOUSE_MOVE)
}renderRect(points) {const shape = this.viewer.entities.add({polygon: {hierarchy: new Cesium.CallbackProperty(() => {if (points[0] && points[1] && points[2]) {const r0 = Cesium.Cartographic.fromCartesian(points[0])const r1 = Cesium.Cartographic.fromCartesian(points[1]) // 辅助点const r2 = Cesium.Cartographic.fromCartesian(points[2])const p0 = point([r0.longitude * 180 / Math.PI, r0.latitude * 180 / Math.PI])const p1 = point([r1.longitude * 180 / Math.PI, r1.latitude * 180 / Math.PI])const p2 = point([r2.longitude * 180 / Math.PI, r2.latitude * 180 / Math.PI])const bearing1 = rhumbBearing(p0, p1)const bearing2 = rhumbBearing(p0, p2)const angle1 = bearing2 - bearing1// 对角长度const length = distance(p0, p2, { units: 'miles' })const len1 = Math.cos(angle1 / 180 * Math.PI) * lengthconst dest1 = destination(p0, len1, bearing1, { units: 'miles' })const angle2 = 90 - angle1const len2 = Math.cos(angle2 / 180 * Math.PI) * lengthconst dest2 = destination(p0, len2, 90 + bearing1, { units: 'miles' })const coordinates = [points[0], Cesium.Cartesian3.fromDegrees(...dest1.geometry.coordinates), points[2], Cesium.Cartesian3.fromDegrees(...dest2.geometry.coordinates)]return new Cesium.PolygonHierarchy(coordinates)}}, false)},})return shape
}
Cesium绘制矩形相关推荐
- Cesium中绘制矩形,根据四角/对角坐标绘制矩形
Cesium中绘制矩形,根据四角/对角坐标绘制矩形 import store from '@/store/index' import * as Cesium from 'cesium'export d ...
- cesium态势标绘 ( 绘制矩形)
cesium态势标绘 ( 绘制矩形)标绘与编辑 vue + cesium矩形标绘与编辑,采用es6模块化写法逻辑清晰,会有明显的标注说明,使代码容易读懂,理解和学习 1.新建DrawRectangle ...
- cad绘制椭圆的方法有几种_CAD新手入门教学:如何绘制矩形?
各位热爱CAD的知友们,图图开了一个[电脑版的CAD教程]合辑,以后每周五给大家分享CAD教程啦,记得一定要来看呀!(仅为新手教学,大佬看见可直接说出更简易操作) 其实绘制矩形在CAD中来说,真的是一 ...
- python PyQt5如何绘制矩形框?(画框/绘框)
参考代码: from PyQt5.QtWidgets import QWidget, QApplication, QLabel from PyQt5.QtCore import QRect, Qt f ...
- opencv进阶学习笔记6:使用鼠标在图像上绘制矩形框或者多边形框
基础版笔记传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录: python+opencv进阶版学习笔记目录(适合有一定基础) 感兴趣区域传统绘制: openc ...
- canvas基础-绘制矩形(1)
1.canvas基础知识 canvas元素是HTML5中新增的一个重要的元素,专门用来绘制图形,不过canvas本身不具备画图的能力,在页面中放置了canvas元素,就相当于在页面中放置了一块矩形的& ...
- VB API 之 第十一课 绘制矩形
先来介绍几个画矩形的函数: DrawFocusRect():画一个焦点矩形: Rectangle():用当前选定的画笔描绘矩形,并用当前选定的画刷填充: DrawEdge():用指定的样式描绘一个矩形 ...
- 矩形做成翻页的效果html5,HTML5 在canvas中绘制矩形附效果图
一.绘制矩形 canvas使用原点(0,0)在左上角的坐标系统,x坐标向右递增,y坐标向下递增. 使用绘图环境的矩形绘制函数来绘制矩形. fillRect(x,y,width,height) : 绘制 ...
- Html5画布(canvas)实例之绘制矩形
路径方式绘制 - 矩形 | rect() canvas/shape/path/rect.html <!DOCTYPE HTML><html><head> <t ...
最新文章
- 推荐:偷懒利器 EmEditor
- 纽约大学计算机工程专业课程,纽约大学计算机工程硕士专业介绍及课程要求
- ThinkPHP5.0中Request请求对象的使用和常用的操作
- golang 定义一个空切片_Golang切片 一个隐讳的坑
- [最小生成树] 继续畅通工程
- android ram压力测试,android用memtester内存压力测试
- MySQL - 实战 棋牌游戏数据库开发
- win10卸载office2016提示:安装程序包的语言不受系统支持
- 正则表达式中的前瞻,后顾,负前瞻,负后顾
- 设计模式(21)备忘录模式
- 案例总结:京东图书信息爬取
- IC EMC(集成电路电磁兼容)测试标准介绍
- “好奇号”现在距离地球有多远?
- 一个好的创意值多少钱?
- Ubuntu VNC 如何调整分辨率
- 路径java起床战争_我的世界起床战争地图制作教程
- 巨头王炸不断,硬核解读芯片技术路线
- Linux脚本编程:sudo命令下设置定时任务
- Unity【DoTween】- 如何使Transform Tween动画序列可编辑
- 【CSS.DIV】HTMLli标签