mapJK.vue 60 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957
  1. <template>
  2. <div id="map_jk">
  3. <div id="mapDiv" ref="map">
  4. <div id="viewDiv" ref="view">
  5. <div id="menu" class="esri-widget">
  6. </div>
  7. </div>
  8. <div id="viewDiv_2D" ref="view_2D">
  9. <div id="menu" class="esri-widget">
  10. </div>
  11. </div>
  12. <div id = "overviewDiv" ref = "overview" >
  13. </div>
  14. </div>
  15. </div>
  16. </template>
  17. <script>
  18. import $ from 'jquery';
  19. import {getCurrentInstance, onMounted} from "vue";
  20. import SetMapConfig from "../units/map/SetMapConfig.js"
  21. import InitMap from "../units/map/InitMap.js";
  22. import AddBaseMapLayer from "../units/map/AddBaseMapLayer.js";
  23. import AddSingleLayer from "../units/map/AddSingleLayer.js";
  24. import WaterEffect from "../units/map/WaterEffect.js";
  25. import Measurement from "../units/map/Measurement.js";
  26. import SunshineAnalysis from "../units/map/SunshineAnalysis.js";
  27. import AddPointEvent from "../units/map/AddPointEvent.js";
  28. import SetPopupOptions from "../units/map/SetPopuopOptions";
  29. import AddScaleEvent from "../units/map/AddScaleEvent";
  30. import ViewShedAnalysisWidget from "../units/map/ViewShedAnalysis.js";
  31. import AddLightBallEvent from "../units/map/AddLightBallEvent.js";
  32. import AddThreeGridEvent from "../units/map/addThreeGridEvent.js";
  33. import LimitHeightAnalysis from "../units/map/LimitHeightAnalysis.js";
  34. import SetLocation from "../units/map/SetLocation.js";
  35. import GeometryMeshPrismEffect from "../units/map/GeometryMeshPrismEffect.js";
  36. import ReRenderingEvent from "../units/map/ReRenderingEvent.js";
  37. import PathPipeEvent from "../units/map/PathPipeEvent.js";
  38. import FlyGLTFEvent from "../units/map/FlyGLTFEvent.js";
  39. import AddDrawEvent from "../units/map/addDrawEvent.js";
  40. import SymbolPathPipeEvent from "../units/map/SymbolPathPipeEvent.js";
  41. import SymbolPointCubeEvent from "../units/map/SymbolPointCubeEvent.js";
  42. import AddThreeCubeEvent from "../units/map/AddThreeCubeEvent.js";
  43. import AddThreeCubeDetailEvent from "../units/map/AddThreeCubeDetailEvent.js";
  44. import AddThreeNetEvent from "../units/map/AddThreeNetEvent.js";
  45. import ws from 'ws';
  46. import Path from '../config/path_wjc.json'
  47. import routeList from '../config/routeList.json'
  48. import {
  49. getAvoidRoute,
  50. getBuildingPoint,
  51. getNoFlyPointInterface, getPowerInterface, getPowerPoint,
  52. getRiverPointInterface,
  53. getRoadPointInterface, gridBaseInfo
  54. } from "../service/http.js";
  55. import FeaturePointsPlottingEvent from "../units/map/FeaturePointsPlottingEvent.js";
  56. import FeaturePolygonPlottingEvent from "../units/map/FeaturePolygonPlottingEvent.js";
  57. import HeatMap from "../units/map/HeatMap.js";
  58. export default {
  59. name: "mapJK",
  60. setup(){
  61. let socket = null;
  62. let virtualSocket = null;
  63. const ctx = getCurrentInstance();
  64. const bus = ctx?.appContext.config.globalProperties.$bus;
  65. let MapReady = null;
  66. let m_spatialReference = null;
  67. let m_fullExtent = null;
  68. let m_initialExtent = null;
  69. let m_view;
  70. let m_map;
  71. let measureWidget = null;
  72. let sunshineWidget = null;
  73. let m_handles = [];
  74. let viewShedAnalysisWidget = null;
  75. let addLightBallEvent = null;
  76. let addThreeGridEvent = null;
  77. let addThreeCubeEvent = null;
  78. //let addThreeCubeDetailEvent = null;
  79. let powerDataList = [];
  80. let addThreeCubeDetailInstance = {};
  81. let addThreeNetEvent = null;
  82. let limitHeightAnalysisEvent = null;
  83. let reRenderingEvent = null;
  84. let pathPipeInstance = {};
  85. let flyGLTFInstances = {};
  86. let addDrawEvent = null;
  87. let draw_GeometryMeshPrismEffectEvent = null;
  88. let symbolPathPipeEvent = null;
  89. let symbolPointCubeEvent = null;
  90. let featurePointsPlottingEvent = null;
  91. let currentShowGridId = null;
  92. onMounted(() =>{
  93. bus.on('CreateMap',() =>{
  94. MapReady = $.Deferred();
  95. createMap();
  96. $.when((MapReady).done(()=>{
  97. //发送消息
  98. bus.emit('SendMessage',{
  99. action:"MapIsReady",
  100. data:{
  101. "message":"地图初始化完成"
  102. }
  103. })
  104. }))
  105. })
  106. //调用方法
  107. bus.on('InvokeMethod',(data) =>{
  108. invokeMethod(data);
  109. })
  110. function createMap(){
  111. let setMapConfig = new SetMapConfig({
  112. m_spatialReference,
  113. m_fullExtent,
  114. m_initialExtent,
  115. m_handles
  116. })
  117. m_spatialReference = setMapConfig.m_spatialReference;
  118. m_fullExtent = setMapConfig.m_fullExtent;
  119. m_initialExtent = setMapConfig.m_initialExtent;
  120. m_handles = setMapConfig.m_handles;
  121. let initMap = new InitMap({
  122. m_map,
  123. m_view,
  124. m_spatialReference,
  125. bus
  126. });
  127. m_map = initMap.m_map;
  128. m_view = initMap.m_view;
  129. }
  130. function invokeMethod(data){
  131. //后续设置验证token
  132. runMethod(data);
  133. }
  134. function runMethod(data){
  135. let methodname = data.methodname;
  136. let params = data.params;
  137. if(typeof (params) != "string"&& params)
  138. params = eval(params);
  139. switch (methodname) {
  140. case "SetBackground":
  141. setBackground(params);
  142. break;
  143. case "SetLocation":
  144. setLocation(params);
  145. break;
  146. case "AddBaseMapLayer":
  147. addBaseMapLayer(params);
  148. break;
  149. case "AddSingleLayer":
  150. addSingleLayer(params);
  151. break;
  152. case "ReRendering":
  153. reRendering(params);
  154. break;
  155. case "WaterEffect":
  156. waterEffect(params);
  157. break;
  158. case "HeatMap":
  159. heatMap(params);
  160. break;
  161. case "Measurement":
  162. measurement(params);
  163. break;
  164. case "SunshineAnalysis":
  165. sunshineAnalysis(params);
  166. break
  167. case "AccessFeaturesWithPointEvents":
  168. accessFeaturesWithPointEvents(params);
  169. break;
  170. case "ShowLayersWithScaleEvents":
  171. showLayersWithScaleEvents(params);
  172. break;
  173. case "ViewshedAnalysis":
  174. viewshedAnalysis(params);
  175. break;
  176. case "FeatureLayerThreeDimension":
  177. featureLayerThreeDimension(params);
  178. break;
  179. case "AddLightBall":
  180. addLightBall(params);
  181. break;
  182. case "ThreeGrid":
  183. threeGrid(params);
  184. break;
  185. case "ShowThreeCube":
  186. showThreeCube(params);
  187. break;
  188. case "ShowThreeCubeDetail":
  189. showThreeCubeDetail(params);
  190. break;
  191. case "GetAllPowerPoints":
  192. getAllPowerPoints(params);
  193. break;
  194. case "ShowBuildingThreeCubeByInterface":
  195. showBuildingThreeCubeByInterface(params);
  196. break;
  197. case "ShowNoFlyThreeCubeByInterface":
  198. showNoFlyThreeCubeByInterface(params);
  199. break;
  200. case "ShowNoFlyThreeCubeDetailByInterface":
  201. showNoFlyThreeCubeDetailByInterface(params);
  202. break;
  203. case "ShowRoadThreeCubeByInterface":
  204. showRoadThreeCubeByInterface(params);
  205. break;
  206. case "ShowRoadThreeCubeDetailByInterface":
  207. showRoadThreeCubeDetailByInterface(params);
  208. break;
  209. case "ShowRiverThreeCubeByInterface":
  210. showRiverThreeCubeByInterface(params);
  211. break;
  212. case "ShowRiverThreeCubeDetailByInterface":
  213. showRiverThreeCubeDetailByInterface(params);
  214. break;
  215. case "ShowThreeNet":
  216. showThreeNet(params);
  217. break;
  218. case "RealPositionGrid":
  219. realPositionGrid(params);
  220. break;
  221. case "LimitHeightAnalysis":
  222. limitHeightAnalysis(params);
  223. break;
  224. case "GeometryMeshPrismEffect":
  225. geometryMeshPrismEffect(params);
  226. break;
  227. case "PathPipe":
  228. pathPipe(params);
  229. break;
  230. case "FlyGLTF":
  231. flyGLTF(params);
  232. break;
  233. case "Draw":
  234. draw(params);
  235. break;
  236. case "Draw_GeometryMeshPrismEffect":
  237. draw_GeometryMeshPrismEffect(params);
  238. break;
  239. case "SymbolPathPipe":
  240. symbolPathPipe(params);
  241. break;
  242. case "SymbolPointCube":
  243. symbolPointCube(params);
  244. break;
  245. case "FeaturePointsPlotting":
  246. featurePointsPlotting(params);
  247. break;
  248. case "FeaturePolygonPlotting":
  249. featurePolygonPlotting(params);
  250. break;
  251. case "GetRealFlyPoint":
  252. getRealFlyPoint(params);
  253. break;
  254. case "GetVirtualFlyPoint":
  255. getVirtualFlyPoint(params);
  256. break;
  257. case "ChangePointStatus":
  258. changePointStatus(params);
  259. break;
  260. case "GetRealPower":
  261. getRealPower(params);
  262. break;
  263. case "GetRealPower2":
  264. getRealPower2(params);
  265. break;
  266. case "PathConflict":
  267. pathConflict(params);
  268. break;
  269. case "UavBatteryWarning":
  270. uavBatteryWarning(params);
  271. break;
  272. case "UavYawWarning":
  273. uavYawWarning(params);
  274. break;
  275. case "Conflict_fly":
  276. conflict_fly(params);
  277. break;
  278. case "SituationAssessment":
  279. situationAssessment(params);
  280. break;
  281. }
  282. }
  283. function setBackground(params){
  284. }
  285. function setLocation(params){
  286. let setLocation = new SetLocation({
  287. view:m_view,
  288. x:params.x,
  289. y:params.y,
  290. z:params.z,
  291. heading:params.heading,
  292. tilt:params.tilt,
  293. isfly:params.isfly,
  294. });
  295. setLocation.start();
  296. }
  297. function addBaseMapLayer(params){
  298. let addBaseMapLayer = new AddBaseMapLayer({
  299. id:params.id,
  300. title:params.title,
  301. visible:params.visible,
  302. opacity:params.opacity,
  303. url:params.url,
  304. m_spatialReference,
  305. m_fullExtent,
  306. })
  307. m_view.map.basemap = addBaseMapLayer.basemap;
  308. }
  309. function addSingleLayer(params){
  310. let addSingleLayer = new AddSingleLayer({
  311. m_map,
  312. type:params.type,
  313. id:params.id,
  314. title:params.title,
  315. visible:params.visible,
  316. opacity:params.opacity,
  317. url:params.url,
  318. popupEnabled:params.popupEnabled,
  319. renderer:params.renderer,
  320. elevationInfo:params.elevationInfo
  321. })
  322. let layer = addSingleLayer.layer;
  323. m_map.add(layer);
  324. }
  325. function getSymbol(params){
  326. return {
  327. type: "mesh-3d",
  328. symbolLayers: [{
  329. type: "fill",
  330. material: {
  331. color: params.color
  332. },
  333. edges: {
  334. type: "solid",
  335. color:[255, 255, 255],
  336. }
  337. }]
  338. };
  339. }
  340. function reRendering(params){
  341. let ids_1 = [];
  342. for(let i=0;i<10000;i++){
  343. ids_1.push(i);
  344. }
  345. let ids_2 = [];
  346. for(let i=10000;i<20000;i++){
  347. ids_2.push(i);
  348. }
  349. let renderer = {
  350. type:"unique-value",
  351. defaultSymbol: getSymbol({color: [0, 255, 0,0.8]}),
  352. defaultLabel: "Other",
  353. field: "OBJECTID",
  354. uniqueValueInfos: [
  355. ]
  356. };
  357. // 每秒更新一次网格颜色
  358. setInterval(() => {
  359. renderer.uniqueValueInfos = []
  360. // 定义分组和对应的颜色
  361. const groups = {
  362. group1: {
  363. ids: ids_1, // 分组1的 ID 列表
  364. color: [Math.floor(Math.random() * 256), Math.floor(Math.random() * 256), Math.floor(Math.random() * 256), 0.8] // 红色
  365. },
  366. group2: {
  367. ids: ids_2, // 分组3的 ID 列表
  368. color: [Math.floor(Math.random() * 256), Math.floor(Math.random() * 256), Math.floor(Math.random() * 256), 0.8] // 蓝色
  369. }
  370. };
  371. // 遍历分组,动态生成渲染规则
  372. Object.keys(groups).forEach(groupKey => {
  373. const group = groups[groupKey];
  374. group.ids.forEach(id => {
  375. renderer.uniqueValueInfos.push({
  376. value: id, // 对应的 ID
  377. symbol: getSymbol(group)
  378. });
  379. });
  380. });
  381. if(reRenderingEvent == null){
  382. reRenderingEvent = new ReRenderingEvent({
  383. m_map,
  384. type:"scene",
  385. id:"WhiteMold",
  386. renderer:renderer
  387. });
  388. }
  389. reRenderingEvent.ReRendering();
  390. }, 5000);
  391. }
  392. function waterEffect(params){
  393. params.id = "waterLayer";
  394. if(params.status === "hide"){
  395. let layer = m_map.layers.find(item => item.id === params.id);
  396. m_map.remove(layer);
  397. return
  398. }
  399. if(params.status === "show"){
  400. let layer = m_map.layers.find(item => item.id === params.id);
  401. if(typeof layer === "undefined"){
  402. let waterEffect = new WaterEffect({
  403. id:params.id,
  404. url:params.url,
  405. waveDirection:params.waveDirection,
  406. waveStrength:params.waveStrength,
  407. color:params.color
  408. })
  409. layer = waterEffect.layer;
  410. m_map.add(layer);
  411. }else{
  412. m_view.environment.lighting.waterReflectionEnabled = true;
  413. const renderer = layer.renderer.clone();
  414. renderer.symbol.symbolLayers.getItemAt(0).waveDirection = params.waveDirection;
  415. renderer.symbol.symbolLayers.getItemAt(0).waveStrength = params.waveStrength;
  416. renderer.symbol.symbolLayers.getItemAt(0).color = params.color;
  417. layer.renderer = renderer;
  418. }
  419. }
  420. }
  421. function heatMap(params){
  422. params.id = "heatMap";
  423. if(!params.visible){
  424. let layer = m_map.layers.find(item => item.id === params.id);
  425. m_map.remove(layer);
  426. return
  427. }
  428. if(params.visible){
  429. let layer = m_map.layers.find(item => item.id === params.id);
  430. if(typeof layer === "undefined"){
  431. let heatMap = new HeatMap({
  432. id:params.id,
  433. url:params.url,
  434. waveDirection:params.waveDirection,
  435. waveStrength:params.waveStrength,
  436. color:params.color
  437. })
  438. layer = heatMap.layer;
  439. m_map.add(layer);
  440. }
  441. }
  442. }
  443. function measurement(params){
  444. let status = params.status;
  445. let type = params.type;
  446. let position = params.position;
  447. if(status === "hide"){
  448. if(measureWidget !== null){
  449. m_view.ui.remove(measureWidget);
  450. measureWidget.destroy();
  451. measureWidget = null;
  452. }
  453. return
  454. }
  455. if(status === "show"){
  456. if(measureWidget === null){
  457. let measurement = new Measurement({
  458. view:m_view,
  459. type
  460. })
  461. measureWidget = measurement.widget;
  462. }
  463. m_view.ui.add(measureWidget,position);
  464. }
  465. }
  466. function sunshineAnalysis(params){
  467. let status = params.status;
  468. let position = params.position;
  469. if(status === "hide"){
  470. if(sunshineWidget !== null){
  471. m_view.ui.remove(sunshineWidget);
  472. sunshineWidget.destroy();
  473. sunshineWidget = null;
  474. }
  475. return
  476. }
  477. if(status === "show"){
  478. if(sunshineWidget === null){
  479. let sunshineAnalysis = new SunshineAnalysis({
  480. view:m_view
  481. })
  482. sunshineWidget = sunshineAnalysis.widget;
  483. }
  484. m_view.ui.add(sunshineWidget,position);
  485. }
  486. }
  487. function accessFeaturesWithPointEvents(params){
  488. let status = params.status;
  489. let mouse_handle_id = params.mouse_handle_id;
  490. let highlight_handle_id = params.highlight_handle_id;
  491. if(status === "hide"){
  492. if(m_handles.has(mouse_handle_id)){
  493. m_handles.remove(mouse_handle_id);
  494. }
  495. if(m_handles.has(highlight_handle_id)){
  496. m_handles.remove(highlight_handle_id);
  497. }
  498. return
  499. }
  500. if(status === "show"){
  501. let type = params.type;
  502. let mouseTime = params.mouse_time;
  503. let popupTitle = params.popup_title;
  504. if(m_handles.has(mouse_handle_id)){
  505. m_handles.remove(mouse_handle_id);
  506. }
  507. if(m_handles.has(highlight_handle_id)){
  508. m_handles.remove(highlight_handle_id);
  509. }
  510. let addPointEvent = new AddPointEvent({
  511. m_view,
  512. type,
  513. highlightHandleId:highlight_handle_id,
  514. mouseTime,
  515. popupTitle,
  516. callbackFunction:accessFeaturesWithPointEventsReturn
  517. });
  518. m_handles.add(addPointEvent.mouseHandle,mouse_handle_id);
  519. }
  520. }
  521. function accessFeaturesWithPointEventsReturn(screenPoint,handleId,popupTitle){
  522. if(m_handles.has(handleId)){
  523. m_handles.remove(handleId);
  524. }
  525. m_view.hitTest(screenPoint).then((response) =>{
  526. if(response.results.length > 0){
  527. let result = response.results[0];
  528. m_view.whenLayerView(result.graphic.layer).then((lyrView) =>{
  529. let highlightHandle = lyrView.highlight(result.graphic);
  530. m_handles.add(highlightHandle,handleId);
  531. })
  532. let setPopupOptions = new SetPopupOptions({
  533. title:popupTitle,
  534. location:m_view.toMap(screenPoint),
  535. content:result.graphic.attributes
  536. })
  537. m_view.popup.open(setPopupOptions.popupOptions());
  538. }
  539. })
  540. }
  541. function showLayersWithScaleEvents(params){
  542. let status = params.status;
  543. let scale_handle_id = params.scale_handle_id;
  544. if(status === "hide"){
  545. if(m_handles.has(scale_handle_id)){
  546. m_handles.remove(scale_handle_id);
  547. }
  548. return
  549. }
  550. if(status === "show"){
  551. if(m_handles.has(scale_handle_id)){
  552. m_handles.remove(scale_handle_id);
  553. }
  554. let addScaleEvent = new AddScaleEvent({
  555. m_view,
  556. callBackFunction:showLayersWithScaleEventsReturn
  557. });
  558. m_handles.add(addScaleEvent.scaleHandle,scale_handle_id);
  559. }
  560. }
  561. function showThreeCube(params){
  562. let status = params.status;
  563. if(status == "hide"){
  564. if(addThreeCubeEvent){
  565. addThreeCubeEvent.clear();
  566. addThreeCubeEvent = null;
  567. }
  568. return
  569. }
  570. let size = params.size;
  571. let points = params.points;
  572. // 初始化 AddThreeCubeEvent,暂时不启动
  573. addThreeCubeEvent = new AddThreeCubeEvent({
  574. view: m_view,
  575. points:points,
  576. size,
  577. });
  578. addThreeCubeEvent.init();
  579. }
  580. function showThreeCubeDetail(params){
  581. let status = params.status;
  582. let id = params.id;
  583. let depthTest = params.depthTest;
  584. if(depthTest == undefined){
  585. depthTest = true;
  586. }
  587. if(status == "hide"){
  588. if(addThreeCubeDetailInstance[id]){
  589. addThreeCubeDetailInstance[id].clear();
  590. addThreeCubeDetailInstance[id] = null;
  591. }
  592. return
  593. }
  594. let size = params.size;
  595. if(addThreeCubeDetailInstance[id]){
  596. addThreeCubeDetailInstance[id].add(params.points);
  597. }else{
  598. let addThreeCubeDetailEvent = new AddThreeCubeDetailEvent({
  599. view: m_view,
  600. points:params.points,
  601. size,
  602. bus,
  603. depthTest
  604. });
  605. addThreeCubeDetailEvent.start();
  606. addThreeCubeDetailInstance[id] = addThreeCubeDetailEvent;
  607. }
  608. }
  609. // 递归获取所有建筑点的辅助函数
  610. function getAllPowerPoints(level,scrollId = null) {
  611. getPowerInterface({
  612. x: m_view.camera.position.x,
  613. y: m_view.camera.position.y,
  614. //level: level,
  615. scrollId: scrollId,
  616. }).then(res =>{
  617. if(res.data.data.list?.length >= 10000 && res.data.data.scrollId){
  618. powerDataList = powerDataList.concat(res.data.data.list);
  619. getAllPowerPoints(level,res.data.data.scrollId);
  620. }else{
  621. powerDataList = powerDataList.concat(res.data.data.list);
  622. // 初始化 AddThreeCubeEvent,暂时不启动
  623. powerDataList.forEach((item)=>{
  624. item.color = getColor(item.averageValue, -100, 0);
  625. })
  626. let size = {
  627. x:13.223015683766334,
  628. y:15.404125436905815,
  629. z:13.471596544164798
  630. }
  631. let para = {
  632. id:"1",
  633. status:"show",
  634. size,
  635. points:powerDataList
  636. }
  637. //symbolPointCube(para)
  638. showThreeCubeDetail(para);
  639. }
  640. })
  641. }
  642. function getColor(value, minValue, maxValue) {
  643. // 边界处理
  644. if (value < minValue) value = minValue;
  645. if (value > maxValue) value = maxValue;
  646. // 映射到 [0, 1]
  647. let t = (value - minValue) / (maxValue - minValue);
  648. // 定义颜色
  649. let r, g, b;
  650. if (t <= 0.5) {
  651. // 从红色到黄色
  652. r = 1;
  653. g = t * 2; // 线性插值增加绿色
  654. b = 0;
  655. } else {
  656. // 从黄色到绿色
  657. r = 2 * (1 - t); // 线性插值减少红色
  658. g = 1;
  659. b = 0;
  660. }
  661. return [r, g, b];
  662. }
  663. function showBuildingThreeCubeByInterface(params){
  664. let status = params.status;
  665. let size = params.size;
  666. if(addThreeCubeEvent){
  667. addThreeCubeEvent.clear();
  668. addThreeCubeEvent = null;
  669. }
  670. if(status == "hide"){
  671. return
  672. }
  673. let level = params.level;
  674. // 初始化 AddThreeCubeEvent,暂时不启动
  675. addThreeCubeEvent = new AddThreeCubeEvent({
  676. view: m_view,
  677. size,
  678. });
  679. addThreeCubeEvent.start();
  680. // 获取所有建筑点数据
  681. getAllBuildingPoints(level);
  682. }
  683. function showNoFlyThreeCubeDetailByInterface(params){
  684. let status = params.status;
  685. let size = params.size;
  686. if(addThreeCubeEvent){
  687. addThreeCubeEvent.clear();
  688. addThreeCubeEvent = null;
  689. }
  690. if(status == "hide"){
  691. return
  692. }
  693. let level = params.level;
  694. getNoFlyPointInterface({
  695. x: m_view.camera.position.x,
  696. y: m_view.camera.position.y,
  697. level: level,
  698. scrollId: "",
  699. }).then(res =>{
  700. res.data.data.list.forEach(item =>{
  701. item.color = [1,0,0]
  702. })
  703. // 初始化 AddThreeCubeEvent,暂时不启动
  704. let addThreeCubeDetailEvent = new AddThreeCubeDetailEvent({
  705. view: m_view,
  706. points:res.data.data.list,
  707. size,
  708. bus
  709. });
  710. addThreeCubeDetailEvent.start();
  711. })
  712. }
  713. function showNoFlyThreeCubeByInterface(params){
  714. let status = params.status;
  715. let size = params.size;
  716. if(addThreeCubeEvent){
  717. addThreeCubeEvent.clear();
  718. addThreeCubeEvent = null;
  719. }
  720. if(status == "hide"){
  721. return
  722. }
  723. let level = params.level;
  724. // 初始化 AddThreeCubeEvent,暂时不启动
  725. addThreeCubeEvent = new AddThreeCubeEvent({
  726. view: m_view,
  727. size,
  728. });
  729. addThreeCubeEvent.start();
  730. // 获取所有建筑点数据
  731. getNoFlyPoint(level);
  732. }
  733. function showRoadThreeCubeByInterface(params){
  734. let status = params.status;
  735. let size = params.size;
  736. if(addThreeCubeEvent){
  737. addThreeCubeEvent.clear();
  738. addThreeCubeEvent = null;
  739. }
  740. if(status == "hide"){
  741. return
  742. }
  743. let level = params.level;
  744. // 初始化 AddThreeCubeEvent,暂时不启动
  745. addThreeCubeEvent = new AddThreeCubeEvent({
  746. view: m_view,
  747. size,
  748. });
  749. addThreeCubeEvent.start();
  750. // 获取所有建筑点数据
  751. getRoadPoint(level);
  752. }
  753. function showRoadThreeCubeDetailByInterface(params){
  754. let status = params.status;
  755. let size = params.size;
  756. if(addThreeCubeEvent){
  757. addThreeCubeEvent.clear();
  758. addThreeCubeEvent = null;
  759. }
  760. if(status == "hide"){
  761. return
  762. }
  763. let level = params.level;
  764. getRoadPointInterface({
  765. x: m_view.camera.position.x,
  766. y: m_view.camera.position.y,
  767. level: level,
  768. scrollId: "",
  769. }).then(res =>{
  770. res.data.data.list.forEach(item =>{
  771. item.color = [0,0,1]
  772. })
  773. // 初始化 AddThreeCubeEvent,暂时不启动
  774. let addThreeCubeDetailEvent = new AddThreeCubeDetailEvent({
  775. view: m_view,
  776. points:res.data.data.list,
  777. size,
  778. bus
  779. });
  780. addThreeCubeDetailEvent.start();
  781. })
  782. }
  783. function showRiverThreeCubeByInterface(params){
  784. let status = params.status;
  785. let size = params.size;
  786. if(addThreeCubeEvent){
  787. addThreeCubeEvent.clear();
  788. addThreeCubeEvent = null;
  789. }
  790. if(status == "hide"){
  791. return
  792. }
  793. let level = params.level;
  794. // 初始化 AddThreeCubeEvent,暂时不启动
  795. addThreeCubeEvent = new AddThreeCubeEvent({
  796. view: m_view,
  797. size,
  798. });
  799. addThreeCubeEvent.start();
  800. // 获取所有建筑点数据
  801. getRiverPoint(level);
  802. }
  803. function showRiverThreeCubeDetailByInterface(params){
  804. let status = params.status;
  805. let size = params.size;
  806. if(addThreeCubeEvent){
  807. addThreeCubeEvent.clear();
  808. addThreeCubeEvent = null;
  809. }
  810. if(status == "hide"){
  811. return
  812. }
  813. let level = params.level;
  814. getRiverPointInterface({
  815. x: m_view.camera.position.x,
  816. y: m_view.camera.position.y,
  817. level: level,
  818. scrollId: "",
  819. }).then(res =>{
  820. res.data.data.list.forEach(item =>{
  821. item.color = [1,1,0]
  822. })
  823. // 初始化 AddThreeCubeEvent,暂时不启动
  824. let addThreeCubeDetailEvent = new AddThreeCubeDetailEvent({
  825. view: m_view,
  826. points:res.data.data.list,
  827. size,
  828. bus
  829. });
  830. addThreeCubeDetailEvent.start();
  831. })
  832. }
  833. function showThreeNet(params){
  834. let status = params.status;
  835. if(addThreeNetEvent){
  836. addThreeNetEvent.clear();
  837. addThreeNetEvent = null;
  838. }
  839. if(status == "hide"){
  840. return
  841. }
  842. let size = params.size;
  843. let origin = params.origin;
  844. let buffer = params.buffer;
  845. let maxHeight = params.maxHeight;
  846. let minHeight = params.minHeight;
  847. //另一类是网加载(网只根据范围变化)
  848. addThreeNetEvent = new AddThreeNetEvent({
  849. view: m_view,
  850. size,
  851. origin,
  852. buffer,
  853. maxHeight,
  854. minHeight
  855. });
  856. addThreeNetEvent.start();
  857. }
  858. // 递归获取所有建筑点的辅助函数
  859. function getAllBuildingPoints(level,scrollId = null) {
  860. getBuildingPoint({
  861. x: m_view.camera.position.x,
  862. y: m_view.camera.position.y,
  863. level: level,
  864. scrollId: scrollId,
  865. }).then(res =>{
  866. if(res.data.data.list?.length >= 10000 && res.data.data.scrollId){
  867. addThreeCubeEvent.addPoints(res.data.data.list);
  868. getAllBuildingPoints(level,res.data.data.scrollId);
  869. }else{
  870. addThreeCubeEvent.addPoints(res.data.data.list);
  871. }
  872. })
  873. }
  874. // 递归获取所有建筑点的辅助函数
  875. function getNoFlyPoint(level,scrollId = null) {
  876. getNoFlyPointInterface({
  877. x: m_view.camera.position.x,
  878. y: m_view.camera.position.y,
  879. level: level,
  880. scrollId: scrollId,
  881. }).then(res =>{
  882. if(res.data.data.list?.length >= 10000 && res.data.data.scrollId){
  883. addThreeCubeEvent.addPoints(res.data.data.list);
  884. getNoFlyPoint(level,res.data.data.scrollId);
  885. }else{
  886. addThreeCubeEvent.addPoints(res.data.data.list);
  887. }
  888. })
  889. }
  890. // 递归获取所有道路点的辅助函数
  891. function getRoadPoint(level,scrollId = null) {
  892. getRoadPointInterface({
  893. x: m_view.camera.position.x,
  894. y: m_view.camera.position.y,
  895. level: level,
  896. scrollId: scrollId,
  897. }).then(res =>{
  898. if(res.data.data.list?.length >= 10000 && res.data.data.scrollId){
  899. addThreeCubeEvent.addPoints(res.data.data.list);
  900. getRoadPoint(level,res.data.data.scrollId);
  901. }else{
  902. addThreeCubeEvent.addPoints(res.data.data.list);
  903. }
  904. })
  905. }
  906. // 递归获取所有河流点的辅助函数
  907. function getRiverPoint(level,scrollId = null) {
  908. getRiverPointInterface({
  909. x: m_view.camera.position.x,
  910. y: m_view.camera.position.y,
  911. level: level,
  912. scrollId: scrollId,
  913. }).then(res =>{
  914. if(res.data.data.list?.length >= 10000 && res.data.data.scrollId){
  915. addThreeCubeEvent.addPoints(res.data.data.list);
  916. getRiverPoint(level,res.data.data.scrollId);
  917. }else{
  918. addThreeCubeEvent.addPoints(res.data.data.list);
  919. }
  920. })
  921. }
  922. //全市格网自定义分割效果加载
  923. // function showLayersWithScaleEventsReturn(scaleValue){
  924. // let eyeExtent = getEyeExtent();
  925. // if(!eyeExtent){
  926. // return
  927. // }
  928. // let height = m_view.camera.position.z;
  929. // console.log("height",height,"scale",m_view.scale);
  930. // let sizeObj = extentGridLimit({
  931. // eyeExtent,
  932. // height
  933. // });
  934. // let size = sizeObj.size;
  935. // let opacity = sizeObj.opacity;
  936. // let layerHeight;
  937. // if(size > 400){
  938. // layerHeight = 400;
  939. // }else{
  940. // layerHeight = size;
  941. // }
  942. // if(addThreeGridEvent){
  943. // addThreeGridEvent.extent = {minX:eyeExtent.xmin,maxX:eyeExtent.xmax,minY:eyeExtent.ymin,maxY:eyeExtent.ymax};
  944. // addThreeGridEvent.height = height>1200?1200:height;
  945. // addThreeGridEvent.size = size;
  946. // addThreeGridEvent.layerHeight = layerHeight;
  947. // addThreeGridEvent.gridEnabled = true;
  948. // addThreeGridEvent.netEnabled = true;
  949. // addThreeGridEvent.opacity = opacity;
  950. // addThreeGridEvent.start();
  951. // }else{
  952. // addThreeGridEvent = new AddThreeGridEvent({
  953. // view:m_view,
  954. // extent: {minX:eyeExtent.xmin,maxX:eyeExtent.xmax,minY:eyeExtent.ymin,maxY:eyeExtent.ymax},
  955. // height:height>1200?1200:height,
  956. // size:size,
  957. // gridEnabled : true,
  958. // netEnabled : true,
  959. // opacity:opacity,
  960. // layerHeight:layerHeight,
  961. // })
  962. // addThreeGridEvent.start();
  963. // }
  964. //
  965. // }
  966. //
  967. //格网范围限制
  968. // function extentGridLimit(params){
  969. // try{
  970. // //let size = [7.73,61.84,123.69,1850];
  971. // let size = [
  972. // {
  973. // value:7.73,
  974. // opacity:0.05
  975. // },
  976. // {
  977. // value:61.84,
  978. // opacity:0.05
  979. // },
  980. // {
  981. // value:123.69,
  982. // opacity:0.15
  983. // },
  984. // {
  985. // value:1850,
  986. // opacity:0.3
  987. // }
  988. // ]
  989. // params.eyeExtent = {
  990. // xmin: params.eyeExtent.xmin < -60000?-60000:params.eyeExtent.xmin,
  991. // ymin: params.eyeExtent.ymin < -60000?-60000:params.eyeExtent.ymin,
  992. // xmax: params.eyeExtent.xmax > 60000?60000:params.eyeExtent.xmax,
  993. // ymax: params.eyeExtent.ymax > 70000?70000:params.eyeExtent.ymax,
  994. // }
  995. // params.height = params.height < 1200?params.height:1200;
  996. // for(let i = 0;i<size.length;i++){
  997. // let xCount = Math.floor((params.eyeExtent.xmax - params.eyeExtent.xmin) / size[i].value);
  998. // let yCount = Math.floor((params.eyeExtent.ymax - params.eyeExtent.ymin) / size[i].value);
  999. // let zCount = Math.floor(params.height / size[i].value);
  1000. // let count = xCount * yCount * zCount;
  1001. // if(count < 200000){
  1002. // return {
  1003. // size: size[i].value,
  1004. // opacity: size[i].opacity
  1005. // }
  1006. // }
  1007. // }
  1008. // }catch(e){
  1009. // console.log("params",params)
  1010. // }
  1011. // }
  1012. // function getEyeExtent() {
  1013. // const screenWidth = m_view.width;
  1014. // const screenHeight = m_view.height;
  1015. //
  1016. // // 四个角的像素坐标
  1017. // const screenCorners = [
  1018. // { x: 0, y: 0 }, // 左上角
  1019. // { x: screenWidth, y: 0 }, // 右上角
  1020. // { x: screenWidth, y: screenHeight }, // 右下角
  1021. // { x: 0, y: screenHeight }, // 左下角
  1022. // ];
  1023. //
  1024. // // 将屏幕角坐标转为地图坐标
  1025. // const mapPoints = screenCorners.map((screenPoint) => m_view.toMap(screenPoint)).filter(p => p);
  1026. //
  1027. // // 添加 camera.position 到 mapPoints
  1028. // const cameraPoint = m_view.camera.position;
  1029. //
  1030. // if (mapPoints.length < 4) {
  1031. // if (cameraPoint) {
  1032. // const bufferDistance = 2000; // 2公里
  1033. // const spatialReference = m_view.spatialReference;
  1034. //
  1035. // const screenExtent = {
  1036. // xmin: cameraPoint.x - bufferDistance,
  1037. // ymin: cameraPoint.y - bufferDistance,
  1038. // xmax: cameraPoint.x + bufferDistance,
  1039. // ymax: cameraPoint.y + bufferDistance,
  1040. // spatialReference: spatialReference,
  1041. // };
  1042. // console.warn("视图范围不足4个有效点,使用摄像机位置生成的2公里范围。");
  1043. // console.log(screenExtent);
  1044. // return screenExtent;
  1045. // } else {
  1046. // console.warn("无法获取摄像机位置,请检查视图状态。");
  1047. // return null;
  1048. // }
  1049. // } else {
  1050. // try {
  1051. // // 获取最小和最大坐标值
  1052. // const xmin = Math.min(...mapPoints.map((p) => p.x));
  1053. // const ymin = Math.min(...mapPoints.map((p) => p.y));
  1054. // const xmax = Math.max(...mapPoints.map((p) => p.x));
  1055. // const ymax = Math.max(...mapPoints.map((p) => p.y));
  1056. //
  1057. // const screenExtent = {
  1058. // xmin: xmin,
  1059. // ymin: ymin,
  1060. // xmax: xmax,
  1061. // ymax: ymax,
  1062. // spatialReference: m_view.spatialReference,
  1063. // };
  1064. // console.log(screenExtent);
  1065. // return screenExtent;
  1066. // } catch (e) {
  1067. // console.error("获取地图范围时出错:", e);
  1068. // return null;
  1069. // }
  1070. // }
  1071. // }
  1072. //不同比例尺加载白膜
  1073. function showLayersWithScaleEventsReturn(scaleValue){
  1074. let layer = m_map.layers.find(item => item.id === "WhiteMold");
  1075. if(scaleValue > 50000){
  1076. if(layer){
  1077. layer.visible = false;
  1078. }
  1079. }else{
  1080. if(layer){
  1081. layer.visible = true;
  1082. }
  1083. }
  1084. }
  1085. function viewshedAnalysis(params){
  1086. let status = params.status;
  1087. if(status === "hide"){
  1088. if(viewShedAnalysisWidget !== null){
  1089. viewShedAnalysisWidget.clearAnalysis();
  1090. }
  1091. return
  1092. }
  1093. if(status === "show"){
  1094. if(viewShedAnalysisWidget === null){
  1095. viewShedAnalysisWidget = new ViewShedAnalysisWidget({ view:m_view });
  1096. viewShedAnalysisWidget.startAnalysis();
  1097. }
  1098. }
  1099. }
  1100. function featureLayerThreeDimension(params){
  1101. let status = params.status;
  1102. }
  1103. function addLightBall(params){
  1104. let status = params.status;
  1105. if(addLightBallEvent){
  1106. addLightBallEvent.clear();
  1107. addLightBallEvent = null;
  1108. }
  1109. if(status === "hide"){
  1110. return
  1111. }
  1112. addLightBallEvent = new AddLightBallEvent({
  1113. view:m_view
  1114. })
  1115. addLightBallEvent.start()
  1116. }
  1117. function threeGrid(params){
  1118. let status = params.status;
  1119. if(status == "hide"){
  1120. if(addThreeGridEvent){
  1121. addThreeGridEvent.clear();
  1122. addThreeGridEvent = null;
  1123. }
  1124. return
  1125. }
  1126. let animationEnabled = false;
  1127. if(params.animationEnabled){
  1128. animationEnabled = params.animationEnabled;
  1129. }
  1130. if(addThreeGridEvent){
  1131. addThreeGridEvent.height = params.height;
  1132. addThreeGridEvent.size = params.size;
  1133. addThreeGridEvent.layerHeight = params.layerHeight;
  1134. addThreeGridEvent.animationEnabled = animationEnabled;
  1135. addThreeGridEvent.gridEnabled = true;
  1136. addThreeGridEvent.netEnabled = true;
  1137. addThreeGridEvent.start();
  1138. }else{
  1139. addThreeGridEvent = new AddThreeGridEvent({
  1140. view:m_view,
  1141. extent : {minX:2176,maxX:6048,minY:-1024,maxY:1352},
  1142. height : params.height,
  1143. size : params.size,
  1144. layerHeight :params.layerHeight,
  1145. gridEnabled:true,
  1146. netEnabled:true,
  1147. animationEnabled
  1148. })
  1149. addThreeGridEvent.start();
  1150. }
  1151. }
  1152. function threeGridDetail(params){
  1153. }
  1154. function realPositionGrid(params){
  1155. let status = params.status;
  1156. }
  1157. function limitHeightAnalysis(params){
  1158. let status = params.status;
  1159. if(limitHeightAnalysisEvent){
  1160. limitHeightAnalysisEvent.clear();
  1161. limitHeightAnalysisEvent =null;
  1162. }
  1163. if(status == "hide"){
  1164. return
  1165. }
  1166. limitHeightAnalysisEvent = new LimitHeightAnalysis({
  1167. view:m_view,
  1168. map:m_map,
  1169. layerId:params.layerId,
  1170. limitH:params.limitH,
  1171. maxLimitH:params.maxLimitH,
  1172. rings:params.rings,
  1173. });
  1174. limitHeightAnalysisEvent.start()
  1175. }
  1176. function geometryMeshPrismEffect(params){
  1177. let status = params.status;
  1178. let f_layer = m_map.layers.find(item => item.id === "geometryMeshPrismEffect");
  1179. if (f_layer) {
  1180. m_map.remove(f_layer);
  1181. }
  1182. if(status == "hide"){
  1183. return
  1184. }
  1185. let geometryMeshPrismEffect = new GeometryMeshPrismEffect({
  1186. view:m_view,
  1187. m_map,
  1188. items:params.items,
  1189. startHeight:params.startHeight,
  1190. rings:params.rings
  1191. });
  1192. m_map.add(geometryMeshPrismEffect.graphicsLayer);
  1193. }
  1194. // 路径冲突
  1195. function pathConflict(params){
  1196. pathPipe({
  1197. "id": "conflict1",
  1198. "status": "show",
  1199. "paths":Path.path_conflict_1,
  1200. "color": "#438EDB",
  1201. "intensity": 1.2,
  1202. "pipeRadius": 5
  1203. });
  1204. pathPipe({
  1205. "id": "conflict2",
  1206. "status": "show",
  1207. "paths":Path.path_conflict_2,
  1208. "color": "#438EDB",
  1209. "intensity": 1.2,
  1210. "pipeRadius": 5
  1211. });
  1212. getRealFlyPoint({
  1213. flyList:[
  1214. {
  1215. "id": "67513a6e-7ce2-4121-9b11-cd6f1d28e02c",
  1216. "speed":40,
  1217. "uavid": "87066700-f12d-4b3e-ac77-a55a409dd30b"
  1218. },
  1219. {
  1220. "id": "fba073d1-def3-4f85-9326-dff8a1ac6ea6",
  1221. "speed":25,
  1222. "uavid": "9556344a-c055-4156-86d4-bc57930275a2"
  1223. }
  1224. ]
  1225. })
  1226. }
  1227. // 无人机电量预警
  1228. function uavBatteryWarning(params){
  1229. pathPipe({
  1230. "id": "conflict1",
  1231. "status": "show",
  1232. "paths":Path.path_conflict_1,
  1233. "color": "#438EDB",
  1234. "intensity": 1.2,
  1235. "pipeRadius": 10
  1236. });
  1237. getRealFlyPoint({
  1238. flyList:[
  1239. {
  1240. "id": "67513a6e-7ce2-4121-9b11-cd6f1d28e02c",
  1241. "speed":40,
  1242. "uavid": "02d47b30-003c-4e7e-89ec-72255c1ebdaf"
  1243. }
  1244. ]
  1245. })
  1246. }
  1247. //无人机偏航
  1248. function uavYawWarning(params){
  1249. pathPipe({
  1250. "id": "yaw",
  1251. "status": "show",
  1252. "paths":Path.yaw_path,
  1253. "color": "#438EDB",
  1254. "intensity": 1.2,
  1255. "pipeRadius": 10
  1256. });
  1257. getRealFlyPoint({
  1258. flyList:[
  1259. {
  1260. "id": "6fd0fa45-de0b-4008-8d4d-afaaa15064f3",
  1261. "speed":40,
  1262. "uavid": "7e080fe7-dbd4-4be2-aa45-72a28da7f26c"
  1263. }
  1264. ]
  1265. })
  1266. }
  1267. function pathPipe(params){
  1268. let id = params.id;
  1269. let status = params.status;
  1270. if(pathPipeInstance[id]){
  1271. pathPipeInstance[id].clear();
  1272. pathPipeInstance[id] = null;
  1273. }
  1274. if(status == "hide"){
  1275. return
  1276. }
  1277. //优化数据
  1278. //params.paths = Path.paths;
  1279. let pathPipeEvent = new PathPipeEvent({
  1280. view:m_view,
  1281. paths:params.paths,
  1282. color:params.color,
  1283. pipeRadius:params.pipeRadius,
  1284. intensity:params.intensity
  1285. });
  1286. pathPipeEvent.start();
  1287. // 保存实例
  1288. pathPipeInstance[id] = pathPipeEvent;
  1289. }
  1290. function flyGLTF(params){
  1291. let id = params.id;
  1292. let uavid = params.uavid;
  1293. let status = params.status;
  1294. if(status == "hide"){
  1295. if(flyGLTFInstances[uavid]){
  1296. flyGLTFInstances[uavid].clear();
  1297. delete flyGLTFInstances[uavid];
  1298. }
  1299. return
  1300. }
  1301. let point = params.point;
  1302. let duration = params.duration;
  1303. let uavInfo = params.uavInfo;
  1304. if(flyGLTFInstances[uavid]){
  1305. flyGLTFInstances[uavid].updatePath(point,duration);
  1306. if(uavInfo){
  1307. flyGLTFInstances[uavid].updateUavInfo(uavInfo);
  1308. }
  1309. }else{
  1310. let flyGLTFEvent = new FlyGLTFEvent({
  1311. view:m_view,
  1312. uavid,
  1313. bus,
  1314. })
  1315. flyGLTFEvent.start();
  1316. flyGLTFEvent.updatePath(point,duration);
  1317. if(params.uavInfo){
  1318. flyGLTFEvent.updateUavInfo(uavInfo);
  1319. }
  1320. flyGLTFInstances[uavid] = flyGLTFEvent;
  1321. }
  1322. }
  1323. function getVirtualFlyPoint(params){
  1324. let status = params.status;
  1325. const connectVirtualWebSocket = (status) => {
  1326. if(status == "show"){
  1327. if(virtualSocket){
  1328. virtualSocket.send(JSON.stringify(params.flyList));
  1329. }else{
  1330. virtualSocket = new WebSocket('ws://58.34.215.19:19259/simulate/getRouteInfoWebSocket');
  1331. virtualSocket.onopen = () => {
  1332. console.log('WebSocket 连接成功');
  1333. virtualSocket.send(JSON.stringify(params.flyList));
  1334. };
  1335. virtualSocket.onmessage = (messageEvent) => {
  1336. let messages = JSON.parse(messageEvent.data).data;
  1337. messages.forEach(message => {
  1338. flyGLTF({
  1339. id:message.id,
  1340. uavid:message.uavid,
  1341. status:message.routeInfoVO.status == 3?"hide":"show",
  1342. duration:2100,
  1343. //duration:3000,
  1344. point:message.position_cj,
  1345. uavInfo: {
  1346. type:"safe",
  1347. data:message.routeInfoVO
  1348. }
  1349. });
  1350. })
  1351. };
  1352. virtualSocket.onerror = (error) => {
  1353. console.error('WebSocket 出错:', error);
  1354. };
  1355. virtualSocket.onclose = () => {
  1356. console.log('WebSocket 连接已关闭');
  1357. };
  1358. }
  1359. }else{
  1360. if(virtualSocket){
  1361. virtualSocket.close();
  1362. }
  1363. }
  1364. };
  1365. connectVirtualWebSocket(status);
  1366. }
  1367. function getRealFlyPoint(params){
  1368. const connectWebSocket = () => {
  1369. if(socket){
  1370. socket.send(JSON.stringify(params.flyList));
  1371. }else{
  1372. socket = new WebSocket('ws://58.34.215.19:19259/aircraftRouteSpeedWebSocket');
  1373. socket.onopen = () => {
  1374. console.log('WebSocket 连接成功');
  1375. socket.send(JSON.stringify(params.flyList));
  1376. };
  1377. socket.onmessage = (messageEvent) => {
  1378. let messages = JSON.parse(messageEvent.data).data;
  1379. debugger
  1380. //发送消息
  1381. bus.emit('SendMessage',{
  1382. action:"RealTimeUAVList",
  1383. data:{
  1384. "message":messages
  1385. }
  1386. })
  1387. messages.forEach(message => {
  1388. if(message.overall == "SAFE"){
  1389. pathPipe({
  1390. "id": message.uavid+'_conflict',
  1391. "status": "hide"
  1392. });
  1393. flyGLTF({
  1394. id:message.id,
  1395. uavid:message.uavid,
  1396. status:message.routeInfoVO.status == 3?"hide":"show",
  1397. duration:message.time + 1000,
  1398. //duration:3000,
  1399. point:message.position_cj,
  1400. uavInfo: {
  1401. type:"safe",
  1402. data:message.routeInfoVO
  1403. }
  1404. });
  1405. }else{
  1406. if(message.nearestAircraft.status !="SAFE"){ //碰撞
  1407. flyGLTF({
  1408. id:message.id,
  1409. uavid:message.uavid,
  1410. status:message.routeInfoVO.status == 3?"hide":"show",
  1411. duration:message.time + 1000,
  1412. //duration:3000,
  1413. point:message.position_cj,
  1414. uavInfo: {
  1415. type:"conflict",
  1416. data:message.nearestAircraft
  1417. }
  1418. });
  1419. pathPipe({
  1420. "id": message.uavid+'_conflict',
  1421. "status": "show",
  1422. "paths":[message.nearestAircraft.conflictPath],
  1423. "color": "#FF0000",
  1424. "intensity": 1.5,
  1425. "pipeRadius": 6
  1426. });
  1427. }else{
  1428. pathPipe({
  1429. "id": message.uavid+'_conflict',
  1430. "status": "hide"
  1431. });
  1432. flyGLTF({
  1433. id:message.id,
  1434. uavid:message.uavid,
  1435. status:message.routeInfoVO.status == 3?"hide":"show",
  1436. duration:message.time + 1000,
  1437. //duration:3000,
  1438. point:message.position_cj,
  1439. uavInfo: {
  1440. type:"safe",
  1441. data:message.routeInfoVO
  1442. }
  1443. });
  1444. }
  1445. }
  1446. // if(message.nearestAircraft.status != "SAFE"){ //碰撞
  1447. // showThreeCubeDetail({
  1448. // "id":message.uavid,
  1449. // "status": "hide",
  1450. // })
  1451. // showThreeCubeDetail({
  1452. // "id":message.uavid,
  1453. // "status": "show",
  1454. // "size": {
  1455. // "x":message.nearestAircraft.gridPath[0].boxSize.latLength,
  1456. // "y":message.nearestAircraft.gridPath[0].boxSize.lonLength,
  1457. // "z":message.nearestAircraft.gridPath[0].boxSize.height,
  1458. // },
  1459. // "points": message.nearestAircraft.gridPath
  1460. // })
  1461. // bus.emit('SendMessage',{
  1462. // action:"CurrentUavInfo",
  1463. // data:{
  1464. // "isConflict":true,
  1465. // "status": "show",
  1466. // "uavid": "87066700-f12d-4b3e-ac77-a55a409dd30b",
  1467. // "skip_route_id": "fba073d1-def3-4f85-9326-dff8a1ac6ea6",
  1468. // "distance": 1280,
  1469. // }
  1470. // })
  1471. //
  1472. // }else if(message.noFlyZone != "SAFE"){
  1473. // console.log("无人机禁飞区信息",message);
  1474. // }else if(message.routeDeviate != "SAFE"){
  1475. // console.log("无人机偏航异常信息",message);
  1476. // }else if(message.electricityWarning != "SAFE"){
  1477. // console.log("无人机电量异常信息",message);
  1478. // }
  1479. })
  1480. };
  1481. socket.onerror = (error) => {
  1482. console.error('WebSocket 出错:', error);
  1483. };
  1484. socket.onclose = () => {
  1485. console.log('WebSocket 连接已关闭');
  1486. };
  1487. }
  1488. };
  1489. connectWebSocket();
  1490. }
  1491. //如果是等待,就要设置另一台无人机继续飞行
  1492. function conflict_wait(){
  1493. }
  1494. function conflict_fly(params){
  1495. let uavid = params.uavid;
  1496. let skip_route_id = params.skip_route_id;
  1497. let distance = params.distance;
  1498. getAvoidRoute({
  1499. uavid:uavid,
  1500. skip_route_id:skip_route_id,
  1501. distance:distance
  1502. }).then(res =>{
  1503. console.log("临时路线",res);
  1504. pathPipe({
  1505. "id": uavid+'_change',
  1506. "status": "show",
  1507. "paths":[res.data.data.pathAll],
  1508. "color": "#438EDB",
  1509. "intensity": 1.2,
  1510. "pipeRadius": 5
  1511. });
  1512. debugger
  1513. getRealFlyPoint({
  1514. flyList:{
  1515. "path": res.data.data.pathAll,
  1516. "avoidanceType":"avoid",
  1517. "uavid": uavid
  1518. }
  1519. })
  1520. })
  1521. }
  1522. function changePointStatus(params){
  1523. flyGLTFInstances[params.uavid].followPath(params.isFollow);
  1524. }
  1525. //ws 推送方法
  1526. function getRealPower(params){
  1527. const connectWebSocket = () => {
  1528. socket = new WebSocket('ws://58.34.215.19:19259/gridSearchWebSocket');
  1529. socket.onopen = () => {
  1530. console.log('WebSocket 连接成功');
  1531. socket.send(JSON.stringify({
  1532. "locationPoint": {
  1533. "mapX": 6454.080981250964,
  1534. "mapY": 5487.978352845347
  1535. },
  1536. "radiusInMeters": 5000,
  1537. "minZ": 1,
  1538. "maxZ": 120,
  1539. "routes": [
  1540. ],
  1541. "fields":["gridCode","x","y","z"],
  1542. "scrollPage": {
  1543. "pageIndex": 1,
  1544. "pageSize": 10000,
  1545. "scrollId": ""
  1546. },
  1547. "level":20,
  1548. "className":"LowAltitudeGrid"
  1549. }));
  1550. };
  1551. socket.onmessage = (messageEvent) => {
  1552. let messages = JSON.parse(messageEvent.data);
  1553. messages.data.list.forEach((point) =>{
  1554. point.color = [0, 1, 1];
  1555. });
  1556. console.log("messages.data.list",messages.data.list)
  1557. let para = {
  1558. "id":"1",
  1559. "status":"show",
  1560. "size":{
  1561. x:46,
  1562. y:54,
  1563. z:53
  1564. },
  1565. "points":messages.data.list,
  1566. }
  1567. showThreeCubeDetail(para);
  1568. };
  1569. socket.onerror = (error) => {
  1570. console.error('WebSocket 出错:', error);
  1571. };
  1572. socket.onclose = () => {
  1573. console.log('WebSocket 连接已关闭');
  1574. };
  1575. };
  1576. connectWebSocket();
  1577. }
  1578. function getRealPower2(params){
  1579. let id = params.id;
  1580. let lastId = params.lastId;
  1581. let status = params.status;
  1582. let level = params.level;
  1583. let center = params.center;
  1584. let radius = params.radius;
  1585. let minZ = params.minZ;
  1586. let maxZ = params.maxZ;
  1587. let size = params.size;
  1588. let fields = params.fields;
  1589. currentShowGridId = id;
  1590. showThreeCubeDetail({
  1591. id:id,
  1592. status:"hide"
  1593. });
  1594. showThreeCubeDetail({
  1595. id:lastId,
  1596. status:"hide"
  1597. });
  1598. if(status == "hide"){
  1599. currentShowGridId = null;
  1600. return
  1601. }
  1602. getSixPowerPoints({
  1603. id,
  1604. "x": center.x,
  1605. "y": center.y,
  1606. status,
  1607. radius,
  1608. size,
  1609. minZ,
  1610. maxZ,
  1611. level,
  1612. fields,
  1613. scrollId:""
  1614. });
  1615. }
  1616. // 递归获取权重数据
  1617. function getSixPowerPoints(params) {
  1618. getPowerPoint({
  1619. x: params.x,
  1620. y: params.y,
  1621. radius:params.radius,
  1622. minZ:params.minZ,
  1623. maxZ:params.maxZ,
  1624. level: params.level,
  1625. fields: params.fields,
  1626. scrollId: params.scrollId,
  1627. }).then(res =>{
  1628. if(currentShowGridId == params.id){
  1629. if(res.data.data.list?.length >= 100000 && res.data.data.scrollId){
  1630. // res.data.data.list.forEach((point) =>{
  1631. // point.color = [0, 1, 1];
  1632. // });
  1633. // res.data.data.list.forEach((item)=>{
  1634. // item.color = getColor(item.averageValue, -50, 50);
  1635. // })
  1636. showThreeCubeDetail({
  1637. "id":params.id,
  1638. "status":params.status,
  1639. "size":params.size,
  1640. "points":res.data.data.list,
  1641. })
  1642. params.scrollId = res.data.data.scrollId;
  1643. getSixPowerPoints(params);
  1644. }else{
  1645. if(res.data.data.list?.length > 0){
  1646. showThreeCubeDetail({
  1647. "id":params.id,
  1648. "status":params.status,
  1649. "size":params.size,
  1650. "points":res.data.data.list,
  1651. })
  1652. }
  1653. }
  1654. }
  1655. })
  1656. }
  1657. //需要添加初始路径(手动绘制和自动绘制)结果
  1658. function draw(params){
  1659. let id = params.id;
  1660. let geometryType = params.type;
  1661. let status = params.status;
  1662. let path = params.path;
  1663. let hasZ = params.hasZ;
  1664. let symbol = params.symbol;
  1665. let clear = true;
  1666. if(params.clear !== undefined){
  1667. clear = params.clear;
  1668. }
  1669. if(clear){
  1670. if(addDrawEvent){
  1671. addDrawEvent.clear();
  1672. addDrawEvent = null;
  1673. }
  1674. }
  1675. if(status == "hide"){
  1676. return
  1677. }
  1678. if(!addDrawEvent){
  1679. addDrawEvent = new AddDrawEvent({
  1680. view:m_view,
  1681. type:geometryType,
  1682. symbol,
  1683. path:path,
  1684. hasZ
  1685. });
  1686. addDrawEvent.start(symbol,geometryType);
  1687. }else{
  1688. addDrawEvent.start(symbol,geometryType);
  1689. }
  1690. if(path){
  1691. addDrawEvent.update();
  1692. }
  1693. addDrawEvent.createListenerEvent((geometry) =>{
  1694. bus.emit('SendMessage',{
  1695. action:"DrawComplete",
  1696. data:{
  1697. "geometry":geometry
  1698. }
  1699. })
  1700. });
  1701. addDrawEvent.updateListenerEvent((geometry) =>{
  1702. bus.emit('SendMessage',{
  1703. action:"DrawComplete",
  1704. data:{
  1705. "geometry":geometry
  1706. }
  1707. })
  1708. });
  1709. }
  1710. //态势评估
  1711. function situationAssessment(params){
  1712. routeList.list.forEach((item) =>{
  1713. pathPipe({
  1714. id: item.id,
  1715. paths: [item.path],
  1716. color:item.color,
  1717. status: params.status,
  1718. "intensity": 1.2,
  1719. "pipeRadius": 10
  1720. })
  1721. })
  1722. featurePointsPlotting({
  1723. status: params.status,
  1724. data:routeList.points
  1725. });
  1726. routeList.uavList.forEach((item) =>{
  1727. item.status = params.status =="show"?1:3
  1728. })
  1729. //先加载所有的无人机和航线
  1730. getRealFlyPoint({
  1731. status: params.status,
  1732. flyList:params.status=="show"?[]:routeList.uavList
  1733. })
  1734. }
  1735. function draw_GeometryMeshPrismEffect(params){
  1736. let geometryType = params.type;
  1737. let status = params.status;
  1738. let startHeight = params.startHeight;
  1739. let items = params.items;
  1740. if(addDrawEvent){
  1741. addDrawEvent.clear();
  1742. addDrawEvent = null;
  1743. }
  1744. if(draw_GeometryMeshPrismEffectEvent){
  1745. draw_GeometryMeshPrismEffectEvent.clear();
  1746. draw_GeometryMeshPrismEffectEvent = null;
  1747. }
  1748. let f_layer = m_map.layers.find(item => item.id === "geometryMeshPrismEffect");
  1749. if (f_layer) {
  1750. m_map.remove(f_layer);
  1751. }
  1752. if(status == "hide"){
  1753. return
  1754. }
  1755. addDrawEvent = new AddDrawEvent({
  1756. view:m_view,
  1757. type:geometryType
  1758. })
  1759. addDrawEvent.start();
  1760. addDrawEvent.createListenerEvent((geometry)=>{
  1761. if(draw_GeometryMeshPrismEffectEvent){
  1762. draw_GeometryMeshPrismEffectEvent.clear();
  1763. draw_GeometryMeshPrismEffectEvent = null;
  1764. }
  1765. draw_GeometryMeshPrismEffectEvent = new GeometryMeshPrismEffect({
  1766. view:m_view,
  1767. m_map,
  1768. items:items,
  1769. startHeight:startHeight,
  1770. rings:geometry.rings
  1771. });
  1772. m_map.add(draw_GeometryMeshPrismEffectEvent.graphicsLayer);
  1773. })
  1774. addDrawEvent.updateListenerEvent((geometry)=>{
  1775. if(draw_GeometryMeshPrismEffectEvent){
  1776. draw_GeometryMeshPrismEffectEvent.clear();
  1777. draw_GeometryMeshPrismEffectEvent = null;
  1778. }
  1779. draw_GeometryMeshPrismEffectEvent = new GeometryMeshPrismEffect({
  1780. view:m_view,
  1781. m_map,
  1782. items:items,
  1783. startHeight:startHeight,
  1784. rings:geometry.rings
  1785. });
  1786. m_map.add(draw_GeometryMeshPrismEffectEvent.graphicsLayer);
  1787. })
  1788. }
  1789. function symbolPathPipe(params){
  1790. let status = params.status;
  1791. let f_layer = m_map.layers.find(item => item.id === "symbolPathPipeEvent");
  1792. if (f_layer) {
  1793. m_map.remove(f_layer);
  1794. }
  1795. if(status == "hide"){
  1796. return
  1797. }
  1798. // params.paths = Path.paths
  1799. symbolPathPipeEvent = new SymbolPathPipeEvent({
  1800. view:m_view,
  1801. paths:params.paths,
  1802. })
  1803. m_map.add(symbolPathPipeEvent.graphicsLayer);
  1804. }
  1805. function symbolPointCube(params){
  1806. let status = params.status;
  1807. let f_layer = m_map.layers.find(item => item.id === "symbolPointCubeEvent");
  1808. if (f_layer) {
  1809. m_map.remove(f_layer);
  1810. }
  1811. if(status == "hide"){
  1812. return
  1813. }
  1814. symbolPointCubeEvent = new SymbolPointCubeEvent({
  1815. view:m_view,
  1816. points:params.points,
  1817. size:params.size,
  1818. })
  1819. m_map.add(symbolPointCubeEvent.graphicsLayer);
  1820. }
  1821. function featurePointsPlotting(params){
  1822. let status = params.status;
  1823. let f_layer = m_map.layers.find(item => item.id === "featurePointsPlottingEvent");
  1824. if (f_layer) {
  1825. m_map.remove(f_layer);
  1826. }
  1827. if(status == "hide"){
  1828. return
  1829. }
  1830. //params.data = Path.paths_point;
  1831. featurePointsPlottingEvent = new FeaturePointsPlottingEvent({
  1832. view:m_view,
  1833. data:params.data
  1834. })
  1835. m_map.add(featurePointsPlottingEvent.featureLayer);
  1836. }
  1837. function featurePolygonPlotting(params){
  1838. let status = params.status;
  1839. let id = params.id;
  1840. let f_layer = m_map.layers.find(item => item.id === id);
  1841. if (f_layer) {
  1842. m_map.remove(f_layer);
  1843. }
  1844. if(status == "hide"){
  1845. return
  1846. }
  1847. featurePointsPlottingEvent = new FeaturePolygonPlottingEvent({
  1848. id,
  1849. view:m_view,
  1850. data:params.data
  1851. });
  1852. }
  1853. })
  1854. }
  1855. }
  1856. </script>
  1857. <style scoped lang="scss">
  1858. #map_jk,#mapDiv,#viewDiv{
  1859. height: 100%;
  1860. }
  1861. :deep(.esri-view-surface--touch-none::after){
  1862. outline: none !important;
  1863. }
  1864. </style>