Utils.js 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980
  1. import JSZip from "jszip";
  2. import JSZipUtils from "jszip-utils";
  3. import { XMLParser, XMLBuilder, XMLValidator } from "fast-xml-parser";
  4. // import { ACTION_ITEM_LIST } from "@/constants/action-item";
  5. // import { params as actionParams } from "@/constants/action-function-params";
  6. import { UUID } from "@/utils/Utils";
  7. /**
  8. * @description 航线template示例文件
  9. */
  10. // 有机巢的用这个模板 m3TD
  11. export let inclinetemplate2 = {
  12. Document: {
  13. "wpml:author": 13874958346,
  14. "wpml:createTime": 1688652646205,
  15. "wpml:updateTime": 1688978993216,
  16. "wpml:missionConfig": {
  17. "wpml:flyToWaylineMode": "safely",
  18. "wpml:finishAction": "goHome",
  19. "wpml:exitOnRCLost": "goContinue",
  20. "wpml:executeRCLostAction": "goBack",
  21. "wpml:takeOffSecurityHeight": 20,
  22. "wpml:takeOffRefPoint": "28.192009,113.058389,16.581492",
  23. "wpml:takeOffRefPointAGLHeight": 0,
  24. "wpml:globalTransitionalSpeed": 15,
  25. "wpml:globalRTHHeight": 100,
  26. "wpml:droneInfo": {
  27. "wpml:droneEnumValue": 91,
  28. "wpml:droneSubEnumValue": 1,
  29. },
  30. "wpml:payloadInfo": {
  31. "wpml:payloadEnumValue": 81,
  32. "wpml:payloadSubEnumValue": 2,
  33. "wpml:payloadPositionIndex": 0,
  34. },
  35. },
  36. Folder: {
  37. "wpml:templateType": "mapping3d",
  38. "wpml:templateId": 0,
  39. "wpml:waylineCoordinateSysParam": {
  40. "wpml:coordinateMode": "WGS84",
  41. 'wpml:heightMode': 'EGM96',
  42. 'wpml:globalShootHeight': 102.2,
  43. 'wpml:surfaceFollowModeEnable': 1,
  44. 'wpml:isRealtimeSurfaceFollow': 0,
  45. 'wpml:surfaceRelativeHeight': 102.2,
  46. 'wpml:dsmFile': 'wpmz/res/dsm/wgs84_ASTGTMV003_N28E112_dem_9.tif',
  47. },
  48. 'wpml:autoFlightSpeed': 15,
  49. Placemark:
  50. {
  51. 'wpml:caliFlightEnable': 0,
  52. 'wpml:inclinedGimbalPitch': 45,
  53. 'wpml:shootType': 'time',
  54. 'wpml:direction': 0,
  55. 'wpml:margin': 0,
  56. 'wpml:inclinedFlightSpeed': 12,
  57. 'wpml:efficiencyFlightModeEnable': 0,
  58. 'wpml:overlap': {
  59. 'wpml:orthoCameraOverlapH': 80,
  60. 'wpml:orthoCameraOverlapW': 70,
  61. 'wpml:inclinedCameraOverlapH': 80,
  62. 'wpml:inclinedCameraOverlapW': 70
  63. },
  64. 'Polygon': {
  65. 'outerBoundaryIs': {
  66. 'LinearRing': {
  67. 'coordinates': ''
  68. }
  69. }
  70. },
  71. 'wpml:ellipsoidHeight': 102.2,
  72. 'wpml:height': 102.2,
  73. },
  74. "wpml:payloadParam": {
  75. "wpml:payloadPositionIndex": 0,
  76. "wpml:focusMode": "firstPoint",
  77. "wpml:meteringMode": "average",
  78. "wpml:returnMode": "singleReturnFirst",
  79. "wpml:samplingRate": 240000,
  80. "wpml:scanningMode": "repetitive",
  81. "wpml:imageFormat": "visable,ir",
  82. },
  83. },
  84. },
  85. }
  86. export let inclinetemplate = {
  87. Document: {
  88. "wpml:missionConfig": {
  89. "wpml:flyToWaylineMode": "safely",
  90. "wpml:finishAction": "goHome",
  91. "wpml:exitOnRCLost": "goContinue",
  92. "wpml:executeRCLostAction": "goBack",
  93. "wpml:takeOffSecurityHeight": 20,
  94. "wpml:globalTransitionalSpeed": 15,
  95. "wpml:globalRTHHeight": 100,
  96. 'wpml:waylineAvoidLimitAreaMode': 0,
  97. "wpml:droneInfo": {
  98. "wpml:droneEnumValue": 91,
  99. "wpml:droneSubEnumValue": 1,
  100. },
  101. "wpml:payloadInfo": {
  102. "wpml:payloadEnumValue": 81,
  103. "wpml:payloadSubEnumValue": 2,
  104. "wpml:payloadPositionIndex": 0,
  105. },
  106. },
  107. Folder: [{
  108. "wpml:templateId": 0,
  109. "wpml:autoFlightSpeed": 10,
  110. "wpml:executeHeightMode": "WGS84",
  111. "wpml:waylineId": 0,
  112. "wpml:startActionGroup": {
  113. "wpml:action": [{
  114. "wpml:actionId": 0,
  115. "wpml:actionActuatorFunc": "gimbalRotate",
  116. 'wpml:actionActuatorFuncParam': {
  117. 'wpml:gimbalHeadingYawBase': 'aircraft',
  118. 'wpml:gimbalRotateMode': 'absoluteAngle',
  119. 'wpml:gimbalPitchRotateEnable': 1,
  120. 'wpml:gimbalPitchRotateAngle': -90,
  121. 'wpml:gimbalRollRotateEnable': 0,
  122. 'wpml:gimbalRollRotateAngle': 0,
  123. 'wpml:gimbalYawRotateEnable': 1,
  124. 'wpml:gimbalYawRotateAngle': 0,
  125. 'wpml:gimbalRotateTimeEnable': 0,
  126. 'wpml:gimbalRotateTime': 10,
  127. 'wpml:payloadPositionIndex': 0,
  128. }
  129. },
  130. {
  131. "wpml:actionId": 1,
  132. "wpml:actionActuatorFunc": "hover",
  133. 'wpml:actionActuatorFuncParam': {
  134. 'wpml:hoverTime': 0.5,
  135. }
  136. },
  137. {
  138. "wpml:actionId": 2,
  139. "wpml:actionActuatorFunc": "setFocusType",
  140. 'wpml:actionActuatorFuncParam': {
  141. 'wpml:cameraFocusType': 'manual',
  142. 'wpml:payloadPositionIndex': 0
  143. }
  144. },
  145. {
  146. "wpml:actionId": 3,
  147. "wpml:actionActuatorFunc": "focus",
  148. 'wpml:actionActuatorFuncParam': {
  149. 'wpml:focusX': 0,
  150. 'wpml:focusY': 0,
  151. 'wpml:focusRegionWidth': 0,
  152. 'wpml:focusRegionHeight': 0,
  153. 'wpml:isPointFocus': 0,
  154. 'wpml:isInfiniteFocus': 1,
  155. 'wpml:payloadPositionIndex': 0
  156. }
  157. },
  158. {
  159. "wpml:actionId": 4,
  160. "wpml:actionActuatorFunc": "hover",
  161. 'wpml:actionActuatorFuncParam': {
  162. 'wpml:hoverTime': 1,
  163. }
  164. }
  165. ]
  166. },
  167. Placemark: [],
  168. // "wpml:payloadParam": {
  169. // "wpml:payloadPositionIndex": 0,
  170. // "wpml:focusMode": "firstPoint",
  171. // "wpml:meteringMode": "average",
  172. // "wpml:returnMode": "singleReturnFirst",
  173. // "wpml:samplingRate": 240000,
  174. // "wpml:scanningMode": "repetitive",
  175. // "wpml:imageFormat": "visable,ir",
  176. // },
  177. },
  178. {
  179. "wpml:templateId": 0,
  180. "wpml:autoFlightSpeed": 10,
  181. "wpml:executeHeightMode": "WGS84",
  182. "wpml:waylineId": 0,
  183. "wpml:startActionGroup": {
  184. "wpml:action": [{
  185. "wpml:actionId": 0,
  186. "wpml:actionActuatorFunc": "gimbalRotate",
  187. 'wpml:actionActuatorFuncParam': {
  188. 'wpml:gimbalHeadingYawBase': 'aircraft',
  189. 'wpml:gimbalRotateMode': 'absoluteAngle',
  190. 'wpml:gimbalPitchRotateEnable': 1,
  191. 'wpml:gimbalPitchRotateAngle': -90,
  192. 'wpml:gimbalRollRotateEnable': 0,
  193. 'wpml:gimbalRollRotateAngle': 0,
  194. 'wpml:gimbalYawRotateEnable': 1,
  195. 'wpml:gimbalYawRotateAngle': 0,
  196. 'wpml:gimbalRotateTimeEnable': 0,
  197. 'wpml:gimbalRotateTime': 10,
  198. 'wpml:payloadPositionIndex': 0,
  199. }
  200. },
  201. {
  202. "wpml:actionId": 1,
  203. "wpml:actionActuatorFunc": "hover",
  204. 'wpml:actionActuatorFuncParam': {
  205. 'wpml:hoverTime': 0.5,
  206. }
  207. },
  208. {
  209. "wpml:actionId": 2,
  210. "wpml:actionActuatorFunc": "setFocusType",
  211. 'wpml:actionActuatorFuncParam': {
  212. 'wpml:cameraFocusType': 'manual',
  213. 'wpml:payloadPositionIndex': 0
  214. }
  215. },
  216. {
  217. "wpml:actionId": 3,
  218. "wpml:actionActuatorFunc": "focus",
  219. 'wpml:actionActuatorFuncParam': {
  220. 'wpml:focusX': 0,
  221. 'wpml:focusY': 0,
  222. 'wpml:focusRegionWidth': 0,
  223. 'wpml:focusRegionHeight': 0,
  224. 'wpml:isPointFocus': 0,
  225. 'wpml:isInfiniteFocus': 1,
  226. 'wpml:payloadPositionIndex': 0
  227. }
  228. },
  229. {
  230. "wpml:actionId": 4,
  231. "wpml:actionActuatorFunc": "hover",
  232. 'wpml:actionActuatorFuncParam': {
  233. 'wpml:hoverTime': 1,
  234. }
  235. }
  236. ]
  237. },
  238. Placemark: [],
  239. // "wpml:payloadParam": {
  240. // "wpml:payloadPositionIndex": 0,
  241. // "wpml:focusMode": "firstPoint",
  242. // "wpml:meteringMode": "average",
  243. // "wpml:returnMode": "singleReturnFirst",
  244. // "wpml:samplingRate": 240000,
  245. // "wpml:scanningMode": "repetitive",
  246. // "wpml:imageFormat": "visable,ir",
  247. // },
  248. },
  249. {
  250. "wpml:templateId": 0,
  251. "wpml:autoFlightSpeed": 10,
  252. "wpml:executeHeightMode": "WGS84",
  253. "wpml:waylineId": 0,
  254. "wpml:startActionGroup": {
  255. "wpml:action": [{
  256. "wpml:actionId": 0,
  257. "wpml:actionActuatorFunc": "gimbalRotate",
  258. 'wpml:actionActuatorFuncParam': {
  259. 'wpml:gimbalHeadingYawBase': 'aircraft',
  260. 'wpml:gimbalRotateMode': 'absoluteAngle',
  261. 'wpml:gimbalPitchRotateEnable': 1,
  262. 'wpml:gimbalPitchRotateAngle': -90,
  263. 'wpml:gimbalRollRotateEnable': 0,
  264. 'wpml:gimbalRollRotateAngle': 0,
  265. 'wpml:gimbalYawRotateEnable': 1,
  266. 'wpml:gimbalYawRotateAngle': 0,
  267. 'wpml:gimbalRotateTimeEnable': 0,
  268. 'wpml:gimbalRotateTime': 10,
  269. 'wpml:payloadPositionIndex': 0,
  270. }
  271. },
  272. {
  273. "wpml:actionId": 1,
  274. "wpml:actionActuatorFunc": "hover",
  275. 'wpml:actionActuatorFuncParam': {
  276. 'wpml:hoverTime': 0.5,
  277. }
  278. },
  279. {
  280. "wpml:actionId": 2,
  281. "wpml:actionActuatorFunc": "setFocusType",
  282. 'wpml:actionActuatorFuncParam': {
  283. 'wpml:cameraFocusType': 'manual',
  284. 'wpml:payloadPositionIndex': 0
  285. }
  286. },
  287. {
  288. "wpml:actionId": 3,
  289. "wpml:actionActuatorFunc": "focus",
  290. 'wpml:actionActuatorFuncParam': {
  291. 'wpml:focusX': 0,
  292. 'wpml:focusY': 0,
  293. 'wpml:focusRegionWidth': 0,
  294. 'wpml:focusRegionHeight': 0,
  295. 'wpml:isPointFocus': 0,
  296. 'wpml:isInfiniteFocus': 1,
  297. 'wpml:payloadPositionIndex': 0
  298. }
  299. },
  300. {
  301. "wpml:actionId": 4,
  302. "wpml:actionActuatorFunc": "hover",
  303. 'wpml:actionActuatorFuncParam': {
  304. 'wpml:hoverTime': 1,
  305. }
  306. }
  307. ]
  308. },
  309. Placemark: [],
  310. // "wpml:payloadParam": {
  311. // "wpml:payloadPositionIndex": 0,
  312. // "wpml:focusMode": "firstPoint",
  313. // "wpml:meteringMode": "average",
  314. // "wpml:returnMode": "singleReturnFirst",
  315. // "wpml:samplingRate": 240000,
  316. // "wpml:scanningMode": "repetitive",
  317. // "wpml:imageFormat": "visable,ir",
  318. // },
  319. },
  320. {
  321. "wpml:templateId": 0,
  322. "wpml:autoFlightSpeed": 10,
  323. "wpml:executeHeightMode": "WGS84",
  324. "wpml:waylineId": 0,
  325. "wpml:startActionGroup": {
  326. "wpml:action": [{
  327. "wpml:actionId": 0,
  328. "wpml:actionActuatorFunc": "gimbalRotate",
  329. 'wpml:actionActuatorFuncParam': {
  330. 'wpml:gimbalHeadingYawBase': 'aircraft',
  331. 'wpml:gimbalRotateMode': 'absoluteAngle',
  332. 'wpml:gimbalPitchRotateEnable': 1,
  333. 'wpml:gimbalPitchRotateAngle': -90,
  334. 'wpml:gimbalRollRotateEnable': 0,
  335. 'wpml:gimbalRollRotateAngle': 0,
  336. 'wpml:gimbalYawRotateEnable': 1,
  337. 'wpml:gimbalYawRotateAngle': 0,
  338. 'wpml:gimbalRotateTimeEnable': 0,
  339. 'wpml:gimbalRotateTime': 10,
  340. 'wpml:payloadPositionIndex': 0,
  341. }
  342. },
  343. {
  344. "wpml:actionId": 1,
  345. "wpml:actionActuatorFunc": "hover",
  346. 'wpml:actionActuatorFuncParam': {
  347. 'wpml:hoverTime': 0.5,
  348. }
  349. },
  350. {
  351. "wpml:actionId": 2,
  352. "wpml:actionActuatorFunc": "setFocusType",
  353. 'wpml:actionActuatorFuncParam': {
  354. 'wpml:cameraFocusType': 'manual',
  355. 'wpml:payloadPositionIndex': 0
  356. }
  357. },
  358. {
  359. "wpml:actionId": 3,
  360. "wpml:actionActuatorFunc": "focus",
  361. 'wpml:actionActuatorFuncParam': {
  362. 'wpml:focusX': 0,
  363. 'wpml:focusY': 0,
  364. 'wpml:focusRegionWidth': 0,
  365. 'wpml:focusRegionHeight': 0,
  366. 'wpml:isPointFocus': 0,
  367. 'wpml:isInfiniteFocus': 1,
  368. 'wpml:payloadPositionIndex': 0
  369. }
  370. },
  371. {
  372. "wpml:actionId": 4,
  373. "wpml:actionActuatorFunc": "hover",
  374. 'wpml:actionActuatorFuncParam': {
  375. 'wpml:hoverTime': 1,
  376. }
  377. }
  378. ]
  379. },
  380. Placemark: [],
  381. // "wpml:payloadParam": {
  382. // "wpml:payloadPositionIndex": 0,
  383. // "wpml:focusMode": "firstPoint",
  384. // "wpml:meteringMode": "average",
  385. // "wpml:returnMode": "singleReturnFirst",
  386. // "wpml:samplingRate": 240000,
  387. // "wpml:scanningMode": "repetitive",
  388. // "wpml:imageFormat": "visable,ir",
  389. // },
  390. },
  391. {
  392. "wpml:templateId": 0,
  393. "wpml:autoFlightSpeed": 10,
  394. "wpml:executeHeightMode": "WGS84",
  395. "wpml:waylineId": 0,
  396. "wpml:startActionGroup": {
  397. "wpml:action": [{
  398. "wpml:actionId": 0,
  399. "wpml:actionActuatorFunc": "gimbalRotate",
  400. 'wpml:actionActuatorFuncParam': {
  401. 'wpml:gimbalHeadingYawBase': 'aircraft',
  402. 'wpml:gimbalRotateMode': 'absoluteAngle',
  403. 'wpml:gimbalPitchRotateEnable': 1,
  404. 'wpml:gimbalPitchRotateAngle': -90,
  405. 'wpml:gimbalRollRotateEnable': 0,
  406. 'wpml:gimbalRollRotateAngle': 0,
  407. 'wpml:gimbalYawRotateEnable': 1,
  408. 'wpml:gimbalYawRotateAngle': 0,
  409. 'wpml:gimbalRotateTimeEnable': 0,
  410. 'wpml:gimbalRotateTime': 10,
  411. 'wpml:payloadPositionIndex': 0,
  412. }
  413. },
  414. {
  415. "wpml:actionId": 1,
  416. "wpml:actionActuatorFunc": "hover",
  417. 'wpml:actionActuatorFuncParam': {
  418. 'wpml:hoverTime': 0.5,
  419. }
  420. },
  421. {
  422. "wpml:actionId": 2,
  423. "wpml:actionActuatorFunc": "setFocusType",
  424. 'wpml:actionActuatorFuncParam': {
  425. 'wpml:cameraFocusType': 'manual',
  426. 'wpml:payloadPositionIndex': 0
  427. }
  428. },
  429. {
  430. "wpml:actionId": 3,
  431. "wpml:actionActuatorFunc": "focus",
  432. 'wpml:actionActuatorFuncParam': {
  433. 'wpml:focusX': 0,
  434. 'wpml:focusY': 0,
  435. 'wpml:focusRegionWidth': 0,
  436. 'wpml:focusRegionHeight': 0,
  437. 'wpml:isPointFocus': 0,
  438. 'wpml:isInfiniteFocus': 1,
  439. 'wpml:payloadPositionIndex': 0
  440. }
  441. },
  442. {
  443. "wpml:actionId": 4,
  444. "wpml:actionActuatorFunc": "hover",
  445. 'wpml:actionActuatorFuncParam': {
  446. 'wpml:hoverTime': 1,
  447. }
  448. }
  449. ]
  450. },
  451. Placemark: [],
  452. // "wpml:payloadParam": {
  453. // "wpml:payloadPositionIndex": 0,
  454. // "wpml:focusMode": "firstPoint",
  455. // "wpml:meteringMode": "average",
  456. // "wpml:returnMode": "singleReturnFirst",
  457. // "wpml:samplingRate": 240000,
  458. // "wpml:scanningMode": "repetitive",
  459. // "wpml:imageFormat": "visable,ir",
  460. // },
  461. }],
  462. },
  463. };
  464. // 有机巢的用这个模板
  465. export let Havetemplate = {
  466. Document: {
  467. "wpml:missionConfig": {
  468. "wpml:flyToWaylineMode": "safely",
  469. "wpml:finishAction": "goHome",
  470. "wpml:exitOnRCLost": "executeLostAction",
  471. "wpml:executeRCLostAction": "goBack",
  472. "wpml:takeOffSecurityHeight": 20,
  473. "wpml:globalTransitionalSpeed": 15,
  474. "wpml:globalRTHHeight": 100,
  475. "wpml:droneInfo": {
  476. "wpml:droneEnumValue": 91,
  477. "wpml:droneSubEnumValue": 1,
  478. },
  479. "wpml:payloadInfo": {
  480. "wpml:payloadEnumValue": 81,
  481. "wpml:payloadSubEnumValue": 2,
  482. "wpml:payloadPositionIndex": 0,
  483. },
  484. },
  485. Folder: {
  486. "wpml:templateId": 0,
  487. "wpml:autoFlightSpeed": 10,
  488. "wpml:executeHeightMode": "relativeToStartPoint",
  489. "wpml:waylineId": 0,
  490. "wpml:globalWaypointHeadingParam": {
  491. "wpml:waypointHeadingMode": "followWayline",
  492. "wpml:waypointHeadingAngle": 0,
  493. "wpml:waypointPoiPoint": "0.000000,0.000000,0.000000",
  494. "wpml:waypointHeadingPathMode": "followBadArc",
  495. "wpml:waypointHeadingPoiIndex": 0,
  496. },
  497. "wpml:globalWaypointTurnMode": "toPointAndStopWithDiscontinuityCurvature",
  498. "wpml:globalUseStraightLine": 1,
  499. Placemark: [],
  500. // "wpml:payloadParam": {
  501. // "wpml:payloadPositionIndex": 0,
  502. // "wpml:focusMode": "firstPoint",
  503. // "wpml:meteringMode": "average",
  504. // "wpml:returnMode": "singleReturnFirst",
  505. // "wpml:samplingRate": 240000,
  506. // "wpml:scanningMode": "repetitive",
  507. // "wpml:imageFormat": "visable,ir",
  508. // },
  509. },
  510. },
  511. };
  512. export let template = {
  513. Document: {
  514. "wpml:author": 13874958346,
  515. "wpml:createTime": 1688652646205,
  516. "wpml:updateTime": 1688978993216,
  517. "wpml:missionConfig": {
  518. "wpml:flyToWaylineMode": "safely",
  519. "wpml:finishAction": "goHome",
  520. "wpml:exitOnRCLost": "executeLostAction",
  521. "wpml:executeRCLostAction": "goBack",
  522. "wpml:takeOffSecurityHeight": 20,
  523. "wpml:takeOffRefPoint": "28.192009,113.058389,16.581492",
  524. "wpml:takeOffRefPointAGLHeight": 0,
  525. "wpml:globalTransitionalSpeed": 15,
  526. "wpml:globalRTHHeight": 100,
  527. "wpml:droneInfo": {
  528. "wpml:droneEnumValue": 91,
  529. "wpml:droneSubEnumValue": 1,
  530. },
  531. "wpml:payloadInfo": {
  532. "wpml:payloadEnumValue": 81,
  533. "wpml:payloadSubEnumValue": 2,
  534. "wpml:payloadPositionIndex": 0,
  535. },
  536. },
  537. Folder: {
  538. "wpml:templateType": "waypoint",
  539. "wpml:templateId": 0,
  540. "wpml:waylineId": 0,
  541. "wpml:executeHeightMode": "relativeToStartPoint",
  542. "wpml:waylineCoordinateSysParam": {
  543. "wpml:coordinateMode": "WGS84",
  544. "wpml:heightMode": "relativeToStartPoint",
  545. },
  546. "wpml:autoFlightSpeed": 10,
  547. "wpml:globalHeight": 20,
  548. "wpml:caliFlightEnable": 0,
  549. "wpml:gimbalPitchMode": "manual",
  550. "wpml:globalWaypointHeadingParam": {
  551. "wpml:waypointHeadingMode": "followWayline",
  552. "wpml:waypointHeadingAngle": 0,
  553. "wpml:waypointPoiPoint": "0.000000,0.000000,0.000000",
  554. "wpml:waypointHeadingPathMode": "followBadArc",
  555. "wpml:waypointHeadingPoiIndex": 0,
  556. },
  557. "wpml:globalWaypointTurnMode": "toPointAndStopWithDiscontinuityCurvature",
  558. "wpml:globalUseStraightLine": 1,
  559. Placemark: [
  560. {
  561. "Point": {
  562. "coordinates": " 112.946808121,28.012694428"
  563. },
  564. "wpml:index": "0",
  565. "wpml:ellipsoidHeight": "20",
  566. "wpml:height": "20",
  567. "wpml:waypointSpeed": "5",
  568. "wpml:waypointHeadingParam": {
  569. "wpml:waypointHeadingMode": "followWayline",
  570. "wpml:waypointHeadingAngle": "0",
  571. "wpml:waypointPoiPoint": "0.000000,0.000000,0.000000",
  572. "wpml:waypointHeadingPathMode": "followBadArc",
  573. "wpml:waypointHeadingPoiIndex": "0"
  574. },
  575. "wpml:waypointTurnParam": {
  576. "wpml:waypointTurnMode": "toPointAndStopWithDiscontinuityCurvature",
  577. "wpml:waypointTurnDampingDist": 0
  578. },
  579. "wpml:useGlobalHeight": "1",
  580. "wpml:useGlobalSpeed": "1",
  581. "wpml:useGlobalHeadingParam": "1",
  582. "wpml:useGlobalTurnParam": "1",
  583. "wpml:useStraightLine": "1",
  584. "wpml:isRisky": "0"
  585. },
  586. ],
  587. "wpml:payloadParam": {
  588. "wpml:payloadPositionIndex": 0,
  589. "wpml:focusMode": "firstPoint",
  590. "wpml:meteringMode": "average",
  591. "wpml:returnMode": "singleReturnFirst",
  592. "wpml:samplingRate": 240000,
  593. "wpml:scanningMode": "repetitive",
  594. "wpml:imageFormat": "visable,ir",
  595. },
  596. },
  597. },
  598. };
  599. /**
  600. * @description 航线wayline示例文件
  601. */
  602. export let wayline = {
  603. Document: {
  604. "wpml:missionConfig": {
  605. "wpml:flyToWaylineMode": "safely",
  606. "wpml:finishAction": "goHome",
  607. "wpml:exitOnRCLost": "executeLostAction",
  608. "wpml:executeRCLostAction": "goBack",
  609. "wpml:takeOffSecurityHeight": 20,
  610. "wpml:globalTransitionalSpeed": 15,
  611. "wpml:globalRTHHeight": 100,
  612. "wpml:droneInfo": {
  613. "wpml:droneEnumValue": 91,
  614. "wpml:droneSubEnumValue": 0,
  615. },
  616. "wpml:payloadInfo": {
  617. "wpml:payloadEnumValue": 80,
  618. "wpml:payloadSubEnumValue": 0,
  619. "wpml:payloadPositionIndex": 0,
  620. },
  621. },
  622. Folder: {
  623. "wpml:templateId": 0,
  624. "wpml:executeHeightMode": "relativeToStartPoint",
  625. "wpml:waylineId": 0,
  626. "wpml:distance": 486.405029296875,
  627. "wpml:duration": 59.816535949707,
  628. "wpml:autoFlightSpeed": 10,
  629. Placemark: [],
  630. },
  631. },
  632. };
  633. /**
  634. * @description 读取kml路径
  635. * @param {String} kml kml路径
  636. */
  637. export function readKMZ(kml) {
  638. let promise = new Promise((resolve, reject) => {
  639. JSZipUtils.getBinaryContent(kml, (err, data) => {
  640. if (err) {
  641. console.error(err);
  642. reject(err);
  643. }
  644. const zip = new JSZip();
  645. // zip.loadAsync:解压
  646. zip.loadAsync(data).then(async (res) => {
  647. let kmls = [];
  648. for (const key in res.files) {
  649. if (Object.hasOwnProperty.call(res.files, key)) {
  650. const element = res.files[key];
  651. let content = await element.async("text");
  652. kmls.push(content);
  653. }
  654. }
  655. resolve(kmls);
  656. });
  657. });
  658. });
  659. return promise;
  660. }
  661. export function readKMZ2(kml) {
  662. let promise = new Promise((resolve, reject) => {
  663. const zip = new JSZip();
  664. // zip.loadAsync:解压
  665. zip.loadAsync(kml).then(async (zip) => {
  666. const fileName = "wpmz/waylines.wpml";
  667. return zip.file(fileName).async("string");
  668. }).then((wayline) => {
  669. const parser = new XMLParser();
  670. resolve(parser.parse(wayline));
  671. })
  672. });
  673. return promise;
  674. }
  675. /**
  676. * @description 将xml文件转为json
  677. * @param {xml} xml
  678. * @returns
  679. */
  680. export function parserXml2Json(xml) {
  681. const parser = new XMLParser();
  682. return parser.parse(xml);
  683. }
  684. /**
  685. * @description 导出航线文件
  686. * @param {object} template
  687. * @param {object} wayline
  688. */
  689. export async function writeWPMZ(template, wayline) {
  690. // JSZip示例
  691. const zip = new JSZip();
  692. // JSON2XML转换器实例
  693. const builder = new XMLBuilder({
  694. ignoreAttributes: false, // 保留键名原样
  695. }
  696. );
  697. let xmlPrefix = `<?xml version="1.0" encoding="UTF-8"?>
  698. <kml xmlns="http://www.opengis.net/kml/2.2" xmlns:wpml="http://www.dji.com/wpmz/1.0.6">`;
  699. let xmlSuffix = "</kml>";
  700. const processedJson1 = Object.keys(template).reduce((acc, key) => {
  701. const newKey = key.charAt(0).toUpperCase() + key.slice(1);
  702. acc[newKey] = template[key];
  703. return acc;
  704. }, {});
  705. const processedJson2 = Object.keys(wayline).reduce((acc, key) => {
  706. const newKey = key.charAt(0).toUpperCase() + key.slice(1);
  707. acc[newKey] = wayline[key];
  708. return acc;
  709. }, {});
  710. // 创建一个名为“wpmz”的文件夹
  711. const wpmzFolder = zip.folder("wpmz");
  712. //将名为“template.kml”的文件添加到“wpmz”文件夹
  713. wpmzFolder.file(
  714. "template.kml",
  715. xmlPrefix + builder.build(processedJson1) + xmlSuffix
  716. );
  717. wpmzFolder.file(
  718. "waylines.wpml",
  719. xmlPrefix + builder.build(processedJson2) + xmlSuffix
  720. );
  721. // 生成KML
  722. let content = await zip.generateAsync({ type: "blob" });
  723. return content;
  724. }
  725. export function getKMZ(data) {
  726. // console.log("新解析航线", data.url);
  727. //let ipPrefix = 'https://hunan-ib.chinatowercom.cn/file/2k-sc-file/';
  728. //let ipPrefix = 'https://hunan-ib.chinatowercom.cn/file/2k-test-file/';
  729. //let ipPrefix = 'http://120.76.142.34:19000/cloud-bucket/';
  730. //let ipPrefix = 'https://gong001.oss-cn-hangzhou.aliyuncs.com/';
  731. // let ipSub = '';
  732. // const randomParam = '?t=' + new Date().getTime();
  733. // let encodeurl = encodeURI(ipPrefix + url + ipSub + randomParam);
  734. let encodeurl = data.url;
  735. return new Promise(function (resolve, reject) {
  736. // Step 1: Request the file
  737. JSZipUtils.getBinaryContent(encodeurl, function (err, data) {
  738. if (err) {
  739. reject(err);
  740. } else {
  741. resolve(data);
  742. }
  743. });
  744. })
  745. .then(function (files) {
  746. // Step 2: Unzip the file
  747. return JSZip.loadAsync(files);
  748. })
  749. .then(function (zip) {
  750. // Step 3: Get the file contents
  751. // const fileName = Object.keys(zip.files)[0];
  752. const fileName = "wpmz/template.kml";
  753. return zip.file(fileName).async("string");
  754. })
  755. .then((wayline) => {
  756. const parser = new XMLParser();
  757. return parser.parse(wayline)
  758. });
  759. }
  760. // 添加结束等时/等距拍照结束动作(整条航线)
  761. export const addIntervalStop = (template) => {
  762. // debugger;
  763. // 获取等时/等距拍照的尾数
  764. function getEndIndex(actionGroup) {
  765. if (
  766. actionGroup["wpml:action"] &&
  767. actionGroup?.["wpml:actionTrigger"]?.["wpml:actionTriggerType"] &&
  768. (actionGroup["wpml:actionTrigger"]["wpml:actionTriggerType"] ==
  769. "multipleTiming" ||
  770. actionGroup["wpml:actionTrigger"]["wpml:actionTriggerType"] ==
  771. "multipleDistance")
  772. ) {
  773. let endIndex = actionGroup["wpml:actionGroupEndIndex"];
  774. if (endIndex) {
  775. return endIndex;
  776. }
  777. }
  778. return null;
  779. }
  780. // 是否有reachPoint的actionGroup
  781. function hasReachPointActionGroup(actionGroup) {
  782. if (actionGroup.constructor == Object) {
  783. if (
  784. actionGroup?.["wpml:actionTrigger"]?.["wpml:actionTriggerType"] &&
  785. actionGroup["wpml:actionTrigger"]["wpml:actionTriggerType"] ==
  786. "reachPoint"
  787. ) {
  788. return actionGroup;
  789. }
  790. } else {
  791. actionGroup.forEach((group) => {
  792. if (
  793. group?.["wpml:actionTrigger"]?.["wpml:actionTriggerType"] &&
  794. group["wpml:actionTrigger"]["wpml:actionTriggerType"] == "reachPoint"
  795. ) {
  796. return group;
  797. }
  798. });
  799. }
  800. return false;
  801. }
  802. // 添加结束等时/等距拍照结束动作(具体的某一个)
  803. function addIntervalStopAction(endIndex) {
  804. // 构建动作
  805. let item = ACTION_ITEM_LIST.find((action) => {
  806. return action.type == "intervalStop";
  807. });
  808. let param = actionParams[item.type] || {};
  809. param["wpml:actionUUID"] = UUID();
  810. // 动作
  811. let intervalStopAction = {
  812. id: UUID(),
  813. "wpml:actionActuatorFunc": item.type,
  814. "wpml:actionActuatorFuncParam": param,
  815. };
  816. let stopPlacemark = template.Document.Folder.Placemark[endIndex];
  817. if (stopPlacemark && stopPlacemark["wpml:actionGroup"]) {
  818. let endActionGroup = hasReachPointActionGroup(
  819. stopPlacemark["wpml:actionGroup"]
  820. );
  821. if (endActionGroup) {
  822. if (endActionGroup["wpml:action"]) {
  823. if (endActionGroup["wpml:action"].constructor == Object) {
  824. endActionGroup["wpml:action"] = [
  825. endActionGroup["wpml:action"],
  826. intervalStopAction,
  827. ];
  828. } else {
  829. endActionGroup["wpml:action"].push(intervalStopAction);
  830. }
  831. } else {
  832. endActionGroup["wpml:action"] = intervalStopAction;
  833. }
  834. } else {
  835. if (stopPlacemark["wpml:actionGroup"].constructor == Object) {
  836. stopPlacemark["wpml:actionGroup"] = [
  837. stopPlacemark["wpml:actionGroup"],
  838. {
  839. "wpml:actionGroupId": 1,
  840. "wpml:actionGroupStartIndex": endIndex,
  841. "wpml:actionGroupEndIndex": endIndex,
  842. "wpml:actionGroupMode": "sequence",
  843. "wpml:actionTrigger": {
  844. "wpml:actionTriggerType": "reachPoint",
  845. },
  846. "wpml:action": intervalStopAction,
  847. },
  848. ];
  849. } else {
  850. stopPlacemark["wpml:actionGroup"].push({
  851. "wpml:actionGroupId": stopPlacemark["wpml:actionGroup"].length,
  852. "wpml:actionGroupStartIndex": endIndex,
  853. "wpml:actionGroupEndIndex": endIndex,
  854. "wpml:actionGroupMode": "sequence",
  855. "wpml:actionTrigger": {
  856. "wpml:actionTriggerType": "reachPoint",
  857. },
  858. "wpml:action": intervalStopAction,
  859. });
  860. }
  861. }
  862. } else {
  863. stopPlacemark["wpml:actionGroup"] = {
  864. "wpml:actionGroupId": 0,
  865. "wpml:actionGroupStartIndex": endIndex,
  866. "wpml:actionGroupEndIndex": endIndex,
  867. "wpml:actionGroupMode": "sequence",
  868. "wpml:actionTrigger": {
  869. "wpml:actionTriggerType": "reachPoint",
  870. },
  871. "wpml:action": intervalStopAction,
  872. };
  873. }
  874. }
  875. for (
  876. let index = 0;
  877. index < template.Document.Folder.Placemark.length;
  878. index++
  879. ) {
  880. let Placemark = template.Document.Folder.Placemark[index];
  881. if (Placemark["wpml:actionGroup"]) {
  882. if (Placemark["wpml:actionGroup"].constructor == Object) {
  883. let endIndex = getEndIndex(Placemark["wpml:actionGroup"]);
  884. if (endIndex) {
  885. addIntervalStopAction(endIndex);
  886. }
  887. } else {
  888. Placemark["wpml:actionGroup"].forEach(
  889. (actionGroup, actionGroupIndex) => {
  890. let endIndex = getEndIndex(actionGroup);
  891. if (endIndex) {
  892. addIntervalStopAction(endIndex);
  893. }
  894. }
  895. );
  896. }
  897. }
  898. }
  899. };