index.js 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945
  1. "use strict";
  2. var __assign = (this && this.__assign) || function () {
  3. __assign = Object.assign || function(t) {
  4. for (var s, i = 1, n = arguments.length; i < n; i++) {
  5. s = arguments[i];
  6. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
  7. t[p] = s[p];
  8. }
  9. return t;
  10. };
  11. return __assign.apply(this, arguments);
  12. };
  13. exports.__esModule = true;
  14. var reselect_1 = require("reselect");
  15. var Common_1 = require("./Common");
  16. var Utils_1 = require("./Utils");
  17. exports.latLngDegreesToDecimal = Utils_1.latLngDegreesToDecimal;
  18. exports.latLngDecimalToDegrees = Utils_1.latLngDecimalToDegrees;
  19. var LatLon = require('geodesy').LatLonSpherical;
  20. function convertAirspaceInfoServerToLocal(airspaceInfo) {
  21. var airspaceType = airspaceInfo.airspace_type;
  22. if (airspaceType == Common_1["default"].airspaceType.circle) {
  23. var ai = airspaceInfo;
  24. return {
  25. airspaceType: airspaceType,
  26. airspaceId: ai.airspace_id,
  27. name: ai.airspace_name,
  28. note: ai.note,
  29. addr: ai.center_loc,
  30. lat: Utils_1.latLngDecimalToDegrees(ai.center_point_of_flying.lat),
  31. lng: Utils_1.latLngDecimalToDegrees(ai.center_point_of_flying.lng),
  32. radius: ai.radius_of_flying,
  33. height: ai.altitude + "",
  34. heightStandard: Common_1["default"].heightStandardsById.get(ai.unit)
  35. };
  36. }
  37. if (airspaceType == Common_1["default"].airspaceType.line) {
  38. var ai = airspaceInfo;
  39. var dep = {
  40. addr: ai.start_loc,
  41. lat: Utils_1.latLngDecimalToDegrees(ai.start_point.lat),
  42. lng: Utils_1.latLngDecimalToDegrees(ai.start_point.lng),
  43. height: ai.start_point.altitude + "",
  44. heightStandard: Common_1["default"].heightStandardsById.get(ai.start_point.unit)
  45. };
  46. var arrive = {
  47. addr: ai.end_loc,
  48. lat: Utils_1.latLngDecimalToDegrees(ai.end_point.lat),
  49. lng: Utils_1.latLngDecimalToDegrees(ai.end_point.lng)
  50. };
  51. var passPoints = [];
  52. if (Array.isArray(ai.passing_points)) {
  53. for (var _i = 0, _a = ai.passing_points; _i < _a.length; _i++) {
  54. var obj = _a[_i];
  55. var point = void 0;
  56. if (obj.point_type == Common_1["default"].pointTypes.point) {
  57. var pp = obj;
  58. var lat = Utils_1.latLngDecimalToDegrees(pp.lat);
  59. var lng = Utils_1.latLngDecimalToDegrees(pp.lng);
  60. point = {
  61. pointType: pp.point_type,
  62. addr: pp.point_name,
  63. lat: lat, lng: lng
  64. };
  65. }
  66. else if (obj.point_type == Common_1["default"].pointTypes.nav) {
  67. var pp = obj;
  68. var lat = Utils_1.latLngDecimalToDegrees(pp.lat);
  69. var lng = Utils_1.latLngDecimalToDegrees(pp.lng);
  70. point = {
  71. pointType: pp.point_type,
  72. pointId: pp.point_id,
  73. pointCode: pp.point_code,
  74. pointName: pp.point_name,
  75. lat: lat, lng: lng
  76. };
  77. }
  78. else {
  79. var pp = obj;
  80. point = {
  81. pointType: pp.point_type,
  82. airRouteId: pp.airway,
  83. airlineCode: pp.air_route_code,
  84. airlines: pp.points
  85. };
  86. }
  87. if (Utils_1.isNumber(obj.altitude) && Utils_1.isNumber(obj.unit)) {
  88. point.height = obj.altitude + "";
  89. point.heightStandard = Common_1["default"].heightStandardsById.get(obj.unit);
  90. }
  91. else {
  92. point.height = "";
  93. point.heightStandard = Common_1["default"].heightStandards.keys().slice()[0];
  94. }
  95. passPoints.push(point);
  96. }
  97. }
  98. return __assign({
  99. airspaceType: airspaceType,
  100. airspaceId: ai.airspace_id,
  101. name: ai.airspace_name,
  102. note: ai.note,
  103. dep: dep,
  104. arrive: arrive,
  105. passPoints: passPoints
  106. }, (ai.airline_width ? { airlineWidth: ai.airline_width } : {}));
  107. }
  108. if (airspaceType == Common_1["default"].airspaceType.polygon) {
  109. var ai = airspaceInfo;
  110. if (Array.isArray(ai.points)) {
  111. var polygonPoints = new Array();
  112. var defaultPointName = 'A';
  113. for (var _b = 0, _c = ai.points; _b < _c.length; _b++) {
  114. var obj = _c[_b];
  115. var addr = obj.addr;
  116. if (!addr) {
  117. addr = defaultPointName;
  118. defaultPointName = String.fromCharCode(defaultPointName.charCodeAt(0) + 1);
  119. }
  120. polygonPoints.push({ addr: addr, lat: Utils_1.latLngDecimalToDegrees(obj.lat), lng: Utils_1.latLngDecimalToDegrees(obj.lng) });
  121. }
  122. return {
  123. airspaceType: airspaceType,
  124. airspaceId: ai.airspace_id,
  125. name: ai.airspace_name,
  126. note: ai.note,
  127. height: ai.altitude + '',
  128. heightStandard: Common_1["default"].heightStandardsById.get(ai.unit),
  129. polygonPoints: polygonPoints
  130. };
  131. }
  132. }
  133. return null;
  134. }
  135. exports.convertAirspaceInfoServerToLocal = convertAirspaceInfoServerToLocal;
  136. function convertAirspaceInfoLocalToServer(airspace) {
  137. if (airspace.airspaceType == Common_1["default"].airspaceType.circle) {
  138. var ai = airspace;
  139. var circle = {
  140. airspace_name: ai.name,
  141. airspace_id: ai.airspaceId,
  142. airspace_type: Common_1["default"].airspaceType.circle,
  143. note: Utils_1.isSafeString(ai.note) ? ai.note : null,
  144. radius_of_flying: parseInt(ai.radius + ''),
  145. center_point_of_flying: {
  146. lng: Utils_1.latLngDegreesToDecimal(ai.lng),
  147. lat: Utils_1.latLngDegreesToDecimal(ai.lat)
  148. },
  149. center_loc: ai.addr,
  150. altitude: parseInt(ai.height),
  151. unit: Common_1["default"].heightStandards.get(ai.heightStandard)
  152. };
  153. return circle;
  154. }
  155. else if (airspace.airspaceType == Common_1["default"].airspaceType.line) {
  156. var ai = airspace;
  157. var line = {
  158. airspace_name: ai.name,
  159. airspace_id: ai.airspaceId,
  160. airspace_type: Common_1["default"].airspaceType.line,
  161. note: ai.note,
  162. start_loc: ai.dep.addr,
  163. start_point: {
  164. lng: Utils_1.latLngDegreesToDecimal(ai.dep.lng),
  165. lat: Utils_1.latLngDegreesToDecimal(ai.dep.lat),
  166. altitude: parseInt(ai.dep.height),
  167. unit: Common_1["default"].heightStandards.get(ai.dep.heightStandard)
  168. },
  169. end_loc: ai.arrive.addr,
  170. end_point: {
  171. lng: Utils_1.latLngDegreesToDecimal(ai.arrive.lng),
  172. lat: Utils_1.latLngDegreesToDecimal(ai.arrive.lat)
  173. }
  174. };
  175. if (ai.airlineWidth) {
  176. line['airline_width'] = ai.airlineWidth;
  177. }
  178. if (Array.isArray(ai.passPoints) && ai.passPoints.length > 0) {
  179. var passing_points = [];
  180. for (var _i = 0, _a = ai.passPoints; _i < _a.length; _i++) {
  181. var obj = _a[_i];
  182. var retObj = void 0;
  183. if (obj.pointType == Common_1["default"].pointTypes.point && Utils_1.hasPoint(obj)) {
  184. var pp = obj;
  185. retObj = {
  186. point_type: Common_1["default"].pointTypes.point,
  187. point_name: pp.addr,
  188. lat: Utils_1.latLngDegreesToDecimal(pp.lat),
  189. lng: Utils_1.latLngDegreesToDecimal(pp.lng)
  190. };
  191. }
  192. else if (obj.pointType == Common_1["default"].pointTypes.nav) {
  193. var pp = obj;
  194. retObj = {
  195. point_type: Common_1["default"].pointTypes.nav,
  196. point_name: pp.pointName,
  197. point_id: pp.pointId,
  198. point_code: pp.pointCode,
  199. lat: Utils_1.latLngDegreesToDecimal(pp.lat),
  200. lng: Utils_1.latLngDegreesToDecimal(pp.lng)
  201. };
  202. }
  203. else {
  204. var pp = obj;
  205. retObj = {
  206. point_type: Common_1["default"].pointTypes.line,
  207. airway: pp.airRouteId,
  208. air_route_code: pp.airlineCode,
  209. points: pp.airlines
  210. };
  211. }
  212. if (Utils_1.isSafeString(obj.height) && Utils_1.isSafeString(obj.heightStandard)) {
  213. retObj.altitude = parseInt(obj.height);
  214. // @ts-ignore
  215. retObj.unit = Common_1["default"].heightStandards.get(obj.heightStandard);
  216. }
  217. passing_points.push(retObj);
  218. }
  219. line.passing_points = passing_points;
  220. }
  221. else {
  222. line.passing_points = [];
  223. }
  224. return line;
  225. }
  226. else {
  227. var ai = airspace;
  228. var points = [];
  229. for (var _b = 0, _c = ai.polygonPoints; _b < _c.length; _b++) {
  230. var obj = _c[_b];
  231. points.push({ addr: obj.addr, lat: Utils_1.latLngDegreesToDecimal(obj.lat), lng: Utils_1.latLngDegreesToDecimal(obj.lng) });
  232. }
  233. var polygon = {
  234. airspace_name: ai.name,
  235. airspace_id: ai.airspaceId,
  236. airspace_type: Common_1["default"].airspaceType.polygon,
  237. note: ai.note,
  238. altitude: parseInt(ai.height),
  239. unit: Common_1["default"].heightStandards.get(ai.heightStandard),
  240. points: points
  241. };
  242. return polygon;
  243. }
  244. }
  245. exports.convertAirspaceInfoLocalToServer = convertAirspaceInfoLocalToServer;
  246. function getCircleRegions(circle) {
  247. var lat, lng;
  248. if (circle.coordinate.latitude) {
  249. var coord = circle.coordinate;
  250. lat = coord.latitude;
  251. lng = coord.longitude;
  252. }
  253. else {
  254. var coord = circle.coordinate;
  255. lat = coord.lat;
  256. lng = coord.lng;
  257. }
  258. var latlon = new LatLon(lat, lng);
  259. var d1 = latlon.destinationPoint(circle.radius, 0);
  260. var d2 = latlon.destinationPoint(circle.radius, 90);
  261. var d3 = latlon.destinationPoint(circle.radius, 180);
  262. var d4 = latlon.destinationPoint(circle.radius, 270);
  263. return [{ lat: d1.lat, lng: d1.lon }, { lat: d2.lat, lng: d2.lon }, { lat: d3.lat, lng: d3.lon }, { lat: d4.lat, lng: d4.lon }];
  264. }
  265. function getDefaultStyle() {
  266. var imageName = 'BA_oval';
  267. var lineWidth = Common_1["default"].amapLineWidth;
  268. var strokeColor = Common_1["default"].amapStrokeColor;
  269. var fillColor = Common_1["default"].amapFillColor;
  270. return { imageName: imageName, lineWidth: lineWidth, strokeColor: strokeColor, fillColor: fillColor };
  271. }
  272. function getCirclesAndMarkers(airspaceInfos, setStyle, currentAirspaceIndex) {
  273. var circles = [];
  274. var markers = [];
  275. if (!Array.isArray(airspaceInfos)) {
  276. return { circles: circles, markers: markers };
  277. }
  278. var _a = getDefaultStyle(), imageName = _a.imageName, lineWidth = _a.lineWidth, strokeColor = _a.strokeColor, fillColor = _a.fillColor;
  279. //通过该方法获取样式
  280. var circleStyle = setStyle('circle');
  281. if (circleStyle) {
  282. lineWidth = circleStyle.lineWidth;
  283. strokeColor = circleStyle.strokeColor;
  284. fillColor = circleStyle.fillColor;
  285. imageName = circleStyle.imageName;
  286. }
  287. for (var i = 0; i < airspaceInfos.length; i++) {
  288. var tmpCircle = airspaceInfos[i];
  289. var airspaceTypeFix = void 0, radiusFix = void 0;
  290. if (tmpCircle.airspaceType) {
  291. airspaceTypeFix = 'airspaceType';
  292. radiusFix = 'radius';
  293. }
  294. else {
  295. airspaceTypeFix = 'airspace_type';
  296. radiusFix = 'radius_of_flying';
  297. }
  298. if (tmpCircle[airspaceTypeFix] == Common_1["default"].airspaceType.circle && currentAirspaceIndex != i) {
  299. var coordinate = { latitude: 0, longitude: 0 };
  300. if (tmpCircle.center_point_of_flying) {
  301. var ai = tmpCircle;
  302. coordinate.latitude = ai.center_point_of_flying.lat;
  303. coordinate.longitude = ai.center_point_of_flying.lng;
  304. }
  305. else {
  306. var ai = tmpCircle;
  307. coordinate.latitude = Utils_1.latLngDegreesToDecimal(ai.lat);
  308. coordinate.longitude = Utils_1.latLngDegreesToDecimal(ai.lng);
  309. }
  310. var radius = tmpCircle[radiusFix];
  311. if (radius) {
  312. var circle = { lineWidth: lineWidth, strokeColor: strokeColor, fillColor: fillColor, radius: radius, coordinate: coordinate };
  313. circles.push(circle);
  314. }
  315. else {
  316. // 这里的经纬度必定是数值, 所以最后一个参数是 2
  317. markers.push(addOvalPointConfig(coordinate.latitude, coordinate.longitude, imageName, 2));
  318. }
  319. }
  320. }
  321. return { circles: circles, markers: markers };
  322. }
  323. function getCircleAndMarkerSelector(airspaceInfos, setStyle, currentAirspaceIndex) {
  324. return reselect_1.createSelector(airspaceInfos, function () { return setStyle; }, currentAirspaceIndex, getCirclesAndMarkers);
  325. }
  326. function getLatLng(latlng, dataType) {
  327. if (dataType == 1) { // 驼峰模式,新建计划的时候的格式
  328. return Utils_1.latLngDegreesToDecimal(latlng);
  329. }
  330. else {
  331. return latlng;
  332. }
  333. }
  334. function drawLineConfig(lat, lng, dataType) {
  335. return {
  336. latitude: getLatLng(lat, dataType),
  337. longitude: getLatLng(lng, dataType)
  338. };
  339. }
  340. function addOvalPointConfig(lat, lng, imageName, dataType) {
  341. return {
  342. coordinate: {
  343. latitude: getLatLng(lat, dataType),
  344. longitude: getLatLng(lng, dataType)
  345. },
  346. imageName: imageName
  347. };
  348. }
  349. function pointCompare(point1, point2) {
  350. if (!point1 || !point2) {
  351. return false;
  352. }
  353. var pointId1 = point1.point_id;
  354. var pointId2 = point2.point_id;
  355. if (pointId1 == pointId2) {
  356. return true;
  357. }
  358. var _a = getFixedLatLng(point1), point1Lat = _a[0], point1lng = _a[1];
  359. var _b = getFixedLatLng(point2), point2lat = _b[0], point2lng = _b[1];
  360. if (myRound(point1Lat) == myRound(point2lat)
  361. && myRound(point1lng) == myRound(point2lng)) {
  362. return true;
  363. }
  364. else {
  365. return false;
  366. }
  367. }
  368. function getCrossPoint(points1, points2) {
  369. for (var _i = 0, points1_1 = points1; _i < points1_1.length; _i++) {
  370. var point1 = points1_1[_i];
  371. for (var _a = 0, points2_1 = points2; _a < points2_1.length; _a++) {
  372. var point2 = points2_1[_a];
  373. if (pointCompare(point1, point2))
  374. return point1;
  375. }
  376. }
  377. return undefined;
  378. }
  379. function getAirwayPoints(airway, pointBefore, pointAfter) {
  380. var found = 0;
  381. var points = [];
  382. var pointTypeFix, pointsFix, airRoutePoint;
  383. if ('points' in airway) {
  384. pointTypeFix = 'point_type';
  385. pointsFix = 'points';
  386. airRoutePoint = airway['points'];
  387. }
  388. else {
  389. pointTypeFix = 'pointType';
  390. pointsFix = 'airlines';
  391. airRoutePoint = airway['airlines'];
  392. }
  393. var crossPointBefore, crossPointAfter;
  394. // 如果前后是其他航线,那么找到交叉点作为前后的点
  395. if (pointBefore[pointTypeFix] == Common_1["default"].pointTypes.line) {
  396. crossPointBefore = getCrossPoint(airRoutePoint, pointBefore[pointsFix]);
  397. }
  398. if (pointAfter[pointTypeFix] == Common_1["default"].pointTypes.line) {
  399. crossPointAfter = getCrossPoint(airRoutePoint, pointAfter[pointsFix]);
  400. }
  401. for (var _i = 0, airRoutePoint_1 = airRoutePoint; _i < airRoutePoint_1.length; _i++) {
  402. var point = airRoutePoint_1[_i];
  403. if (pointCompare(crossPointBefore, point) || pointCompare(crossPointAfter, point)) {
  404. found++;
  405. points.push(Object.assign({}, point));
  406. continue;
  407. }
  408. if (found == 1) {
  409. points.push(Object.assign({}, point));
  410. }
  411. }
  412. if (!(points.length > 0 && found == 2)) {
  413. // 如果两个点不全在航线上面,那么画全部航线
  414. points = airRoutePoint;
  415. }
  416. return points;
  417. }
  418. function getLinesRouter(lineProps, lineAndMarkerStyle) {
  419. var coordinates = new Array();
  420. var markers = new Array();
  421. var lines = [];
  422. var _a = getDefaultStyle(), imageName = _a.imageName, lineWidth = _a.lineWidth, strokeColor = _a.strokeColor;
  423. if (lineAndMarkerStyle) {
  424. imageName = lineAndMarkerStyle.imageName;
  425. lineWidth = lineAndMarkerStyle.lineWidth;
  426. strokeColor = lineAndMarkerStyle.strokeColor;
  427. }
  428. var startPoint, passPoints, endPoint, pointTypeFix, dataType, airlineWidth;
  429. if (lineProps.start_point) {
  430. var ll = lineProps;
  431. dataType = 2; // 下划线模式
  432. startPoint = ll['start_point'];
  433. passPoints = ll['passing_points'];
  434. endPoint = ll['end_point'];
  435. pointTypeFix = 'point_type';
  436. airlineWidth = parseInt(ll['airline_width'] + '', 10);
  437. }
  438. else {
  439. var ll = lineProps;
  440. dataType = 1; // 驼峰模式
  441. startPoint = ll['dep'];
  442. passPoints = ll['passPoints'];
  443. endPoint = ll['arrive'];
  444. pointTypeFix = 'pointType';
  445. airlineWidth = parseInt(ll['airlineWidth'] + '', 10);
  446. }
  447. if (startPoint) {
  448. coordinates.push(drawLineConfig(startPoint.lat, startPoint.lng, dataType));
  449. markers.push(addOvalPointConfig(startPoint.lat, startPoint.lng, imageName, dataType));
  450. }
  451. if (Array.isArray(passPoints)) {
  452. for (var i = 0; i < passPoints.length; i++) {
  453. var obj = passPoints[i];
  454. if (!Utils_1.isObject(obj)) { // 所有的 points/airway 都必须是 obj
  455. continue;
  456. }
  457. var pointType = obj[pointTypeFix];
  458. if (pointType == Common_1["default"].pointTypes.point
  459. || pointType == Common_1["default"].pointTypes.nav) {
  460. var pp = obj;
  461. coordinates.push(drawLineConfig(pp.lat, pp.lng, dataType));
  462. markers.push(addOvalPointConfig(pp.lat, pp.lng, imageName, dataType));
  463. }
  464. else {
  465. // 遇到一个航线,不需要和前前面的点连起来
  466. var pp = obj;
  467. if (coordinates.length > 1) {
  468. lines.push({ lineWidth: lineWidth, strokeColor: strokeColor, coordinates: coordinates });
  469. }
  470. coordinates = [];
  471. var pointBefore = i == 0 ? startPoint : passPoints[i - 1];
  472. var pointAfter = i == passPoints.length - 1 ? (endPoint ? endPoint : passPoints[passPoints.length - 1]) : passPoints[i + 1];
  473. lines.push({ lineWidth: lineWidth, strokeColor: strokeColor, coordinates: getAirwayPoints(pp, pointBefore, pointAfter) });
  474. }
  475. }
  476. }
  477. if (endPoint) {
  478. coordinates.push(drawLineConfig(endPoint.lat, endPoint.lng, dataType));
  479. markers.push(addOvalPointConfig(endPoint.lat, endPoint.lng, imageName, dataType));
  480. }
  481. if (coordinates.length > 1) {
  482. lines.push({ lineWidth: lineWidth, strokeColor: strokeColor, coordinates: coordinates });
  483. }
  484. if (airlineWidth > 0) {
  485. // 有宽度的空域,需要线周围多画宽度的多边形
  486. var polygons = processAirlineWidth(lines, airlineWidth);
  487. return { lines: lines, markers: markers, polygons: polygons };
  488. }
  489. else {
  490. return { lines: lines, markers: markers, polygons: [] };
  491. }
  492. }
  493. function getFixedLatLng(point) {
  494. var pp = point;
  495. var lat = pp.latitude ? pp.latitude : pp.lat;
  496. var lng = pp.longitude ? pp.longitude : pp.lng;
  497. // 复制计划的数据,有的点是度数模式如 38°35′17″
  498. if (Utils_1.isSafeString(lat)) {
  499. lat = Utils_1.latLngDegreesToDecimal(lat);
  500. lng = Utils_1.latLngDegreesToDecimal(lng);
  501. }
  502. return [lat, lng];
  503. }
  504. function processAirlineWidth(lines, airlineWidth) {
  505. var polygons = [];
  506. var _a = getDefaultStyle(), strokeColor = _a.strokeColor, fillColor = _a.fillColor;
  507. for (var _i = 0, lines_1 = lines; _i < lines_1.length; _i++) {
  508. var line = lines_1[_i];
  509. var points = line.coordinates;
  510. for (var i = 0; i < points.length - 1; i++) {
  511. var _b = getFixedLatLng(points[i]), lat1 = _b[0], lng1 = _b[1];
  512. var _c = getFixedLatLng(points[i + 1]), lat2 = _c[0], lng2 = _c[1];
  513. var point1 = new LatLon(lat1, lng1);
  514. var point2 = new LatLon(lat2, lng2);
  515. var coordinates = getCirclePoints(point1, point2, airlineWidth);
  516. polygons.push({ lineWidth: 1, strokeColor: strokeColor, fillColor: fillColor, coordinates: coordinates });
  517. }
  518. }
  519. return polygons;
  520. }
  521. function getCirclePoints(point1, point2, width) {
  522. var percision = 10; // 半圆处理为多边形的时候,半圆上取几个点
  523. var step = 180 / percision;
  524. var bearing = (360 + point1.bearingTo(point2) - 90) % 360; // 取正值
  525. var points = [];
  526. for (var diff = 0; diff <= 180; diff += step) {
  527. var point = point2.destinationPoint(width, bearing + diff);
  528. points.push({ lat: point.lat, lng: point.lon });
  529. }
  530. for (var diff = 180; diff <= 360; diff += step) {
  531. var point = point1.destinationPoint(width, bearing + diff);
  532. points.push({ lat: point.lat, lng: point.lon });
  533. }
  534. return points;
  535. }
  536. function myRound(num, digits) {
  537. if (digits == null)
  538. digits = 6; // 比较的精度,经纬度会被经过度分秒方式到浮点方式的转化
  539. return Math.round(num * Math.pow(10, digits)) / Math.pow(10, digits);
  540. }
  541. function getLinesPolygonsAndMarkers(airspaceInfos, setStyle, currentAirspaceIndex) {
  542. var retLines = [];
  543. var retMarkers = [];
  544. var retPolygons = [];
  545. if (!Array.isArray(airspaceInfos)) {
  546. return { lines: retLines, markers: retMarkers, polygons: retPolygons };
  547. }
  548. var lineStyle = setStyle('line');
  549. for (var i = 0; i < airspaceInfos.length; i++) {
  550. var tmpLine = airspaceInfos[i];
  551. var airspaceTypeFix = void 0;
  552. if (tmpLine.airspaceType)
  553. airspaceTypeFix = 'airspaceType';
  554. else
  555. airspaceTypeFix = 'airspace_type';
  556. if (tmpLine[airspaceTypeFix] == Common_1["default"].airspaceType.line && currentAirspaceIndex != i) {
  557. var lineProps = tmpLine;
  558. var _a = getLinesRouter(lineProps, lineStyle), lines = _a.lines, markers = _a.markers, polygons = _a.polygons;
  559. retMarkers.push.apply(retMarkers, markers);
  560. retLines.push.apply(retLines, lines);
  561. retPolygons.push.apply(retPolygons, polygons);
  562. }
  563. }
  564. return { lines: retLines, markers: retMarkers, polygons: retPolygons };
  565. }
  566. function getLinePolygonsAndMarkerSelector(airspaceInfos, setStyle, currentAirspaceIndex) {
  567. return reselect_1.createSelector(airspaceInfos, function () { return setStyle; }, currentAirspaceIndex, getLinesPolygonsAndMarkers);
  568. }
  569. function getPolygon(polygonProps, polygonAndMarkerStyle) {
  570. var coordinates = new Array();
  571. var markers = new Array();
  572. var _a = getDefaultStyle(), imageName = _a.imageName, lineWidth = _a.lineWidth, strokeColor = _a.strokeColor, fillColor = _a.fillColor;
  573. if (polygonAndMarkerStyle) {
  574. imageName = polygonAndMarkerStyle.imageName;
  575. lineWidth = polygonAndMarkerStyle.lineWidth;
  576. strokeColor = polygonAndMarkerStyle.strokeColor;
  577. fillColor = polygonAndMarkerStyle.fillColor;
  578. }
  579. var pointsFix, dataType;
  580. if (polygonProps.points) {
  581. pointsFix = 'points';
  582. dataType = 2;
  583. }
  584. else {
  585. pointsFix = 'polygonPoints';
  586. dataType = 1; // 驼峰模式
  587. }
  588. if (Array.isArray(polygonProps[pointsFix])) {
  589. for (var _i = 0, _b = polygonProps[pointsFix]; _i < _b.length; _i++) {
  590. var obj = _b[_i];
  591. if (!obj) {
  592. continue;
  593. }
  594. coordinates.push(drawLineConfig(obj.lat, obj.lng, dataType));
  595. markers.push(addOvalPointConfig(obj.lat, obj.lng, imageName, dataType));
  596. }
  597. }
  598. var polygon = { lineWidth: lineWidth, strokeColor: strokeColor, fillColor: fillColor, coordinates: coordinates };
  599. return { markers: markers, polygon: polygon };
  600. }
  601. function getPolygonsAndMarkers(airspaceInfos, setStyle, currentAirspaceIndex) {
  602. var markers = [];
  603. var polygons = [];
  604. if (!Array.isArray(airspaceInfos)) {
  605. return { markers: markers, polygons: polygons };
  606. }
  607. var polygonAndMarkerStyle = setStyle('polygon');
  608. for (var i = 0; i < airspaceInfos.length; i++) {
  609. var polygon = airspaceInfos[i];
  610. var airspaceTypeFix = void 0;
  611. if (polygon.airspaceType)
  612. airspaceTypeFix = 'airspaceType';
  613. else
  614. airspaceTypeFix = 'airspace_type';
  615. if (polygon[airspaceTypeFix] == Common_1["default"].airspaceType.polygon && currentAirspaceIndex != i) {
  616. var retObj = getPolygon(polygon, polygonAndMarkerStyle);
  617. markers.push.apply(markers, retObj.markers);
  618. polygons.push(retObj.polygon);
  619. }
  620. }
  621. return { markers: markers, polygons: polygons };
  622. }
  623. function getPolygonAndMarkerSelector(airspaceInfos, setStyle, currentAirspaceIndex) {
  624. return reselect_1.createSelector(airspaceInfos, function () { return setStyle; }, currentAirspaceIndex, getPolygonsAndMarkers);
  625. }
  626. function getMarkers(circlesAndMarkers, polygonAndMarkers, lineAndMarkers) {
  627. var markers = [];
  628. if (circlesAndMarkers) {
  629. markers = circlesAndMarkers.markers.slice();
  630. }
  631. if (polygonAndMarkers) {
  632. markers = markers.concat(polygonAndMarkers.markers);
  633. }
  634. if (lineAndMarkers) {
  635. markers = markers.concat(lineAndMarkers.markers);
  636. }
  637. return markers;
  638. }
  639. function getMarkerSelector(circlesAndMarkers, polygonAndMarkers, lineAndMarkers) {
  640. return reselect_1.createSelector(circlesAndMarkers, polygonAndMarkers, lineAndMarkers, getMarkers);
  641. }
  642. function getRegionPoints(circles, lineAndMarkers, polygonAndMarkers) {
  643. var regionPoints = new Array();
  644. for (var i = 0; i < circles.length; i++) {
  645. regionPoints.push.apply(regionPoints, getCircleRegions(circles[i]));
  646. }
  647. var lines = lineAndMarkers.lines;
  648. for (var i = 0; i < lines.length; i++) {
  649. regionPoints.push.apply(regionPoints, lines[i].coordinates);
  650. }
  651. var polygons = polygonAndMarkers.polygons;
  652. for (var i = 0; i < polygons.length; i++) {
  653. regionPoints.push.apply(regionPoints, polygons[i].coordinates);
  654. }
  655. return regionPoints;
  656. }
  657. function getRegionPointsSelector(circles, lineAndMarkers, polygonAndMarkers) {
  658. return reselect_1.createSelector(circles, lineAndMarkers, polygonAndMarkers, getRegionPoints);
  659. }
  660. function getCircles(circlesAndMarkers) {
  661. return circlesAndMarkers.circles;
  662. }
  663. function getCircleSelector(circlesAndMarkers) {
  664. return reselect_1.createSelector(circlesAndMarkers, getCircles);
  665. }
  666. function getLines(lineAndMarker) {
  667. return lineAndMarker.lines;
  668. }
  669. function getLineSelector(lineAndMarker) {
  670. return reselect_1.createSelector(lineAndMarker, getLines);
  671. }
  672. function getPolygons(polygonAndMarkers, linePolygonsAndMarkers) {
  673. return polygonAndMarkers.polygons.concat(linePolygonsAndMarkers.polygons);
  674. }
  675. function getPolygonSelector(polygonAndMarkers, linePolygonsAndMarkers) {
  676. return reselect_1.createSelector(polygonAndMarkers, linePolygonsAndMarkers, getPolygons);
  677. }
  678. var setStyle = function (styles) {
  679. if (!styles)
  680. return function () { return null; };
  681. else
  682. return function (shapeName) { return styles[shapeName]; };
  683. };
  684. //获取selector
  685. function getShapesSelector(airspaceInfos, style, currentAirspaceIndex) {
  686. currentAirspaceIndex = currentAirspaceIndex ? currentAirspaceIndex : function () { return -1; };
  687. var circlesAndMarkers = getCircleAndMarkerSelector(airspaceInfos, setStyle(style), currentAirspaceIndex);
  688. var circles = getCircleSelector(circlesAndMarkers);
  689. var linePolygonsAndMarkers = getLinePolygonsAndMarkerSelector(airspaceInfos, setStyle(style), currentAirspaceIndex);
  690. var lines = getLineSelector(linePolygonsAndMarkers);
  691. var polygonAndMarkers = getPolygonAndMarkerSelector(airspaceInfos, setStyle(style), currentAirspaceIndex);
  692. var polygons = getPolygonSelector(polygonAndMarkers, linePolygonsAndMarkers);
  693. var markers = getMarkerSelector(circlesAndMarkers, polygonAndMarkers, linePolygonsAndMarkers);
  694. var regionPoints = getRegionPointsSelector(circles, linePolygonsAndMarkers, polygonAndMarkers);
  695. return {
  696. markers: markers,
  697. circles: circles,
  698. lines: lines,
  699. polygons: polygons,
  700. regionPoints: regionPoints
  701. };
  702. }
  703. exports.getShapesSelector = getShapesSelector;
  704. //获取数组
  705. function getShapes(airspaceInfos, style, currentAirspaceIndex) {
  706. var _a = getShapesSelector(function () { return airspaceInfos; }, style, function () { return currentAirspaceIndex; }), markers = _a.markers, polygons = _a.polygons, circles = _a.circles, lines = _a.lines, regionPoints = _a.regionPoints;
  707. return {
  708. markers: markers(airspaceInfos),
  709. circles: circles(airspaceInfos),
  710. lines: lines(airspaceInfos),
  711. polygons: polygons(airspaceInfos),
  712. regionPoints: regionPoints(airspaceInfos)
  713. };
  714. }
  715. exports.getShapes = getShapes;
  716. // 总共 5 种格式, http://git.corp.brilliantaero.com/BA/Coco/issues/99#note_6358
  717. // 1. 全输出格式
  718. // 2. 简化格式
  719. // 3. 传真格式
  720. // 4. 用户端用的简化格式
  721. // 5. 极简格式
  722. function getHeight(height, unit, type) {
  723. var shortNum;
  724. var num = +height; // to number
  725. if (num >= 100) {
  726. shortNum = parseInt(num / 100 + '').toString();
  727. if (shortNum.length < 2) {
  728. shortNum = '0' + shortNum;
  729. }
  730. }
  731. var heightStandard = Common_1["default"].heightStandardsById.get(unit);
  732. if (!heightStandard) {
  733. heightStandard = unit;
  734. }
  735. // 这里统一使用数字判断
  736. var standardUnit = Common_1["default"].heightStandards.get(heightStandard);
  737. var heightDesc;
  738. switch (standardUnit) {
  739. case 1:
  740. heightDesc = ['H*真', '真高*米'];
  741. break;
  742. case 2:
  743. heightDesc = ['H*标(含以下)', '标高*米(含以下)'];
  744. break;
  745. case 3:
  746. heightDesc = ['H*真(含以下)', '真高*米(含以下)'];
  747. break;
  748. default:
  749. heightDesc = ['H*标', '标高*米'];
  750. }
  751. if (shortNum && (type == 1 || type == 2)) {
  752. // H02真,H02真(含以下)
  753. return heightDesc[0].replace('*', shortNum);
  754. }
  755. else {
  756. // 真高200米,真高200米(含以下)
  757. return heightDesc[1].replace('*', height + '');
  758. }
  759. }
  760. function getAirspaceName(airspaceInfo) {
  761. if (airspaceInfo.airspace_name) {
  762. var ai = airspaceInfo;
  763. return ai.airspace_name;
  764. }
  765. else {
  766. var ai = airspaceInfo;
  767. return ai.name;
  768. }
  769. }
  770. function circleContent(airspaceInfo, type) {
  771. if (type === void 0) { type = 3; }
  772. if (type == 5)
  773. return getAirspaceName(airspaceInfo);
  774. if ('airspace_name' in airspaceInfo) {
  775. var lat = Utils_1.latLngDecimalToDegrees(airspaceInfo.center_point_of_flying.lat);
  776. var lng = Utils_1.latLngDecimalToDegrees(airspaceInfo.center_point_of_flying.lng);
  777. var content = [];
  778. var loc = "\u4EE5" + airspaceInfo.center_loc;
  779. if (type == 1 || type == 3)
  780. loc += "(E" + lng + ", N" + lat + ")";
  781. content.push(loc + "\u4E3A\u4E2D\u5FC3");
  782. content.push("\u534A\u5F84" + airspaceInfo.radius_of_flying + "\u7C73");
  783. content.push(getHeight(airspaceInfo.altitude, airspaceInfo.unit, type));
  784. if (airspaceInfo.note)
  785. content.push("\u5907\u6CE8\uFF1A" + airspaceInfo.note);
  786. return content.join(',');
  787. }
  788. else {
  789. var content = [];
  790. var loc = "\u4EE5" + airspaceInfo.addr;
  791. if (type == 1 || type == 3)
  792. loc += "(E" + airspaceInfo.lng + ", N" + airspaceInfo.lat + ")";
  793. content.push(loc + "\u4E3A\u4E2D\u5FC3");
  794. content.push("\u534A\u5F84" + airspaceInfo.radius + "\u7C73");
  795. content.push(getHeight(airspaceInfo.height, airspaceInfo.heightStandard, type));
  796. if (airspaceInfo.note)
  797. content.push("\u5907\u6CE8\uFF1A" + airspaceInfo.note);
  798. return content.join(',');
  799. }
  800. }
  801. exports.circleContent = circleContent;
  802. function flyingCenter(item) {
  803. if (item === void 0) { item = {}; }
  804. if (item == {}) {
  805. return "";
  806. }
  807. var pp = item;
  808. return ("(E" + Utils_1.latLngDecimalToDegrees(pp.lng) +
  809. ', ' +
  810. "N" + Utils_1.latLngDecimalToDegrees(pp.lat) + ")");
  811. }
  812. function lineContent(airspaceInfo, type) {
  813. if (type === void 0) { type = 3; }
  814. if (type == 5)
  815. return getAirspaceName(airspaceInfo);
  816. if ('airspace_name' in airspaceInfo) {
  817. var content = [];
  818. content.push("" + airspaceInfo.start_loc);
  819. if (type == 1 || type == 3)
  820. content.push("" + flyingCenter(airspaceInfo.start_point));
  821. content.push(" - ");
  822. content.push(getHeight(airspaceInfo.start_point.altitude, airspaceInfo.start_point.unit, type));
  823. var passing_points = airspaceInfo.passing_points;
  824. if (Array.isArray(passing_points)) {
  825. for (var i = 0; i < passing_points.length; i++) {
  826. var obj = passing_points[i];
  827. if (obj.point_type == Common_1["default"].pointTypes.point) {
  828. var pp = obj;
  829. var lat = Utils_1.latLngDecimalToDegrees(pp.lat);
  830. var lng = Utils_1.latLngDecimalToDegrees(pp.lng);
  831. content.push(" - " + pp.point_name);
  832. if (type == 1 || type == 3)
  833. content.push("(E" + lng + ", N" + lat + ")");
  834. }
  835. else if (obj.point_type == Common_1["default"].pointTypes.nav) {
  836. var pp = obj;
  837. var lat = Utils_1.latLngDecimalToDegrees(pp.lat);
  838. var lng = Utils_1.latLngDecimalToDegrees(pp.lng);
  839. content.push(" - " + pp.point_code);
  840. if (type == 1 || type == 3)
  841. content.push("(E" + lng + ", N" + lat + ")");
  842. }
  843. else {
  844. var pp = obj;
  845. content.push(" - " + pp.air_route_code);
  846. }
  847. if (obj.altitude) {
  848. content.push(" - " + getHeight(obj.altitude, obj.unit, type));
  849. }
  850. }
  851. }
  852. content.push(" - " + airspaceInfo.end_loc);
  853. if (type == 1 || type == 3)
  854. content.push("" + flyingCenter(airspaceInfo.end_point));
  855. if (Utils_1.isSafeString(airspaceInfo.airline_width)) {
  856. content.push("\uFF0C\u5BBD\u5EA6\uFF1A" + airspaceInfo.airline_width + "\u7C73");
  857. }
  858. if (Utils_1.isSafeString(airspaceInfo.note)) {
  859. content.push("\uFF0C\u5907\u6CE8\uFF1A " + airspaceInfo.note);
  860. }
  861. var result = content.join("");
  862. return result;
  863. }
  864. else {
  865. var content = [];
  866. content.push("" + airspaceInfo.dep.addr);
  867. if (type == 1 || type == 3)
  868. content.push("(E" + airspaceInfo.dep.lng + ", N" + airspaceInfo.dep.lat + ")");
  869. content.push(" - " + getHeight(airspaceInfo.dep.height, airspaceInfo.dep.heightStandard, type));
  870. if (Array.isArray(airspaceInfo.passPoints)) {
  871. var length_1 = airspaceInfo.passPoints.length;
  872. for (var i = 0; i < length_1; i++) {
  873. var obj = airspaceInfo.passPoints[i];
  874. if (obj.pointType == Common_1["default"].pointTypes.point) {
  875. var pp = obj;
  876. content.push(" - " + pp.addr);
  877. if (type == 1 || type == 3)
  878. content.push("(E" + pp.lng + ", N" + pp.lat + ")");
  879. }
  880. else if (obj.pointType == Common_1["default"].pointTypes.nav) {
  881. var pp = obj;
  882. content.push(" - " + pp.pointCode);
  883. if (type == 1 || type == 3)
  884. content.push("(E" + pp.lng + ", N" + pp.lat + ")");
  885. }
  886. else {
  887. var pp = obj;
  888. content.push(" - " + pp.airlineCode);
  889. }
  890. if (obj.height) {
  891. content.push(" - " + getHeight(obj.height, obj.heightStandard, type));
  892. }
  893. }
  894. }
  895. content.push(" - " + airspaceInfo.arrive.addr);
  896. if (type == 1 || type == 3)
  897. content.push("(E" + airspaceInfo.arrive.lng + ", N" + airspaceInfo.arrive.lat + ")");
  898. if (airspaceInfo.airlineWidth) {
  899. content.push("\uFF0C\u5BBD\u5EA6\uFF1A" + airspaceInfo.airlineWidth + "\u7C73");
  900. }
  901. if (airspaceInfo.note)
  902. content.push("\uFF0C\u5907\u6CE8\uFF1A" + airspaceInfo.note);
  903. return content.join('');
  904. }
  905. }
  906. exports.lineContent = lineContent;
  907. function polygonContent(airspaceInfo, type) {
  908. if (type === void 0) { type = 3; }
  909. if (type == 5)
  910. return getAirspaceName(airspaceInfo);
  911. if ('airspace_name' in airspaceInfo) {
  912. var res = [];
  913. var points = airspaceInfo.points;
  914. for (var i = 0; i < points.length; i++) {
  915. var c = "" + (points[i].addr ? points[i].addr : '');
  916. if (type == 1 || type == 3)
  917. c += "(E" + Utils_1.latLngDecimalToDegrees(points[i].lng) + ", N" + Utils_1.latLngDecimalToDegrees(points[i].lat) + ")";
  918. res.push(c);
  919. }
  920. var content = [res.join('、')];
  921. content.push(airspaceInfo.points.length + "\u70B9\u8FDE\u7EBF\u8303\u56F4\u5185");
  922. content.push("\uFF0C" + getHeight(airspaceInfo.altitude, airspaceInfo.unit, type));
  923. if (Utils_1.isSafeString(airspaceInfo.note)) {
  924. content.push("\uFF0C\u5907\u6CE8\uFF1A" + airspaceInfo.note);
  925. }
  926. return content.join('');
  927. }
  928. else {
  929. var content = [];
  930. var length_2 = airspaceInfo.polygonPoints.length;
  931. for (var i = 0; i < length_2; i++) {
  932. var obj = airspaceInfo.polygonPoints[i];
  933. var c = "" + (obj.addr ? obj.addr : '');
  934. if (type == 1 || type == 3)
  935. c += "(E" + obj.lng + ", N" + obj.lat + ")";
  936. content.push(c);
  937. }
  938. var cc = content.join('、') + (length_2 + "\u70B9\u8FDE\u7EBF\u8303\u56F4\u5185");
  939. cc += "\uFF0C" + getHeight(airspaceInfo.height, airspaceInfo.heightStandard, type);
  940. if (airspaceInfo.note)
  941. cc = content + "\uFF0C\u5907\u6CE8\uFF1A" + airspaceInfo.note;
  942. return cc;
  943. }
  944. }
  945. exports.polygonContent = polygonContent;