位置: IT常识 - 正文

【THREE.JS学习(3)】使用THREEJS加载GeoJSON地图数据(three.js 教程)

编辑:rootadmin
【THREE.JS学习(3)】使用THREEJS加载GeoJSON地图数据

推荐整理分享【THREE.JS学习(3)】使用THREEJS加载GeoJSON地图数据(three.js 教程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:three.js 入门,three.js入门指南,three.js中文教程,three.js bim,three.js中文教程,three.js 教程,three.js入门指南,three.js 教程,内容如对您有帮助,希望把文章链接给更多的朋友!

本文接着系列文章(2)进行介绍,以VUE2为开发框架,该文涉及代码存放在HelloWorld.vue中。

相较于上一篇文章对div命名class等,该文简洁许多。

<template><div></div></template>

接着引入核心库

import * as THREE from "three"import {OrbitControls} from "three/examples/jsm/controls/OrbitControls"import * as d3 from "d3"import Stats from "three/examples/jsm/libs/stats.module.js";

其中,{OrbitControls}为控制器,加载后可以通过鼠标来移动加载数据的方向、放缩等

Three.js中的坐标系是以单位为米(m)的坐标系,而在地理数据中,如Geojson使用的是经纬度作为坐标系,所以在使用、加载的过程中需要对数据进行坐标转换,才能够正确的显示地理数据。

而D3.js提供了投影函数能够将Geojson中的经纬度转换为目标格式的数据。

//安装D3.jsnpm install d3

下面的代码展示了使用D3.js将经纬度数据转化为Three.js中的坐标系

//使用墨卡托投影var projection = d3.geoMercator()    //地图投影的中心位置.center([0, 0])    //地图投影的偏移量.translate([0, 0]).scale(1);var path = d3.geoPath().projection(projection);var coords = [-122.4194, 37.7749]; // 经纬度坐标var point = projection(coords); // 将经纬度转换为 Three.js 中的坐标系

{Stats}可以创建一个性能监测器,并将其显示在页面中。

【THREE.JS学习(3)】使用THREEJS加载GeoJSON地图数据(three.js 教程)

stats 库是一个可以用于监测JavaScript性能的工具库。它可以跟踪帧率(FPS)、渲染时间和内存使用情况等信息。在开发过程中,这些信息可以帮助开发者了解应用程序的性能表现,并且有助于识别和优化潜在的性能瓶颈。

下面开始介绍如何加载

STEP 1 :{相机、场景、渲染器} 依旧是最重要的步骤

//将这样对环境初始化的步骤封装成一个函数initTHREE()initTHREE(){this.scene = new THREE.Scene();this.camera = new THREE.PerspectiveCamera(90,window.innerHeight/window.innerWidth,0.1,1000)this.camera.position.set(0,0,100)this.camera.aspect = window.innerWidth / window.innerHeight;this.camera.updateProjectionMatrix();this.scene.add(this.camera)// 加入坐标轴// this.axesHelper = new THREE.AxesHelper(5);// this.scene.add(this.axesHelper)// 加载渲染器this.renderer = new THREE.WebGLRenderer({alpha:true})this.renderer.setSize(window.innerWidth,window.innerHeight)// 将渲染器添加到bodydocument.body.appendChild(this.renderer.domElement);// 初始化控制器 可以旋转this.controls = new OrbitControls(this.camera,this.renderer.domElement)      // 创建地图对象this.map = new THREE.Object3D();this.directionalLight = new THREE.DirectionalLight(0xffffff,0.5)this.scene.add(this.directionalLight)this.light = new THREE.AmbientLight(0xffffff,0.5)this.scene.add(this.light)}

STEP 2:创建地理对象

和mapbox、cesium之类的webgis加载数据不同(原理差不多),不能直接加载json数据,然后直接显示,需要我们对Json数据进行解析,然后按照一定的方式来生成图像。

首先,加载文件

this.loader = new THREE.FileLoader();this.loader.load('xxx.json',(data)=>{})

接着,对加载的文件进行处理

//数据格式化this.jsonData = JSON.parse(data)//创建坐标系、获取数据对象const projection1 = d3.geoMercator().center([0, 0]).translate([0, 0]).scale(1);const features = this.jsonData.features;//对features进行遍历features.forEach((feature) => {// 单个省份 对象const province = new THREE.Object3D();// 地址province.properties = feature.properties.name;// 坐标数组const coordinates = feature.geometry.coordinates;const color = "#99ff99";if (feature.geometry.type === "MultiPolygon") {// 多个,多边形coordinates.forEach((coordinate) => {// coordinate 多边形数据coordinate.forEach((rows) => {        //对坐标点数据进行处理const mesh = this.drawExtrudeMesh(rows, color, projection1);mesh.properties = feature.properties.name;province.add(mesh);});});}this.map.add(province);});

坐标处理,构建平面,再通过ExtrudeGeometry拉伸高度

drawExtrudeMesh(polygon, color, projection){const shape = new THREE.Shape();polygon.forEach((row, i) => {const [x, y] = projection(row);if (i === 0) {// 创建起点,使用moveTo方法// 因为计算出来的y是反过来,所以要进行颠倒shape.moveTo(x, -y);}shape.lineTo(x, -y);});// 拉伸const geometry = new THREE.ExtrudeGeometry(shape, {depth: 5,bevelEnabled: true,});// 随机颜色const randomColor = (0.5 + Math.random() * 0.5) * 0xffffff;const material = new THREE.MeshBasicMaterial({color: randomColor,transparent: true,opacity: 0.5,});return new THREE.Mesh(geometry, material);}

STEP 3:开始渲染

animate(){this.controls.update()this.stats.update()//const clock = new THREE.Clock();//this.deltaTime = clock.getDelta()requestAnimationFrame(this.animate)this.renderer.render(this.scene,this.camera)},

加载结果

源码回头传到github上。

https://github.com/1996HZP/THREE_3dCHina

本文链接地址:https://www.jiuchutong.com/zhishi/295952.html 转载请保留说明!

上一篇:网页表单文本框的自动填写(四种方法)(网页单行文本框)

下一篇:uniapp面试基础(uniapp前端面试题)

  • 华为手机闹钟怎么关闭(华为手机闹钟怎么显示在屏幕上)

    华为手机闹钟怎么关闭(华为手机闹钟怎么显示在屏幕上)

  • 华为荣耀20青春版有耳机孔吗(华为荣耀20青春版上市时间和价格)

    华为荣耀20青春版有耳机孔吗(华为荣耀20青春版上市时间和价格)

  • 苹果手机无法查看word文档(苹果手机无法查找位置什么原因)

    苹果手机无法查看word文档(苹果手机无法查找位置什么原因)

  • ipad保护套自动锁屏原理(ipad保护套自动装磁铁机器)

    ipad保护套自动锁屏原理(ipad保护套自动装磁铁机器)

  • 快手可以同时两个手机登录吗(快手能不能弄两个号)

    快手可以同时两个手机登录吗(快手能不能弄两个号)

  • 悟空问答是什么(悟空问答是干嘛的)

    悟空问答是什么(悟空问答是干嘛的)

  • 为什么WiFi名称后有个5G(为什么wifi名称不能用中文)

    为什么WiFi名称后有个5G(为什么wifi名称不能用中文)

  • 高德地图离线导航怎么用不了(高德地图离线导航是什么意思)

    高德地图离线导航怎么用不了(高德地图离线导航是什么意思)

  • appleid验证失败连接到服务器时出现问题(appleid验证失败怎么办)

    appleid验证失败连接到服务器时出现问题(appleid验证失败怎么办)

  • 恢复好友qq官方网站(恢复好友qq官方网站登录存在风险)

    恢复好友qq官方网站(恢复好友qq官方网站登录存在风险)

  • 哔哩哔哩下载视频怎么导出(哔哩哔哩缓存的视频可以导出来吗)

    哔哩哔哩下载视频怎么导出(哔哩哔哩缓存的视频可以导出来吗)

  • word稿纸怎样设置一半(word2019怎么设置稿纸)

    word稿纸怎样设置一半(word2019怎么设置稿纸)

  • 微信交易记录保存多久(微信交易记录保存几年)

    微信交易记录保存多久(微信交易记录保存几年)

  • vivo空心字体怎么恢复(vivoy66空心字体怎么取消)

    vivo空心字体怎么恢复(vivoy66空心字体怎么取消)

  • wcdma是什么网络类型(wcdma是什么网络构架)

    wcdma是什么网络类型(wcdma是什么网络构架)

  • 抖音收藏的商品怎么删除(抖音收藏的商品怎么批量删除)

    抖音收藏的商品怎么删除(抖音收藏的商品怎么批量删除)

  • 如何打印word文档(如何打印word文档中隐藏的内容)

    如何打印word文档(如何打印word文档中隐藏的内容)

  • 如何设计电影海报(电影海报设计ps步骤)

    如何设计电影海报(电影海报设计ps步骤)

  • word怎么删除某一页的页眉(word怎么删除某一列)

    word怎么删除某一页的页眉(word怎么删除某一列)

  • 栈的定义是什么(栈的定义是什么并说明数据如何进出)

    栈的定义是什么(栈的定义是什么并说明数据如何进出)

  • 第一弹我的下载在哪里(第一弹app安卓版下载)

    第一弹我的下载在哪里(第一弹app安卓版下载)

  • Windows 10如何设置默认照片查看器(windows10如何设置输入法)

    Windows 10如何设置默认照片查看器(windows10如何设置输入法)

  • 小规模纳税人申请一般纳税人条件
  • 公司纳税证明怎么开
  • 月末处理工作主要包括
  • 网上申领发票收到后需要怎么操作
  • 预算收入包括增值税吗
  • 现流表怎么编
  • 发票验旧以后还有用吗
  • 小规模纳税人缴纳上月应交增值税
  • 库存现金期末余额
  • 企业为什么产生
  • 异地成立分公司
  • 银行按揭方式销售开发产品
  • 养老保险缴纳比例是固定的吗
  • 废品材料回收价格
  • 周转借款会计分录
  • 自主就业退役士兵从事个体经营的
  • 外贸企业进项税额
  • 购货方收到代垫运费的发票怎么做会计分录?
  • 发票 发票联
  • 资产负债表资产总额在哪
  • 应收款项核销的原因
  • 其他应付款是什么意思
  • 间断性断网
  • 微信聊天记录备份和恢复
  • PHP:oci_rollback()的用法_Oracle函数
  • php判断查询是否有结果
  • Linux怎么修改账户名
  • PHP:mb_detect_order()的用法_mbstring函数
  • 包装破损导致物品损坏
  • 固定资产残料收入的账务处理
  • wind10记事本在哪
  • 农产品收购发票使用范围
  • STP详解
  • 如何自己搭建一个邮箱服务器
  • 银行存款日记账对方科目写什么
  • php时间函数代码
  • 劳务派遣企业简易征收管理办法
  • 一岁宝宝喝红糖姜水
  • zabbix 执行命令
  • echarts在地图上标记图标
  • 基于用户的协同过滤算法
  • java开源二次开发平台
  • centos7搭建http
  • 矿产资源补偿费是什么
  • 外国人在中国工作签证
  • 科技项目经费预算取费细则
  • 如何关闭mysqld
  • 请问linux
  • mysql常用优化方案
  • 让渡资产使用权收入什么意思
  • 个税赡养老人分摊方式怎么更改
  • 兼职人员工资需要交个税吗
  • 个人独资企业法人可以发工资吗
  • 税局代开专票如何做账务处理?
  • 可转债公允价值变动计入
  • 外贸企业有内销和外销是否分开做账
  • 航天开票系统怎么导出已开票明细
  • 资产处置收益和资产减值损失区别
  • 高新技术企业认定管理办法
  • 企业建帐的基本要求
  • 货币资金核算制度是什么
  • SQL Server Parameter Sniffing及其改进方法
  • mysql 5.6.26 winx64安装配置图文教程(一)
  • 模糊查询的通配符有哪些
  • 在WINDOWS系统中用鼠标拖动非最大化窗口的标题栏可以
  • Windows Server 2016怎么安装?Windows Server 2016安装、激活、设置详细图文教程
  • 图解在OS X中管理窗口大小的多种方法
  • mac截图后怎么编辑
  • srv32.exe - srv32进程是什么文件 有何作用
  • windows8.1的设置在哪
  • jquery 图片左右滚动
  • node文件目录
  • 缓动函数网站
  • javascript的核心组成部分
  • js设计模式有哪些
  • 登陆界面android
  • 开出去的专用发票存根怎么处理的
  • 四川税务局网上办税
  • 如何查询车辆购买的保险
  • 怎样通过发票号码查询电子发票
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设