老司机91精品网站在线观看_久久69精品久久久久久hb_成人欧美在线观看_免费一级日本c片完整版

首頁(yè)>股票 > 正文

數(shù)據(jù)可視化【原創(chuàng)】vue+arcgis+threejs 實(shí)現(xiàn)流光邊界線效果

2023-08-31 15:53:40    出處:博客園

本文適合對(duì)vue,arcgis4.x,threejs,ES6較熟悉的人群食用。

效果圖:


(資料圖)

素材:

主要思路:

先用arcgisexternalRenderers封裝了一個(gè)ExternalRendererLayer,在里面把a(bǔ)rcgis和threejs的context關(guān)聯(lián),然后再寫(xiě)個(gè)子類繼承它,這部分類容在上一個(gè)帖子里面有講過(guò)。

子類AreaLayer繼承它,并在里面實(shí)現(xiàn)繪制流光邊界線的方法,我這里其實(shí)就是繪制城市區(qū)域的邊界線。嘗試過(guò)直線LineCurve3,三維二次貝塞爾曲線QuadraticBezierCurve3,三維三次貝塞爾曲線CubicBezierCurve3,結(jié)果感覺(jué)差不多=_=,所以最后還是用CatmullRomCurve3這個(gè)來(lái)構(gòu)建管道,這個(gè)類使用也比其他的方便。

1:創(chuàng)建一個(gè)基于圖片的材質(zhì)

1 const lineImg = require("../../../../public/static/img/line.png") 2         let lineTexture = new THREE.TextureLoader().load(lineImg) 3         lineTexture.wrapS = lineTexture.wrapT = THREE.RepeatWrapping; //每個(gè)都重復(fù) 4         lineTexture.repeat.set(1, 1) 5         lineTexture.needsUpdate = true 6          7         let lineMaterial = new THREE.MeshBasicMaterial({ 8             map: lineTexture, 9             side: THREE.DoubleSide,10             transparent: true11         })

2:處理坐標(biāo)轉(zhuǎn)換數(shù)據(jù)

1 let linePoints = []2         for(let i = 0; i < pointList.length; i++) {3             var item = pointList[i];4             var renderLinePoints = this.lngLatToXY(this.view, [item[0], item[1], 10]);5             var vector3List = renderLinePoints.vector3List;6             7             linePoints.push(new THREE.Vector3(vector3List.x, vector3List.y, vector3List.z));8         }

3:構(gòu)建TubeGeometry,創(chuàng)建Mesh

1 const curvePath = new THREE.CatmullRomCurve3(linePoints) // 曲線路徑2         3         let geometry = new THREE.TubeGeometry(curvePath, 64, 30, 8, true )4         let lineMesh = new THREE.Mesh(geometry, lineMaterial);

4:最后再updateModels里面更新貼圖的位置(其實(shí)就是render事件)。

1 updateModels(context) {2         super.updateModels(context);3         4         if (this.textures.length > 0) {5             this.textures.forEach(texture => {6                 if (texture) texture.offset.x -= 0.01;7             })8         }9     }

ExternalRendererLayer:

