有个项目中,要求绘制多边形和矩形电子围栏。多边形的绘制很快做好了,但矩形花了一天多。官网的矩形示例是给定两个对角点坐标生成矩形,但这个不太对,它是水平垂直方向的。

我想要的效果是点击三次:

  1. 设置起点
  2. 设置方向
  3. 设置终点

一开始我想用修改官网示例来完成,通过矩形的旋转属性(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绘制矩形相关推荐

  1. Cesium中绘制矩形,根据四角/对角坐标绘制矩形

    Cesium中绘制矩形,根据四角/对角坐标绘制矩形 import store from '@/store/index' import * as Cesium from 'cesium'export d ...

  2. cesium态势标绘 ( 绘制矩形)

    cesium态势标绘 ( 绘制矩形)标绘与编辑 vue + cesium矩形标绘与编辑,采用es6模块化写法逻辑清晰,会有明显的标注说明,使代码容易读懂,理解和学习 1.新建DrawRectangle ...

  3. cad绘制椭圆的方法有几种_CAD新手入门教学:如何绘制矩形?

    各位热爱CAD的知友们,图图开了一个[电脑版的CAD教程]合辑,以后每周五给大家分享CAD教程啦,记得一定要来看呀!(仅为新手教学,大佬看见可直接说出更简易操作) 其实绘制矩形在CAD中来说,真的是一 ...

  4. python PyQt5如何绘制矩形框?(画框/绘框)

    参考代码: from PyQt5.QtWidgets import QWidget, QApplication, QLabel from PyQt5.QtCore import QRect, Qt f ...

  5. opencv进阶学习笔记6:使用鼠标在图像上绘制矩形框或者多边形框

    基础版笔记传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录: python+opencv进阶版学习笔记目录(适合有一定基础) 感兴趣区域传统绘制: openc ...

  6. canvas基础-绘制矩形(1)

    1.canvas基础知识 canvas元素是HTML5中新增的一个重要的元素,专门用来绘制图形,不过canvas本身不具备画图的能力,在页面中放置了canvas元素,就相当于在页面中放置了一块矩形的& ...

  7. VB API 之 第十一课 绘制矩形

    先来介绍几个画矩形的函数: DrawFocusRect():画一个焦点矩形: Rectangle():用当前选定的画笔描绘矩形,并用当前选定的画刷填充: DrawEdge():用指定的样式描绘一个矩形 ...

  8. 矩形做成翻页的效果html5,HTML5 在canvas中绘制矩形附效果图

    一.绘制矩形 canvas使用原点(0,0)在左上角的坐标系统,x坐标向右递增,y坐标向下递增. 使用绘图环境的矩形绘制函数来绘制矩形. fillRect(x,y,width,height) : 绘制 ...

  9. Html5画布(canvas)实例之绘制矩形

    路径方式绘制 - 矩形 | rect() canvas/shape/path/rect.html <!DOCTYPE HTML><html><head> <t ...

最新文章

  1. 推荐:偷懒利器 EmEditor
  2. 纽约大学计算机工程专业课程,纽约大学计算机工程硕士专业介绍及课程要求
  3. ThinkPHP5.0中Request请求对象的使用和常用的操作
  4. golang 定义一个空切片_Golang切片 一个隐讳的坑
  5. [最小生成树] 继续畅通工程
  6. android ram压力测试,android用memtester内存压力测试
  7. MySQL - 实战 棋牌游戏数据库开发
  8. win10卸载office2016提示:安装程序包的语言不受系统支持
  9. 正则表达式中的前瞻,后顾,负前瞻,负后顾
  10. 设计模式(21)备忘录模式
  11. 案例总结:京东图书信息爬取
  12. IC EMC(集成电路电磁兼容)测试标准介绍
  13. “好奇号”现在距离地球有多远?
  14. 一个好的创意值多少钱?
  15. Ubuntu VNC 如何调整分辨率
  16. 路径java起床战争_我的世界起床战争地图制作教程
  17. 巨头王炸不断,硬核解读芯片技术路线
  18. Linux脚本编程:sudo命令下设置定时任务
  19. Unity【DoTween】- 如何使Transform Tween动画序列可编辑
  20. 【CSS.DIV】HTMLli标签

热门文章

  1. 伦敦银价格单位的大小
  2. 赤兔oracle恢复软件 收费,赤兔Oracle恢复软件
  3. Meta Path Based Random Walk复现思路【基于元路径的随机游走模型】
  4. Java 连接Access数据库
  5. 分布式session的4种解决方案
  6. 基于SM3的HMAC算法的实现
  7. 论文投稿指南——中文核心期刊推荐(中国医学 2)
  8. JavaScript对象——数学对象
  9. 沉降观测曲线图 沉降观测汇总_沉降观测曲线图绘制的方法与有效性分析
  10. Linux 能 ping 通,但是 ssh 登陆不上