HscbGeometry.as 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package com.xt.hb.ais
  2. {
  3. import com.esri.ags.Graphic;
  4. import com.esri.ags.SpatialReference;
  5. import com.esri.ags.geometry.Geometry;
  6. import com.esri.ags.geometry.MapPoint;
  7. import com.esri.ags.geometry.Polygon;
  8. import com.esri.ags.geometry.Polyline;
  9. import com.esri.ags.layers.GraphicsLayer;
  10. import com.esri.ags.symbols.SimpleLineSymbol;
  11. import com.xt.hb.utils.MapUtils;
  12. import flash.events.TimerEvent;
  13. import flash.utils.Timer;
  14. import mx.effects.Glow;
  15. /**
  16. * 船舶
  17. */
  18. public class HscbGeometry extends Polygon
  19. {
  20. private var _lon:Number;
  21. private var _lat:Number;
  22. public function HscbGeometry(lon:Number,lat:Number,course:Number,length:Number,width:Number,speed:Number)
  23. {
  24. super(null, new SpatialReference(4326));
  25. setCbxx(lon,lat,course,length,width,speed);
  26. }
  27. /**
  28. * 获取海事船舶图层
  29. */
  30. private function getTempGraphicLayer():GraphicsLayer{
  31. var tempGLayer:GraphicsLayer = MapUtils.map.getLayer("L_ID_TEMPG") as GraphicsLayer;
  32. if(null == tempGLayer){
  33. tempGLayer = new GraphicsLayer();
  34. tempGLayer.id="L_ID_TEMPG";
  35. tempGLayer.name="L_NAME_TEMPG";
  36. MapUtils.map.addLayer(tempGLayer);
  37. }
  38. return tempGLayer;
  39. }
  40. public function selected():void{
  41. //暂把跟踪框放于临时图层
  42. var trackG:Graphic = new Graphic();
  43. trackG.geometry = drawtracking();
  44. trackG.symbol = new SimpleLineSymbol("solid",0xF7621A,1,6);
  45. trackG.name="AISG";
  46. var tempG:GraphicsLayer = getTempGraphicLayer();
  47. // 清除标记
  48. MapUtils.clearAISGraphic();
  49. tempG.add(trackG);
  50. var glow:Glow =createGlow(trackG);
  51. glow.play();
  52. var glowTimer:Timer = new Timer(600);
  53. glowTimer.addEventListener(TimerEvent.TIMER,function(event:TimerEvent):void{
  54. glow.play();
  55. },false, 0, true);
  56. glowTimer.start();
  57. }
  58. //跟踪闪烁效果
  59. private function createGlow(fea:Graphic):Glow
  60. {
  61. var glow:Glow = new Glow(fea);
  62. glow.color = 0xFDE67B;//0x0000ff;
  63. glow.blurXFrom = 0;
  64. glow.blurXTo = 100;
  65. glow.blurYFrom = 0;
  66. glow.blurYTo = 100;
  67. glow.duration = 600;
  68. return glow;
  69. }
  70. //标绘船舶追踪
  71. private function drawtracking():Geometry
  72. {
  73. var geo:Polyline=new Polyline();
  74. var c_x:Number=0.000700;//依据船舶形状画跟踪外框
  75. var c_y:Number=0.000700;//依据船舶形状画跟踪外框
  76. var d:Number=0.000400;//线段长度
  77. //左上角
  78. var X_1_1:Number = lon - c_x; var X_1_2:Number = X_1_1 + d;
  79. var Y_1_1:Number = lat + c_y; var Y_1_2:Number = Y_1_1 - d;
  80. geo.addPath([new MapPoint(X_1_1,Y_1_2),new MapPoint(X_1_1,Y_1_1),new MapPoint(X_1_2,Y_1_1)]);
  81. //右上角
  82. var X_2_1:Number = lon + c_x; var X_2_2:Number = X_2_1 - d;
  83. var Y_2_1:Number = lat + c_y; var Y_2_2:Number = Y_2_1 - d;
  84. geo.addPath([new MapPoint(X_2_1,Y_2_2),new MapPoint(X_2_1,Y_2_1),new MapPoint(X_2_2,Y_2_1)]);
  85. //右下角
  86. var X_3_1:Number = lon + c_x; var X_3_2:Number = X_3_1 - d;
  87. var Y_3_1:Number = lat - c_y; var Y_3_2:Number = Y_3_1 + d;
  88. geo.addPath([new MapPoint(X_3_1,Y_3_2),new MapPoint(X_3_1,Y_3_1),new MapPoint(X_3_2,Y_3_1)]);
  89. //左下角
  90. var X_4_1:Number = lon - c_x; var X_4_2:Number = X_4_1 + d;
  91. var Y_4_1:Number = lat - c_y; var Y_4_2:Number = Y_4_1 + d;
  92. geo.addPath([new MapPoint(X_4_1,Y_4_2),new MapPoint(X_4_1,Y_4_1),new MapPoint(X_4_2,Y_4_1)]);
  93. return geo;
  94. }
  95. /**
  96. * 设置船舶信息
  97. */
  98. public function setCbxx(lon:Number,lat:Number,course:Number,length:Number,width:Number,speed:Number):void{
  99. this._lon = lon;
  100. this._lat=lat;
  101. //先以中心点为原点
  102. //后期考虑转换异常,异常方向取0度
  103. course = -(course/180) * Math.PI; //弧度 顺时针旋转
  104. var c_x:Number=MapUtils.c_x;//船舶单位长度,按照长、宽系数同比例缩放,100米长度
  105. //if(w>1)
  106. // c_x=c_x*w/100;
  107. var c_y:Number=MapUtils.c_y;//船舶单位长度,按照长、宽系数同比例缩放,100米长度
  108. var _o_x:Number=0;//船舶顶点
  109. var _o_y:Number=c_y*2;
  110. var v_o_x:Number=lon+_o_x*Math.cos(course)-_o_y*Math.sin(course);
  111. var v_o_y:Number=lat+_o_x*Math.sin(course)+_o_y*Math.cos(course);
  112. var _1_x:Number=c_x;//船舶角点1
  113. var _1_y:Number=c_y;
  114. var v_1_x:Number=lon+_1_x*Math.cos(course)-_1_y*Math.sin(course);
  115. var v_1_y:Number=lat+_1_x*Math.sin(course)+_1_y*Math.cos(course);
  116. var _2_x:Number=c_x;//船舶角点2
  117. var _2_y:Number=-c_y;
  118. var v_2_x:Number=lon+_2_x*Math.cos(course)-_2_y*Math.sin(course);
  119. var v_2_y:Number=lat+_2_x*Math.sin(course)+_2_y*Math.cos(course);
  120. var _3_x:Number=-c_x;//船舶角点3
  121. var _3_y:Number=-c_y;
  122. var v_3_x:Number=lon+_3_x*Math.cos(course)-_3_y*Math.sin(course);
  123. var v_3_y:Number=lat+_3_x*Math.sin(course)+_3_y*Math.cos(course);
  124. var _4_x:Number=-c_x;//船舶角点4
  125. var _4_y:Number=c_y;
  126. var v_4_x:Number=lon+_4_x*Math.cos(course)-_4_y*Math.sin(course);
  127. var v_4_y:Number=lat+_4_x*Math.sin(course)+_4_y*Math.cos(course);
  128. //求一个点围绕任一个非原点的中心点 旋转
  129. this.addRing([new MapPoint(v_o_x,v_o_y),new MapPoint(v_1_x,v_1_y),new MapPoint(v_2_x,v_2_y),new MapPoint(v_3_x,v_3_y),new MapPoint(v_4_x,v_4_y),new MapPoint(v_o_x,v_o_y)]);
  130. //船首线与船速成正比
  131. if(speed>0)
  132. {
  133. var c_j:Number=MapUtils.c_j;
  134. c_j=c_j*speed/5+MapUtils.c_j_1;
  135. var v_j_x:Number=lon+0*Math.cos(course)-c_j*Math.sin(course);
  136. var v_j_y:Number=lat+0*Math.sin(course)+c_j*Math.cos(course);
  137. this.addRing([new MapPoint(v_o_x,v_o_y),new MapPoint(v_j_x,v_j_y),new MapPoint(v_o_x,v_o_y)]);
  138. }
  139. }
  140. public function get lat():Number
  141. {
  142. return _lat;
  143. }
  144. public function get lon():Number
  145. {
  146. return _lon;
  147. }
  148. }
  149. }