1 import * as THREE from "three"  2 import Stats from "three/examples/jsm/libs/stats.module.js"  3 import * as webMercatorUtils from "@arcgis/core/geometry/support/webMercatorUtils"  4 import * as externalRenderers from "@arcgis/core/views/3d/externalRenderers"  5   6 export default class ExternalRendererLayer {  7     constructor({  8         view,  9         options 10     }) { 11         this.view = view 12         this.options = options 13  14         this.objects = [] 15         this.scene = null 16         this.camera = null 17         this.renderer = null 18          19         this.setup(); 20     } 21      22     setup() { 23         if (process.env.NODE_ENV !== "production") { 24             const sid = setTimeout(() => { 25                 clearTimeout(sid) 26                 //構(gòu)建幀率查看器 27                 let stats = new Stats() 28                 stats.setMode(0) 29                 stats.domElement.style.position = "absolute" 30                 stats.domElement.style.left = "0px" 31                 stats.domElement.style.top = "0px" 32                 document.body.appendChild(stats.domElement) 33                 function render() { 34                   stats.update() 35                   requestAnimationFrame(render) 36                 } 37                 render() 38             }, 5000) 39         } 40     } 41  42     apply() { 43         let myExternalRenderer = { 44             setup: context => { 45                 this.createSetup(context) 46             }, 47             render: context => { 48                 this.createRender(context) 49             } 50         } 51          52         externalRenderers.add(this.view, myExternalRenderer); 53     } 54  55     createSetup(context) { 56         this.scene = new THREE.Scene(); // 場(chǎng)景 57         this.camera = new THREE.PerspectiveCamera(); // 相機(jī) 58  59         this.setLight(); 60  61         // 添加坐標(biāo)軸輔助工具 62         const axesHelper = new THREE.AxesHelper(10000000); 63         this.scene.Helpers = axesHelper; 64         this.scene.add(axesHelper); 65  66         this.renderer = new THREE.WebGLRenderer({ 67             context: context.gl, // 可用于將渲染器附加到已有的渲染環(huán)境(RenderingContext)中 68             premultipliedAlpha: false, // renderer是否假設(shè)顏色有 premultiplied alpha. 默認(rèn)為true 69             // antialias: true 70             // logarithmicDepthBuffer: false 71             // logarithmicDepthBuffer: true  72         }); 73         this.renderer.setPixelRatio(window.devicePixelRatio); // 設(shè)置設(shè)備像素比。通常用于避免HiDPI設(shè)備上繪圖模糊 74         this.renderer.setViewport(0, 0, this.view.width, this.view.height); // 視口大小設(shè)置 75          76         // 防止Three.js清除ArcGIS JS API提供的緩沖區(qū)。 77         this.renderer.autoClearDepth = false; // 定義renderer是否清除深度緩存 78         this.renderer.autoClearStencil = false; // 定義renderer是否清除模板緩存 79         this.renderer.autoClearColor = false; // 定義renderer是否清除顏色緩存 80         // this.renderer.autoClear = false; 81          82         // ArcGIS JS API渲染自定義離屏緩沖區(qū),而不是默認(rèn)的幀緩沖區(qū)。 83         // 我們必須將這段代碼注入到three.js運(yùn)行時(shí)中,以便綁定這些緩沖區(qū)而不是默認(rèn)的緩沖區(qū)。 84         const originalSetRenderTarget = this.renderer.setRenderTarget.bind( 85             this.renderer 86         ); 87         this.renderer.setRenderTarget = target => { 88             originalSetRenderTarget(target); 89             if (target == null) { 90                 // 綁定外部渲染器應(yīng)該渲染到的顏色和深度緩沖區(qū) 91                 context.bindRenderTarget(); 92             } 93         }; 94          95         this.addModels(context); 96  97         context.resetWebGLState(); 98     } 99 100     createRender(context) {101         const cam = context.camera;102         this.camera.position.set(cam.eye[0], cam.eye[1], cam.eye[2]);103         this.camera.up.set(cam.up[0], cam.up[1], cam.up[2]);104         this.camera.lookAt(105             new THREE.Vector3(cam.center[0], cam.center[1], cam.center[2])106         );107         // this.camera.near = 1;108         // this.camera.far = 100;109 110         // 投影矩陣可以直接復(fù)制111         this.camera.projectionMatrix.fromArray(cam.projectionMatrix);112         113         this.updateModels(context);114 115         this.renderer.state.reset();116 117         context.bindRenderTarget();118 119         this.renderer.render(this.scene, this.camera);120 121         // 請(qǐng)求重繪視圖。122         externalRenderers.requestRender(this.view);123 124         // cleanup125         context.resetWebGLState();126     }127     128     //經(jīng)緯度坐標(biāo)轉(zhuǎn)成三維空間坐標(biāo)129     lngLatToXY(view, points) {130     131         let vector3List; // 頂點(diǎn)數(shù)組132     133         let pointXYs;134     135     136         // 計(jì)算頂點(diǎn)137         let transform = new THREE.Matrix4(); // 變換矩陣138         let transformation = new Array(16);139     140         // 將經(jīng)緯度坐標(biāo)轉(zhuǎn)換為xy值\141         let pointXY = webMercatorUtils.lngLatToXY(points[0], points[1]);142     143         // 先轉(zhuǎn)換高度為0的點(diǎn)144         transform.fromArray(145             externalRenderers.renderCoordinateTransformAt(146                 view,147                 [pointXY[0], pointXY[1], points[148                     2]], // 坐標(biāo)在地面上的點(diǎn)[x值, y值, 高度值]149                 view.spatialReference,150                 transformation151             )152         );153     154         pointXYs = pointXY;155     156         vector3List =157             new THREE.Vector3(158                 transform.elements[12],159                 transform.elements[13],160                 transform.elements[14]161             )162     163         return {164             vector3List: vector3List,165             pointXYs: pointXYs166         };167     }168     169     setLight() {170         console.log("setLight")171         let ambient = new THREE.AmbientLight(0xffffff, 0.7);172         this.scene.add(ambient);173         let directionalLight = new THREE.DirectionalLight(0xffffff, 0.7);174         directionalLight.position.set(100, 300, 200);175         this.scene.add(directionalLight);176     }177     178     addModels(context) {179         console.log("addModels")180     }181     182     updateModels(context) {183         // console.log("updateModels")184     }185     186 }
View Code

AreaLayer:源碼中mapx.queryTask是封裝了arcgis的query查詢,這個(gè)可以替換掉,我只是要接收返回的rings數(shù)組,自行構(gòu)建靜態(tài)數(shù)據(jù)也行

1 import * as THREE from "three"  2 import ExternalRendererLayer from "./ExternalRendererLayer.js"  3 import Graphic from "@arcgis/core/Graphic";  4 import SpatialReference from "@arcgis/core/geometry/SpatialReference"  5 import * as externalRenderers from "@arcgis/core/views/3d/externalRenderers"  6   7 import mapx from "@/utils/mapUtils.js";  8   9 export default class AreaLayer extends ExternalRendererLayer { 10     constructor({ 11         view, 12         options 13     }) { 14         super({ 15             view, 16             options 17         }) 18     } 19      20     setup() { 21         super.setup() 22          23         this.textures = [] 24     } 25  26     addModels(context) { 27         // super.addModels(context) 28         // =====================mesh加載=================================// 29         const url = config.mapservice[1].base_url + config.mapservice[1].jd_url; 30         // const url = "http://10.100.0.132:6080/arcgis/rest/services/wuchang_gim/gim_region/MapServer/2"; 31         mapx.queryTask(url, { 32             where: "1=1", 33             returnGeometry: true 34         }).then(featureSet => { 35             if (featureSet.length > 0) { 36                 featureSet.forEach(feature => { 37                     const polygon = feature.geometry; 38                     const rings = polygon.rings; 39                     rings.forEach(ring => { 40                         this._addModel(ring); 41                     }) 42                 }) 43             } 44         }).catch(error => { 45             console.log(error) 46         }) 47     } 48      49     _addModel(pointList) { 50         const lineImg = require("../../../../public/static/img/line.png") 51         let lineTexture = new THREE.TextureLoader().load(lineImg) 52         lineTexture.wrapS = lineTexture.wrapT = THREE.RepeatWrapping; //每個(gè)都重復(fù) 53         lineTexture.repeat.set(1, 1) 54         lineTexture.needsUpdate = true 55          56         let lineMaterial = new THREE.MeshBasicMaterial({ 57             map: lineTexture, 58             side: THREE.DoubleSide, 59             transparent: true 60         }) 61          62         //確定幾何體位置 63         let linePoints = [] 64         // let curvePath = new THREE.CurvePath(); 65         for(let i = 0; i < pointList.length; i++) { 66             var item = pointList[i]; 67             var renderLinePoints = this.lngLatToXY(this.view, [item[0], item[1], 10]); 68             var vector3List = renderLinePoints.vector3List; 69              70             linePoints.push(new THREE.Vector3(vector3List.x, vector3List.y, vector3List.z)); 71              72             // if(i < pointList.length - 1) { 73             //     var item1 = pointList[i + 1]; 74             //     var renderLinePoints1 = this.lngLatToXY(this.view, [item1[0], item1[1], 10]); 75             //     var vector3List1 = renderLinePoints1.vector3List; 76                  77             //     // var item2 = pointList[i + 1]; 78             //     // var renderLinePoints2 = this.lngLatToXY(this.view, [item2[0], item2[1], 10]); 79             //     // var vector3List2 = renderLinePoints2.vector3List; 80                  81             //     const line = new THREE.LineCurve3(vector3List, vector3List1); 82             //     // const line = new THREE.QuadraticBezierCurve3(vector3List, vector3List1, vector3List2); 83             //     curvePath.curves.push(line) 84             // } 85         } 86          87         // console.log(curvePath) 88          89         // CatmullRomCurve3創(chuàng)建一條平滑的三維樣條曲線 90         const curvePath = new THREE.CatmullRomCurve3(linePoints) // 曲線路徑 91          92         let geometry = new THREE.TubeGeometry(curvePath, 64, 30, 8, true ) 93         let lineMesh = new THREE.Mesh(geometry, lineMaterial); 94          95         this.scene.add(lineMesh); 96          97         this.textures.push(lineTexture); 98         this.objects.push(lineMesh); 99     }100 101 102     updateModels(context) {103         super.updateModels(context);104         105         if (this.textures.length > 0) {106             this.textures.forEach(texture => {107                 if (texture) texture.offset.x -= 0.01;108             })109         }110     }111 112 }
View Code

關(guān)鍵詞:

相關(guān)內(nèi)容

消費(fèi)
產(chǎn)業(yè)
百度AI大模型文心一言向全社會(huì)開(kāi)放 可體驗(yàn)生成式AI 百度近日宣布,其AI大模型“文心一言”已全面向全社會(huì)開(kāi)放,用戶可從蘋
天下之無(wú)道也久矣天將以夫子為木鐸是什么意思 0471房產(chǎn)來(lái)為大家解答以上的問(wèn)題。天下之無(wú)道也久矣天將以夫子為木鐸是
河北臨漳開(kāi)展2023年“招才引智”活動(dòng) 為引導(dǎo)暑期“返家鄉(xiāng)”大學(xué)生關(guān)注家鄉(xiāng)發(fā)展、了解家鄉(xiāng)政策,學(xué)成后能夠回
9月4日起??濱河?xùn)|、西路早晚高峰期限行調(diào)流措施恢復(fù) 9月4日起濱河?xùn)|、西路早晚高峰期限行調(diào)流措施恢復(fù),主流媒體,山西門戶。
基金
老司机91精品网站在线观看_久久69精品久久久久久hb_成人欧美在线观看_免费一级日本c片完整版

      亚洲国产视频直播| 成人综合在线视频| 久久综合九色综合97婷婷| 亚洲视频在线一区| 在线免费观看日本欧美| 久久久久国产精品人| 婷婷开心激情综合| 91在线观看免费视频| 一区二区久久久久| 精品国产免费人成在线观看| 亚洲国产欧美日韩另类综合| 国产精品77777竹菊影视小说| 国产精品久久久久影院色老大| 在线视频欧美精品| 国产精品久久99| 欧美日韩久久一区二区| 国产精品久久久99| 国产自产视频一区二区三区| 国产精品女主播av| 8x8x8国产精品| 成人免费小视频| 国产酒店精品激情| 一区二区三区四区不卡在线 | 成人欧美一区二区三区| 欧美电影在哪看比较好| 成人免费在线播放视频| 国产精品小仙女| 一区二区三区在线不卡| 久久免费看少妇高潮| 日本视频一区二区| 国产精品人人做人人爽人人添| 7777女厕盗摄久久久| 一区二区视频免费在线观看| 成人国产精品免费网站| 色婷婷精品大视频在线蜜桃视频| 国产精品美女久久久久av爽李琼| 国产伦精一区二区三区| 一区二区免费在线| 日本一区二区综合亚洲| 国产一区二区精品久久99| 一区二区三区.www| 日本一区二区三区四区在线视频| 国产一区二区日韩精品| 亚洲成av人片| 亚洲婷婷综合久久一本伊一区| 成人免费视频视频| 在线视频中文字幕一区二区| 一区二区高清视频在线观看| 久久久精品日韩欧美| 欧美区视频在线观看| 性感美女久久精品| 国产精品免费视频观看| 欧美精品一区视频| 国产一区在线观看视频| 天天影视网天天综合色在线播放 | 欧美日韩亚洲综合| 亚洲一区在线观看免费| 欧美国产1区2区| 精品国产乱码久久久久久图片| 精品一区二区免费看| 亚洲韩国一区二区三区| 亚洲视频小说图片| 久久欧美中文字幕| 91精品在线免费| 卡一卡二国产精品| 亚洲va韩国va欧美va| 亚洲欧美激情视频在线观看一区二区三区| 99久久精品久久久久久清纯| 欧美日韩国产区一| 日韩不卡一二三区| 亚洲最大成人网4388xx| 亚洲免费高清视频在线| 国产精品视频九色porn| 国产亚洲欧美在线| 9久草视频在线视频精品| 91精品免费在线| 蓝色福利精品导航| 一本在线高清不卡dvd| 一区二区三区四区精品在线视频 | 久久久99久久| 日韩精品一区二区三区中文不卡 | 亚洲柠檬福利资源导航| 国产精品久久久久一区二区三区 | 91亚洲精品久久久蜜桃| 91精品久久久久久久99蜜桃| 国产美女精品人人做人人爽| 欧美另类变人与禽xxxxx| 久久99蜜桃精品| 在线亚洲人成电影网站色www| 日日夜夜精品视频免费| 亚洲国产中文字幕在线视频综合| 亚洲自拍另类综合| 亚洲蜜臀av乱码久久精品| 亚洲欧美另类综合偷拍| 中文字幕视频一区| 亚洲免费av高清| 亚洲欧美色一区| 亚洲六月丁香色婷婷综合久久| 中文字幕欧美一| 亚洲免费观看视频| 亚洲美女精品一区| 亚洲国产精品自拍| 亚洲国产综合色| 青青国产91久久久久久| 欧美亚洲尤物久久| 韩国精品免费视频| 欧美一区二区三区在线观看| 成人一区二区视频| 国产精品欧美一区喷水| 国产精品成人一区二区艾草 | 亚洲国产日韩精品| 一本色道久久综合精品竹菊| 日本不卡高清视频| 欧美日韩一级黄| 国产99久久久国产精品潘金网站| 日韩小视频在线观看专区| eeuss影院一区二区三区| 久久精品欧美一区二区三区不卡| 久久精品夜色噜噜亚洲aⅴ| 亚洲欧洲日产国产综合网| 亚洲视频免费在线观看| 亚洲va欧美va人人爽| 在线看不卡av| 国产精品性做久久久久久| 欧美精品一区二区不卡| 国产午夜精品一区二区三区嫩草| 亚洲色图欧美偷拍| 亚洲午夜三级在线| 久久av老司机精品网站导航| 91精品欧美综合在线观看最新 | 国产亚洲精品aa| 一区在线播放视频| 五月综合激情婷婷六月色窝| 欧美酷刑日本凌虐凌虐| 99久久精品免费| 亚洲欧美另类久久久精品| 亚洲mv大片欧洲mv大片精品| 国产一区二区三区免费| 久久人人97超碰com| 亚洲欧美综合在线精品| 日韩电影在线看| 日韩视频在线你懂得| 久久精品日韩一区二区三区| 樱花草国产18久久久久| 91久久精品网| 99在线精品一区二区三区| 成人欧美一区二区三区视频网页| 亚洲国产美女搞黄色| 国产一区二区精品久久99| 国产欧美一区二区三区沐欲| 伊人开心综合网| 国产精品一二三四五| 欧美韩国一区二区| 亚洲成人动漫av| 国产999精品久久久久久绿帽| 国产精品嫩草99a| 亚洲不卡av一区二区三区| 丁香一区二区三区| 亚洲欧美自拍偷拍色图| 在线观看成人免费视频| 91色婷婷久久久久合中文| 一级女性全黄久久生活片免费| 欧美精品一二三四| 国产精品天天摸av网| 蜜臀av亚洲一区中文字幕| 精品999久久久| 夜夜精品视频一区二区| 风间由美中文字幕在线看视频国产欧美 | 中文字幕亚洲视频| 久久99国内精品| 国产欧美日韩另类视频免费观看| 亚洲一卡二卡三卡四卡无卡久久| 国产高清不卡一区二区| 亚洲天堂av老司机| 欧美酷刑日本凌虐凌虐| 亚洲欧洲一区二区在线播放| 精品一区二区三区免费毛片爱| 日本一区二区视频在线观看| 在线观看中文字幕不卡| 久久久午夜精品理论片中文字幕| 日本va欧美va瓶| 国产欧美日韩亚州综合| 欧美午夜精品一区二区三区| 国产日韩欧美不卡在线| 蜜臀久久99精品久久久久久9 | 国产精品一二二区| 亚洲男同性视频| 日韩午夜电影av| 亚洲综合色噜噜狠狠| eeuss鲁片一区二区三区| 亚洲成人av资源| 久久精品一二三| 在线观看日韩电影| 国产精品每日更新在线播放网址| 国产自产视频一区二区三区| 一区二区三区鲁丝不卡| 精品国产人成亚洲区| 在线视频综合导航| 一区二区中文字幕在线| 成人动漫一区二区|