three.js 使用geojson ,实现中国地图区域,边缘流动效果

ops/2024/10/22 21:26:06/

three.js 使用geojson ,实现中国地图区域,边缘流动效果

在线链接:https://threehub.cn/#/codeMirror?navigation=ThreeJS&classify=expand&id=geoBorder

国内站点预览:http://threehub.cn

github地址: https://github.com/z2586300277/three-cesium-examples

import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'const box = document.getElementById('box')const scene = new THREE.Scene()const camera = new THREE.PerspectiveCamera(75, box.clientWidth / box.clientHeight, 0.1, 1000)camera.position.set(0, 0, 500)const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true, logarithmicDepthBuffer: true })renderer.setSize(box.clientWidth, box.clientHeight)box.appendChild(renderer.domElement)const controls = new OrbitControls(camera, renderer.domElement)controls.enableDamping = truescene.add(new THREE.AmbientLight(0xffffff, 1))const directionalLight = new THREE.DirectionalLight(0xffffff, 2)directionalLight.position.set(300, 300, 300)scene.add(directionalLight)const map = new THREE.TextureLoader().load(`https://file.threehub.cn/` + 'images/channels/lmap.png')map.wrapS = THREE.RepeatWrappingmap.wrapT = THREE.RepeatWrappingmap.needsUpdate = trueanimate()function animate() {requestAnimationFrame(animate)map.offset.x += 0.001controls.update()renderer.render(scene, camera)}window.onresize = () => {renderer.setSize(box.clientWidth, box.clientHeight)camera.aspect = box.clientWidth / box.clientHeightcamera.updateProjectionMatrix()}/* 边界 */
const group = new THREE.Group()fetch(`https://file.threehub.cn/` + 'files/json/chinaBound.json').then(r => r.json()).then(res => {const { features } = resfeatures.forEach((i) => {if (i.geometry.type === 'MultiPolygon') i.geometry.coordinates.forEach((j) => j.forEach((z) => createShapeWithCoord(group, z)))else if (i.geometry.type === 'Polygon') i.geometry.coordinates.forEach((j) => createShapeWithCoord(group, j))else if (i.geometry.type === 'LineString') i.geometry.coordinates.length > 1 && createShapeWithCoord(group, i.geometry.coordinates)})translationOriginForGroup(group)scene.add(group)})function createShapeWithCoord(group, coordinates) {if (coordinates.length < 1000) return // 设置点数限制 如果点太少则不绘制const curvePoints = coordinates.map((k) => coordToVector3(k))const curve = new THREE.CatmullRomCurve3(curvePoints)const geometry = new THREE.TubeGeometry(curve, curvePoints.length - 1, 1, 40, false)const material = new THREE.MeshPhongMaterial({ color: 0xffffff , map , transparent: true })const mesh = new THREE.Mesh(geometry, material)translationOriginForMesh(mesh)group.attach(mesh)}function coordToVector3(coord, slace = 10000) {const [lng, lat] = coordconst x = lng * 20037508.34 / 180const y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180) * 20037508.34 / 180return new THREE.Vector3(x / slace, y / slace, 0)}function translationOriginForMesh(mesh) {const boundingBox = new THREE.Box3().setFromObject(mesh)boundingBox.getCenter(mesh.position)mesh.geometry.center()}// 设置组中心点
function translationOriginForGroup(group) {const boundingBox = new THREE.Box3().setFromObject(group)boundingBox.getCenter(group.position)group.traverse((c) => {c.isMesh && c.position.sub(group.position)})group.position.set(0, 0, 0)}/*** 名称: 地理边界* 作者: 优雅永不过时 https://github.com/z2586300277
*/

http://www.ppmy.cn/ops/127661.html

相关文章

Golang文件操作:读取与写入全攻略

文章目录 1. 文件操作基础2. 文件的打开和创建2.1 打开文件2.2 创建文件 3. 文件写入操作3.1 使用os.File.WriteString写入字符串3.2 使用bufio进行缓冲写入 4. 文件读取操作4.1 按行读取文件4.2 一次性读取整个文件 5. 文件权限与打开模式详解5.1 使用os.OpenFile设置文件打开…

【接口限流】java中springboot实现接口限流防抖处理(JUC注解版)

文章目录 1、添加pom项目依赖2、注解类RateLimit3、限流切面RateLimitAspect4、controller层使用注解小结 1、添加pom项目依赖 <!--AspectJ来实现切面&#xff0c;在方法执行前进行限流检查--><dependency><groupId>org.aspectj</groupId><artifact…

学习第三十六行

QValidator::State里面state为0&#xff0c;完全不匹配&#xff0c;1&#xff0c;部分匹配&#xff0c;2&#xff0c;完全匹配,对于label或者textedit里面的字符均为QString类型&#xff0c;特别是遇到数字&#xff0c;需要QString::number转化&#xff0c;对于正则表达式&…

【Docker项目实战】使用Docker部署HumHub社交网络平台

【Docker项目实战】使用Docker部署HumHub社交网络平台 一、HumHub介绍1.1 HumHub简介1.2 HumHub特点1.3 主要使用场景二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载HumHub镜…

Swin-Transformer

网络整体架构&#xff1a; Swin-transformer与vision transformer对比&#xff1a; Swin-Transformer构建的feature map具有层次性&#xff0c;类似于卷积神经网络&#xff0c;随着特征层的不断加深&#xff0c;feature map的高和宽是不断减小的&#xff1b;层次性使Swin-Tran…

什么是优秀的单元测试?

阅读本文之前&#xff0c;请投票支持这款 全新设计的脚手架 &#xff0c;让 Java 再次伟大&#xff01; 单元测试的质量意义 合理编写单元测试&#xff0c;可使团队工程师告别牛仔式编程&#xff0c;产出易维护的高质量代码。随着单元测试覆盖率的上升&#xff0c;项目会更加…

学习笔记——交换——STP(生成树)桥协议数据单元(BPDU)

四、桥协议数据单元(BPDU) 1、BPDU基本概念 桥协议数据单元(Bridege Protocol Data Unit,BPDU)BPDU是STP的协议报文&#xff0c;直接封装在二层协议&#xff0c;是传输载体。是STP能够正常工作的根本。 BPDU主要由 4 部分组成&#xff1a; (1)根桥ID (2)发送者到根桥的开…

Django中如何实现用户认证和会话管理

在Django中实现用户认证和会话管理&#xff0c;我们可以利用Django内置的认证系统&#xff0c;它包括用户账号、组、权限和基于cookie的用户会话管理。以下是一些基本步骤和概念&#xff1a; 用户认证&#xff08;Authentication&#xff09;&#xff1a; Django的认证系统可以…