DrawRectangle.js 8.1 KB

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