DrawCircle.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. // 四、圆
  2. /*
  3. 绘制圆
  4. */
  5. class DrawCircle {
  6. constructor(arg) {
  7. this.viewer = arg.viewer;
  8. this.Cesium = arg.Cesium;
  9. this._cicle = null; //活动圆
  10. this.floatingPoint = null;
  11. this._cicleLast = null; //最后一个圆
  12. this._positions = []; //活动点
  13. this._entities_point = []; //脏数据
  14. this._entities_cicle = []; //脏数据
  15. this._cicleData = null; //用于构造圆形数据
  16. this.DrawStartEvent = new Cesium.Event(); //开始绘制事件
  17. this.DrawEndEvent = new Cesium.Event(); //结束绘制事件
  18. /* 通用参数集合 */
  19. this._param = {
  20. id: "DrawStraightArrow",
  21. polygonColor: 'rgba(0,255,0,0.5)', //面填充颜色
  22. outlineColor: 'rgba(255, 255, 255, 1)', //边框颜色
  23. outlineWidth: 1, //边框宽度
  24. }
  25. /* 创建面材质 */
  26. this.polygonMaterial = Cesium.Color.fromCssColorString(this._param.polygonColor);
  27. /* 创建线材质 */
  28. // this.outlineMaterial = new Cesium.PolylineDashMaterialProperty({//曲线
  29. // dashLength: 16,
  30. // color: Cesium.Color.fromCssColorString(this._param.outlineColor)
  31. // });
  32. this.outlineMaterial = Cesium.Color.fromCssColorString(this._param.outlineColor);
  33. }
  34. get cicle() {
  35. return this._cicleLast;
  36. }
  37. //加载圆
  38. addload(data) {
  39. var that = this;
  40. let lnglatArr = [];
  41. for (var i = 0; i < data.length; i++) {
  42. var lnglat = that.LatlngTocartesian(data[i]);
  43. lnglatArr.push(lnglat)
  44. }
  45. var value = lnglatArr;
  46. var r = Math.sqrt(
  47. Math.pow(value[0].x - value[value.length - 1].x, 2) +
  48. Math.pow(value[0].y - value[value.length - 1].y, 2)
  49. );
  50. var position = value[0];
  51. var shape = that.viewer.entities.add({
  52. Type:'DrawCircle',
  53. Position:[data[0],data[data.length - 1]],
  54. position: position,
  55. id:data.id || that.objId,
  56. ellipse: {
  57. semiMinorAxis: r,
  58. semiMajorAxis: r,
  59. material: that.Cesium.Color.RED.withAlpha(0.9),
  60. // outline: true,
  61. show: true,
  62. clampToGround: true,
  63. }
  64. });
  65. return shape;
  66. }
  67. //返回数据
  68. getData() {
  69. return this._cicleData;
  70. }
  71. // 修改编辑调用计算
  72. computePosition(data){
  73. var that = this;
  74. let lnglatArr = [];
  75. for (var i = 0; i < data.length; i++) {
  76. var lnglat = that.cartesianToLatlng(data[i]);
  77. lnglatArr.push(lnglat)
  78. }
  79. that._cicleData = lnglatArr;
  80. var value = data;
  81. var r = Math.sqrt(
  82. Math.pow(value[0].x - value[value.length - 1].x, 2) +
  83. Math.pow(value[0].y - value[value.length - 1].y, 2)
  84. );
  85. var position = value[0];
  86. return {position,r}
  87. }
  88. startCreate(drawType) {
  89. this.drawType = drawType
  90. this.handler = new this.Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
  91. this.viewer.scene.globe.depthTestAgainstTerrain = true;
  92. var $this = this;
  93. this.handler.setInputAction(function (evt) { //单机开始绘制
  94. $this.viewer.scene.globe.depthTestAgainstTerrain = true;
  95. //屏幕坐标转地形上坐标
  96. var cartesian = $this.getCatesian3FromPX(evt.position);
  97. if ($this._positions.length == 0) {
  98. $this._positions.push(cartesian.clone());
  99. $this.floatingPoint = $this.createPoint(cartesian);
  100. $this._positions.push(cartesian);
  101. }
  102. if (!$this._cicle) {
  103. $this.createPoint(cartesian);// 绘制点
  104. }
  105. }, $this.Cesium.ScreenSpaceEventType.LEFT_CLICK);
  106. this.handler.setInputAction(function (evt) { //移动时绘制圆
  107. if ($this._positions.length < 1) return;
  108. var cartesian = $this.viewer.scene.pickPosition(evt.endPosition);// $this.getCatesian3FromPX(evt.endPosition);
  109. if (!$this.Cesium.defined($this._cicle)) {
  110. $this._cicle = $this.createCicle();
  111. }
  112. $this.floatingPoint.position.setValue(cartesian);
  113. if ($this._cicle) {
  114. $this._positions.pop();
  115. $this._positions.push(cartesian);
  116. }
  117. }, $this.Cesium.ScreenSpaceEventType.MOUSE_MOVE);
  118. this.handler.setInputAction(function (evt) {
  119. if (!$this._cicle) return;
  120. $this.viewer.scene.globe.depthTestAgainstTerrain = false;
  121. var cartesian = $this.viewer.scene.pickPosition(evt.position); // $this.getCatesian3FromPX(evt.position);
  122. $this._positions.pop();
  123. $this._positions.push(cartesian);
  124. $this._cicleData = $this._positions.concat();
  125. $this.viewer.entities.remove($this._cicle); //移除
  126. $this._cicle = null;
  127. $this._positions = [];
  128. $this.floatingPoint.position.setValue(cartesian);
  129. let lnglatArr = [];
  130. for (var i = 0; i < $this._cicleData.length; i++) {
  131. var lnglat = $this.cartesianToLatlng($this._cicleData[i]);
  132. lnglatArr.push(lnglat)
  133. }
  134. $this._cicleData = lnglatArr;
  135. var cicle = $this.addload($this._cicleData); //加载
  136. $this._entities_cicle.push(cicle);
  137. $this._cicleLast = cicle;
  138. $this.clearPoint();
  139. // if(typeof $this.callback=="function"){
  140. // $this.callback(cicle);
  141. // }
  142. $this.destroy()
  143. }, $this.Cesium.ScreenSpaceEventType.RIGHT_CLICK);
  144. }
  145. //创建圆
  146. createCicle() {
  147. var that = this;
  148. var shape = this.viewer.entities.add({
  149. position: that._positions[0],
  150. ellipse: {
  151. semiMinorAxis: new that.Cesium.CallbackProperty(function () {
  152. //半径 两点间距离
  153. var r = Math.sqrt(
  154. Math.pow(that._positions[0].x - that._positions[that._positions.length - 1].x, 2) +
  155. Math.pow(that._positions[0].y - that._positions[that._positions.length - 1].y, 2)
  156. );
  157. return r ? r : r + 1;
  158. }, false),
  159. semiMajorAxis: new that.Cesium.CallbackProperty(function () {
  160. var r = Math.sqrt(
  161. Math.pow(that._positions[0].x - that._positions[that._positions.length - 1].x, 2) +
  162. Math.pow(that._positions[0].y - that._positions[that._positions.length - 1].y, 2)
  163. );
  164. return r ? r : r + 1;
  165. }, false),
  166. material: that.Cesium.Color.RED.withAlpha(0.5),
  167. outline: true
  168. }
  169. });
  170. that._entities_cicle.push(shape);
  171. return shape;
  172. }
  173. //创建点
  174. createPoint(cartesian) {
  175. var $this = this;
  176. var point = this.viewer.entities.add({
  177. position: cartesian,
  178. point: {
  179. pixelSize: 10,
  180. color: $this.Cesium.Color.RED,
  181. heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
  182. }
  183. });;
  184. $this._entities_point.push(point);
  185. return point;
  186. }
  187. getCatesian3FromPX(px) {
  188. var cartesian;
  189. var ray = this.viewer.camera.getPickRay(px);
  190. if (!ray) return null;
  191. cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
  192. return cartesian;
  193. }
  194. cartesianToLatlng(cartesian) {
  195. let cartographic = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
  196. let lat = this.Cesium.Math.toDegrees(cartographic.latitude);
  197. let lng = this.Cesium.Math.toDegrees(cartographic.longitude);
  198. let alt = cartographic.height;
  199. return [lng, lat];
  200. }
  201. LatlngTocartesian(latlng){
  202. let cartesian3 = this.Cesium.Cartesian3.fromDegrees(latlng[0],latlng[1],0);
  203. return cartesian3
  204. }
  205. destroy() {
  206. if (this.handler) {
  207. this.handler.destroy();
  208. this.handler = null;
  209. }
  210. }
  211. clearPoint(){
  212. this.DrawEndEvent.raiseEvent(this._cicleLast, this._cicleData, this.drawType);
  213. for (var i = 0; i < this._entities_point.length; i++) {
  214. this.viewer.entities.remove(this._entities_point[i]);
  215. }
  216. this._entities_point = []; //脏数据
  217. }
  218. clear() {
  219. for (var i = 0; i < this._entities_point.length; i++) {
  220. this.viewer.entities.remove(this._entities_point[i]);
  221. }
  222. for (var i = 0; i < this._entities_cicle.length; i++) {
  223. this.viewer.entities.remove(this._entities_cicle[i]);
  224. }
  225. this._cicle = null; //活动圆
  226. this.floatingPoint = null;
  227. this._cicleLast = null; //最后一个圆
  228. this._positions = []; //活动点
  229. this._entities_point = []; //脏数据
  230. this._entities_cicle = []; //脏数据
  231. this._cicleData = null; //用于构造圆形数据
  232. }
  233. }
  234. export default DrawCircle