EntityEdit.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672
  1. import * as turf from "@turf/turf"
  2. export default class EntityEdit {
  3. constructor(viewer) {
  4. this.viewer = viewer;
  5. this.DrawExample = '';
  6. this.midVertexEntities = [];
  7. this.initEventHandler();
  8. }
  9. //鼠标事件
  10. initEventHandler() {
  11. this.eventHandler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
  12. this.EditEndEvent = new Cesium.Event();
  13. this.EditEndEntity = new Cesium.Event();
  14. }
  15. //激活编辑
  16. activate() {
  17. this.deactivate();
  18. //鼠标左键点击事件 鼠标左键点击拾取需要编辑的对象
  19. this.initLeftClickEventHandler();
  20. }
  21. //禁用编辑
  22. deactivate() {
  23. this.DrawExample = '';
  24. this.eventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
  25. this.unRegisterEvents();
  26. this.clearAllEditVertex();
  27. }
  28. //清空编辑节点
  29. clearAllEditVertex() {
  30. this.clearEditVertex();
  31. this.clearMidVertex();
  32. }
  33. //左键点击事件
  34. initLeftClickEventHandler() {
  35. this.eventHandler.setInputAction(e => {
  36. let id = this.viewer.scene.pick(e.position);
  37. if (!id || !id.id) {
  38. this.handleEditEntity();
  39. return; // 没有拾取到对象 直接返回 不做任何操作
  40. }
  41. // 拾取到对象 判断拾取到的对象类型
  42. if (!id.id || !id.id.Type) return;
  43. //重复点击同一个对象
  44. if (this.editEntity && this.editEntity.id == id.id.id) return;
  45. // if (this.editEntity) return
  46. //拾取到新的GeoPlot对象
  47. this.handleEditEntity(); //处理上一个编辑对象
  48. this.handlePickEditEntity(id.id);
  49. }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
  50. }
  51. //处理编辑对象
  52. handleEditEntity() {
  53. this.unRegisterEvents();
  54. this.clearAllEditVertex();
  55. let editEntity = this.editEntity;
  56. if (!editEntity) return;
  57. this.closeEntityEditMode();
  58. this.editEntity = undefined;
  59. if (!this.isEdited) return; //没有任何编辑 直接返回
  60. // console.log("对象被编辑过是否需要保存操作??");
  61. //触发编辑事件
  62. this.EditEndEvent.raiseEvent(editEntity);
  63. this.isEdited = false;
  64. this.isEditing = false;
  65. }
  66. //处理拾取到的对象
  67. handlePickEditEntity(pickId) {
  68. const EditableTypes = ["DrawAttackArrow", "DrawCircle", "DrawCurve", 'DrawPincerArrow', 'DrawPoint', 'DrawPolygon', 'DrawPolyline', 'DrawRectangle', 'DrawStraightArrow', 'DrawGatheringPlace', 'DrawSector', 'DrawClosedCurve', 'DrawBowLine', 'DrawBowPlane', 'DrawRectFlag', 'DrawTriangleFlag', 'DrawCurveFlag'];
  69. if (EditableTypes.indexOf(pickId.Type) == -1) return;
  70. this.editEntity = pickId;
  71. this.EditEndEntity.raiseEvent(this.editEntity);
  72. this.isEditing = false;
  73. this.isEdited = false;
  74. this.editPositions = this.getEditEntityPositions();
  75. this.EditMoveCenterPositoin = this.getCenterPosition();
  76. this.openEntityEditModel();
  77. this.clearAllEditVertex();
  78. this.unRegisterEvents();
  79. this.createEditVertex();
  80. this.createMidVertex();
  81. this.registerEvents();
  82. }
  83. openEntityEditModel() {
  84. if (this.DrawExample == '') return
  85. switch (this.editEntity.Type) {
  86. case "DrawStraightArrow":
  87. this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
  88. return this.DrawExample.computePosition(this.editPositions);
  89. }, false);
  90. break;
  91. case "DrawAttackArrow":
  92. this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
  93. return this.DrawExample.computePosition(this.editPositions);
  94. }, false);
  95. break;
  96. case "DrawPincerArrow":
  97. this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
  98. return this.DrawExample.computePosition(this.editPositions);
  99. }, false);
  100. break;
  101. case "DrawGatheringPlace":
  102. this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
  103. return this.DrawExample.computePosition(this.editPositions);
  104. }, false);
  105. break;
  106. case "DrawClosedCurve":
  107. this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
  108. return this.DrawExample.computePosition(this.editPositions).PolygonHierarchy;
  109. }, false);
  110. this.editEntity.polyline.positions = new Cesium.CallbackProperty(e => {
  111. return this.DrawExample.computePosition(this.editPositions).pList;
  112. }, false);
  113. break;
  114. case "DrawCircle":
  115. this.editEntity.position = new Cesium.CallbackProperty(e => {
  116. return this.DrawExample.computePosition(this.editPositions).position
  117. }, false)
  118. this.editEntity.ellipse.semiMinorAxis = new Cesium.CallbackProperty(e => {
  119. return this.DrawExample.computePosition(this.editPositions).r
  120. }, false);
  121. this.editEntity.ellipse.semiMajorAxis = new Cesium.CallbackProperty(e => {
  122. return this.DrawExample.computePosition(this.editPositions).r
  123. }, false);
  124. break;
  125. case "DrawCurve":
  126. this.editEntity.polyline.positions = new Cesium.CallbackProperty(e => {
  127. return this.DrawExample.computePosition(this.editPositions);
  128. }, false);
  129. break;
  130. case "DrawPoint":
  131. this.editEntity.position = new Cesium.CallbackProperty(e => {
  132. return this.editPositions[0];
  133. }, false);
  134. break;
  135. case "DrawPolygon":
  136. this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
  137. return this.DrawExample.computePosition(this.editPositions);
  138. }, false);
  139. break;
  140. case "DrawPolyline":
  141. this.editEntity.polyline.positions = new Cesium.CallbackProperty(e => {
  142. return this.DrawExample.computePosition(this.editPositions);
  143. }, false);
  144. break;
  145. case "DrawRectangle":
  146. this.editEntity.rectangle.coordinates = new Cesium.CallbackProperty(e => {
  147. return this.DrawExample.computePosition(this.editPositions);
  148. }, false);
  149. break;
  150. case "DrawSector":
  151. this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
  152. return this.DrawExample.computePosition(this.editPositions);
  153. }, false);
  154. break;
  155. case "DrawBowLine":
  156. this.editEntity.polyline.positions = new Cesium.CallbackProperty(e => {
  157. return this.DrawExample.computePosition(this.editPositions);
  158. }, false);
  159. break;
  160. case "DrawBowPlane":
  161. this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
  162. return this.DrawExample.computePosition(this.editPositions);
  163. }, false);
  164. break;
  165. case "DrawRectFlag":
  166. this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
  167. return this.DrawExample.computePosition(this.editPositions)[0]
  168. }, false);
  169. this.editEntity.polyline.positions = new Cesium.CallbackProperty(e => {
  170. return this.DrawExample.computePosition(this.editPositions)[1];
  171. }, false);
  172. break;
  173. case "DrawTriangleFlag":
  174. this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
  175. return this.DrawExample.computePosition(this.editPositions)[0]
  176. }, false);
  177. this.editEntity.polyline.positions = new Cesium.CallbackProperty(e => {
  178. return this.DrawExample.computePosition(this.editPositions)[1];
  179. }, false);
  180. break;
  181. case "DrawCurveFlag":
  182. this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
  183. return this.DrawExample.computePosition(this.editPositions)[0]
  184. }, false);
  185. this.editEntity.polyline.positions = new Cesium.CallbackProperty(e => {
  186. return this.DrawExample.computePosition(this.editPositions)[1];
  187. }, false);
  188. break;
  189. }
  190. }
  191. closeEntityEditMode() {
  192. if (this.DrawExample == '') return
  193. let position = '';
  194. switch (this.editEntity.Type) {
  195. case "DrawStraightArrow":
  196. position = this.DrawExample.computePosition(this.editPositions);
  197. this.editEntity.polygon.hierarchy = position;
  198. this.editEntity.Position = this.DrawExample.getData();
  199. break;
  200. case "DrawAttackArrow":
  201. position = this.DrawExample.computePosition(this.editPositions);
  202. this.editEntity.polygon.hierarchy = position;
  203. this.editEntity.Position = this.DrawExample.getData();
  204. break;
  205. case "DrawPincerArrow":
  206. position = this.DrawExample.computePosition(this.editPositions);
  207. this.editEntity.polygon.hierarchy = position;
  208. this.editEntity.Position = this.DrawExample.getData();
  209. break;
  210. case "DrawGatheringPlace":
  211. position = this.DrawExample.computePosition(this.editPositions);
  212. this.editEntity.polygon.hierarchy = position;
  213. this.editEntity.Position = this.DrawExample.getData();
  214. break;
  215. case "DrawClosedCurve":
  216. position = this.DrawExample.computePosition(this.editPositions);
  217. this.editEntity.polygon.hierarchy = position.PolygonHierarchy;
  218. this.editEntity.polyline.positions = position.pList;
  219. this.editEntity.Position = this.DrawExample.getData();
  220. break;
  221. case "DrawCircle":
  222. position = this.DrawExample.computePosition(this.editPositions);
  223. this.editEntity.position = position.position
  224. this.editEntity.ellipse.semiMinorAxis = position.r;
  225. this.editEntity.ellipse.semiMajorAxis = position.r;
  226. this.editEntity.Position = this.DrawExample.getData();
  227. break;
  228. case "DrawCurve":
  229. position = this.DrawExample.computePosition(this.editPositions);
  230. this.editEntity.polyline.positions = position;
  231. this.editEntity.Position = this.DrawExample.getData();
  232. break;
  233. case "DrawPoint":
  234. position = this.DrawExample.computePosition(this.editPositions);
  235. this.editEntity.position = position;
  236. this.editEntity.Position = this.DrawExample.getData();
  237. break;
  238. case "DrawPolygon":
  239. position = this.DrawExample.computePosition(this.editPositions);
  240. this.editEntity.polygon.hierarchy = position;
  241. this.editEntity.Position = this.DrawExample.getData();
  242. break;
  243. case "DrawPolyline":
  244. position = this.DrawExample.computePosition(this.editPositions);
  245. this.editEntity.polyline.positions = position;
  246. this.editEntity.Position = this.DrawExample.getData();
  247. break;
  248. case "DrawRectangle":
  249. position = this.DrawExample.computePosition(this.editPositions);
  250. this.editEntity.rectangle.coordinates = position;
  251. this.editEntity.Position = this.DrawExample.getData();
  252. break;
  253. case "DrawSector":
  254. position = this.DrawExample.computePosition(this.editPositions);
  255. this.editEntity.polygon.hierarchy = position;
  256. this.editEntity.Position = this.DrawExample.getData();
  257. break;
  258. case "DrawBowLine":
  259. position = this.DrawExample.computePosition(this.editPositions);
  260. this.editEntity.polyline.positions = position;
  261. this.editEntity.Position = this.DrawExample.getData();
  262. break;
  263. case "DrawBowPlane":
  264. position = this.DrawExample.computePosition(this.editPositions);
  265. this.editEntity.polygon.hierarchy = position;
  266. this.editEntity.Position = this.DrawExample.getData();
  267. break;
  268. case "DrawRectFlag":
  269. position = this.DrawExample.computePosition(this.editPositions);
  270. this.editEntity.polygon.hierarchy = position[0];
  271. this.editEntity.polyline.positions = position[1];
  272. this.editEntity.Position = this.DrawExample.getData();
  273. break;
  274. case "DrawTriangleFlag":
  275. position = this.DrawExample.computePosition(this.editPositions);
  276. this.editEntity.polygon.hierarchy = position[0];
  277. this.editEntity.polyline.positions = position[1];
  278. this.editEntity.Position = this.DrawExample.getData();
  279. break;
  280. case "DrawCurveFlag":
  281. position = this.DrawExample.computePosition(this.editPositions);
  282. this.editEntity.polygon.hierarchy = position[0];
  283. this.editEntity.polyline.positions = position[1];
  284. this.editEntity.Position = this.DrawExample.getData();
  285. break;
  286. }
  287. }
  288. getEditEntityPositions() {
  289. let position = this.editEntity.Position;
  290. let positionArr = [];
  291. switch (this.editEntity.Type) {
  292. case "DrawAttackArrow":
  293. for (let i = 0; i < position.length; i++) {
  294. positionArr.push(this.LatlngTocartesian(position[i]))
  295. }
  296. return positionArr;
  297. case "DrawCircle":
  298. for (let i = 0; i < position.length; i++) {
  299. positionArr.push(this.LatlngTocartesian(position[i]))
  300. }
  301. return positionArr;
  302. case "DrawCurve":
  303. for (let i = 0; i < position.length; i++) {
  304. positionArr.push(this.LatlngTocartesian(position[i]))
  305. }
  306. return positionArr;
  307. case "DrawPincerArrow":
  308. for (let i = 0; i < position.length; i++) {
  309. positionArr.push(this.LatlngTocartesian(position[i]))
  310. }
  311. return positionArr;
  312. case "DrawPoint":
  313. for (let i = 0; i < position.length; i++) {
  314. positionArr.push(this.LatlngTocartesian(position[i]))
  315. }
  316. return positionArr;
  317. case "DrawPolygon":
  318. for (let i = 0; i < position.length; i++) {
  319. positionArr.push(this.LatlngTocartesian(position[i]))
  320. }
  321. return positionArr;
  322. case "DrawPolyline":
  323. for (let i = 0; i < position.length; i++) {
  324. positionArr.push(this.LatlngTocartesian(position[i]))
  325. }
  326. return positionArr;
  327. case "DrawRectangle":
  328. for (let i = 0; i < position.length; i++) {
  329. positionArr.push(this.LatlngTocartesian(position[i]))
  330. }
  331. return positionArr;
  332. case "DrawStraightArrow":
  333. for (let i = 0; i < position.length; i++) {
  334. positionArr.push(this.LatlngTocartesian(position[i]))
  335. }
  336. return positionArr;
  337. case "DrawGatheringPlace":
  338. for (let i = 0; i < position.length; i++) {
  339. positionArr.push(this.LatlngTocartesian(position[i]))
  340. }
  341. return positionArr;
  342. case "DrawSector":
  343. for (let i = 0; i < position.length; i++) {
  344. positionArr.push(this.LatlngTocartesian(position[i]))
  345. }
  346. return positionArr;
  347. case "DrawClosedCurve":
  348. for (let i = 0; i < position.length; i++) {
  349. positionArr.push(this.LatlngTocartesian(position[i]))
  350. }
  351. return positionArr;
  352. case "DrawBowLine":
  353. for (let i = 0; i < position.length; i++) {
  354. positionArr.push(this.LatlngTocartesian(position[i]))
  355. }
  356. return positionArr;
  357. case "DrawBowPlane":
  358. for (let i = 0; i < position.length; i++) {
  359. positionArr.push(this.LatlngTocartesian(position[i]))
  360. }
  361. return positionArr;
  362. case "DrawRectFlag":
  363. for (let i = 0; i < position.length; i++) {
  364. positionArr.push(this.LatlngTocartesian(position[i]))
  365. }
  366. return positionArr;
  367. case "DrawTriangleFlag":
  368. for (let i = 0; i < position.length; i++) {
  369. positionArr.push(this.LatlngTocartesian(position[i]))
  370. }
  371. return positionArr;
  372. case "DrawCurveFlag":
  373. for (let i = 0; i < position.length; i++) {
  374. positionArr.push(this.LatlngTocartesian(position[i]))
  375. }
  376. return positionArr;
  377. }
  378. }
  379. //注册事件监听
  380. registerEvents() {
  381. //鼠标左键按下事件 当有对象被选中时 如果拾取到编辑辅助要素 表示开始改变对象的位置
  382. this.initLeftDownEventHandler();
  383. //鼠标移动事件 鼠标移动 如果有编辑对象 表示改变编辑对象的位置
  384. this.initMouseMoveEventHandler();
  385. //鼠标左键抬起事件 当有编辑对象时
  386. this.initLeftUpEventHandler();
  387. }
  388. //取消事件监听
  389. unRegisterEvents() {
  390. this.eventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN);
  391. this.eventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP);
  392. this.eventHandler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
  393. }
  394. //场景鼠标左键按下事件
  395. initLeftDownEventHandler() {
  396. this.eventHandler.setInputAction((e) => {
  397. let id = this.viewer.scene.pick(e.position);
  398. // 拾取到对象 判断拾取到的对象类型
  399. if (!id || !id.id || !id.id.type) return;
  400. //拾取到具有type 属性的entity对象
  401. if (id.id.type == "EditVertex" || id.id.type == "EditMove") {
  402. this.isEditing = true;
  403. //禁用场景的旋转移动功能 保留缩放功能
  404. this.viewer.scene.screenSpaceCameraController.enableRotate = false;
  405. //改变鼠标状态
  406. this.viewer.enableCursorStyle = false;
  407. this.viewer._element.style.cursor = '';
  408. document.body.style.cursor = "move";
  409. this.editVertext = id.id;
  410. this.editVertext.show = false;
  411. this.clearMidVertex();
  412. } else if (id.id.type == "EditMidVertex") {
  413. this.editPositions.splice(id.id.vertexIndex, 0, id.id.position._value);
  414. this.clearAllEditVertex();
  415. this.createEditVertex();
  416. this.createMidVertex();
  417. this.isEdited = true;
  418. } else {
  419. return
  420. }
  421. }, Cesium.ScreenSpaceEventType.LEFT_DOWN);
  422. }
  423. //场景鼠标左键抬起事件
  424. initLeftUpEventHandler() {
  425. this.eventHandler.setInputAction(((e) => {
  426. if (!this.isEditing) return;
  427. this.viewer.enableCursorStyle = true;
  428. document.body.style.cursor = "default";
  429. this.viewer.scene.screenSpaceCameraController.enableRotate = true;
  430. this.editVertext.show = true;
  431. this.isEditing = false;
  432. this.clearMidVertex();
  433. this.createMidVertex();
  434. }), Cesium.ScreenSpaceEventType.LEFT_UP);
  435. }
  436. //场景鼠标移动事件
  437. initMouseMoveEventHandler() {
  438. this.eventHandler.setInputAction(((e) => {
  439. var position = e.endPosition;
  440. var ray = this.viewer.scene.camera.getPickRay(position);
  441. var cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
  442. if (!cartesian) return;
  443. if (!this.isEditing) return;
  444. if (this.editVertext.type == "EditMove") {
  445. let startPosition = this.EditMoveCenterPositoin;
  446. if (!startPosition) return;
  447. this.moveEntityByOffset(startPosition, cartesian);
  448. } else if (this.editVertext.type == "EditVertex" || this.editVertext.type == "EditMidVertex") {
  449. this.editPositions[this.editVertext.vertexIndex] = cartesian;
  450. }
  451. this.isEdited = true;
  452. this.EditMoveCenterPositoin = this.getCenterPosition();
  453. }), Cesium.ScreenSpaceEventType.MOUSE_MOVE);
  454. }
  455. //获取编辑对象中心点
  456. getCenterPosition() {
  457. let points = [];
  458. let maxHeight = 0;
  459. //如果是点 返回第一个点作为移动点
  460. if (this.editEntity.Type == "DrawCircle" || this.editEntity.Type == "DrawPoint" || this.editEntity.Type == "DrawSector") {
  461. return this.editPositions[0];
  462. }
  463. //获取所有节点的最高位置
  464. this.editPositions.forEach(position => {
  465. const point3d = this.cartesian3ToPoint3D(position);
  466. points.push([point3d.x, point3d.y]);
  467. if (maxHeight < point3d.z) maxHeight = point3d.z;
  468. })
  469. //构建turf.js lineString
  470. let geo = turf.lineString(points);
  471. let bbox = turf.bbox(geo);
  472. let bboxPolygon = turf.bboxPolygon(bbox);
  473. let pointOnFeature = turf.center(bboxPolygon);
  474. let lonLat = pointOnFeature.geometry.coordinates;
  475. return Cesium.Cartesian3.fromDegrees(lonLat[0], lonLat[1], maxHeight);
  476. }
  477. //根据偏移量移动实体
  478. moveEntityByOffset(startPosition, endPosition) {
  479. let startPoint3d = this.cartesian3ToPoint3D(startPosition);
  480. let endPoint3d = this.cartesian3ToPoint3D(endPosition);
  481. let offsetX = endPoint3d.x - startPoint3d.x;
  482. let offsetY = endPoint3d.y - startPoint3d.y;
  483. //设置偏移量
  484. let element;
  485. for (let i = 0; i < this.editPositions.length; i++) {
  486. element = this.cartesian3ToPoint3D(this.editPositions[i]);
  487. element.x += offsetX;
  488. element.y += offsetY;
  489. this.editPositions[i] = Cesium.Cartesian3.fromDegrees(element.x, element.y, element.z)
  490. }
  491. }
  492. //创建编辑节点
  493. createEditVertex() {
  494. this.vertexEntities = [];
  495. this.editPositions.forEach((p, index) => {
  496. const entity = this.viewer.entities.add({
  497. position: new Cesium.CallbackProperty(e => {
  498. return this.editPositions[index];
  499. }, false),
  500. type: "EditVertex",
  501. vertexIndex: index, //节点索引
  502. point: {
  503. show: true,
  504. pixelSize: 10,
  505. color: new Cesium.Color(0, 0, 1, 1),
  506. outlineWidth: 1,
  507. outlineColor: new Cesium.Color(1, 1, 1, 1),
  508. disableDepthTestDistance: 1.5e12, //小于该数值后关闭深度检测默认为空
  509. heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
  510. },
  511. })
  512. this.vertexEntities.push(entity);
  513. });
  514. // 如果是圆则隐藏中心点
  515. if (this.editEntity.Type == 'DrawCircle') {
  516. this.vertexEntities[0].show = false
  517. }
  518. if (this.editPositions.length == 1) { //只有一个节点表示点类型 不需要创建整体移动节点
  519. return;
  520. }
  521. this.createEditMoveCenterEntity();
  522. }
  523. //整体移动
  524. createEditMoveCenterEntity() {
  525. this.EditMoveCenterEntity = this.viewer.entities.add({
  526. position: new Cesium.CallbackProperty(e => {
  527. return this.EditMoveCenterPositoin;
  528. }, false),
  529. type: "EditMove",
  530. point: {
  531. show: true,
  532. pixelSize: 12,
  533. color: new Cesium.Color(0, 1, 0, 0.1),
  534. outlineWidth: 2,
  535. outlineColor: new Cesium.Color(1, 1, 1, 1),
  536. disableDepthTestDistance: 1.5e12, //小于该数值后关闭深度检测默认为空
  537. heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
  538. },
  539. })
  540. }
  541. //清空编辑节点
  542. clearEditVertex() {
  543. if (this.vertexEntities) {
  544. this.vertexEntities.forEach(item => {
  545. this.viewer.entities.remove(item);
  546. })
  547. }
  548. this.vertexEntities = [];
  549. this.viewer.entities.remove(this.EditMoveCenterEntity);
  550. }
  551. //创建中点节点
  552. createMidVertex() {
  553. if (this.editEntity.Type == 'DrawCircle' || this.editEntity.Type == 'DrawPincerArrow' || this.editEntity.Type == 'DrawRectangle' || this.editEntity.Type == 'DrawStraightArrow' || this.editEntity.Type == 'DrawGatheringPlace' || this.editEntity.Type == "DrawSector" || this.editEntity.Type == "DrawBowLine" || this.editEntity.Type == "DrawBowPlane" || this.editEntity.Type == "DrawRectFlag" || this.editEntity.Type == "DrawTriangleFlag" || this.editEntity.Type == "DrawCurveFlag") {
  554. return
  555. }
  556. this.midVertexEntities = [];
  557. for (let i = 0; i < this.editPositions.length; i++) {
  558. const p1 = this.editPositions[i];
  559. const p2 = this.editPositions[i + 1];
  560. let mideP = this.midPosition(p1, p2);
  561. const entity = this.viewer.entities.add({
  562. position: mideP,
  563. type: "EditMidVertex",
  564. vertexIndex: i + 1, //节点索引
  565. point: {
  566. show: true,
  567. pixelSize: 10,
  568. color: new Cesium.Color(0, 1, 0, 1),
  569. outlineWidth: 1,
  570. outlineColor: new Cesium.Color(1, 1, 1, 1),
  571. disableDepthTestDistance: 1.5e12, //小于该数值后关闭深度检测默认为空
  572. heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
  573. },
  574. })
  575. this.midVertexEntities.push(entity);
  576. }
  577. }
  578. //清空中点节点
  579. clearMidVertex() {
  580. if (this.midVertexEntities) {
  581. this.midVertexEntities.forEach(item => {
  582. this.viewer.entities.remove(item);
  583. })
  584. }
  585. this.midVertexEntities = [];
  586. }
  587. //笛卡尔坐标转为经纬度xyz
  588. cartesian3ToPoint3D(position) {
  589. const cartographic = Cesium.Cartographic.fromCartesian(position);
  590. const lon = Cesium.Math.toDegrees(cartographic.longitude);
  591. const lat = Cesium.Math.toDegrees(cartographic.latitude);
  592. return {
  593. x: lon,
  594. y: lat,
  595. z: cartographic.height
  596. };
  597. }
  598. //获取两个节点的中心点
  599. midPosition(first, second) {
  600. if (!first || !second) return null;
  601. let point3d1 = this.cartesian3ToPoint3D(first);
  602. let point3d2 = this.cartesian3ToPoint3D(second);
  603. let midLonLat = {
  604. x: (point3d1.x + point3d2.x) / 2,
  605. y: (point3d1.y + point3d2.y) / 2,
  606. z: (point3d1.z + point3d2.z) / 2
  607. }
  608. return Cesium.Cartesian3.fromDegrees(midLonLat.x, midLonLat.y, midLonLat.z);
  609. }
  610. cartesianToLatlng(cartesian) {
  611. let cartographic = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
  612. let lat = new Cesium.Math.toDegrees(cartographic.latitude);
  613. let lng = new Cesium.Math.toDegrees(cartographic.longitude);
  614. let alt = cartographic.height;
  615. return [lng, lat];
  616. }
  617. LatlngTocartesian(latlng) {
  618. let cartesian3 = new Cesium.Cartesian3.fromDegrees(latlng[0], latlng[1]);
  619. return cartesian3
  620. }
  621. }