DrawPolyline.js 7.4 KB

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