three-tile: 1. 第一个three-tile程序

上篇介绍了:three-tile: 一个开源的轻量级三维瓦片库-CSDN博客

three-tile 是一个开源的轻量级三维瓦片库,它基于threejs使用typescript开发,提供一个三维地形模型,能轻松给你的应用增加三维瓦片地图。

项目地址:https://github.com/sxguojf/three-tile

示例地址:https://github.com/sxguojf/three-tile-example


这篇,我们来使用three-tile编写一个简单示例,它显示一张三维地图,鼠标左键平移,右键旋转,滚轮缩放。

废话不多说,先上代码:

<!DOCTYPE html>
<html lang="zh-cn"><head><meta charset="utf-8" /><metaname="viewport"content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"/><title>three-tile最小化应用</title></head><style>html,body {background-color: #333;height: 100%;width: 100%;padding: 0;margin: 0;display: flex;}#map {flex: 1;}</style><!-- 因three@v0.150+废弃了普通导入方式,需要改为使用importmap导入 --><script type="importmap">{"imports": {"three": "https://unpkg.com/three@0.165.0/build/three.module.js","three-tile": "https://unpkg.com/three-tile@0.6.1/dist/three-tile.js"}}</script><body><div id="map"></div><script type="module">import * as THREE from "three";import * as tt from "three-tile";console.log(`three-tile v${tt.version} start!`);// MapBoxToken 请更换为你自己申请的keyconst MAPBOXKEY ="pk.eyJ1Ijoic3ZjLW9rdGEtbWFwYm94LXN0YWZmLWFjY2VzcyIsImEiOiJjbG5sMnBoMm0xeWZzMmtyaWl0b2wyN2FuIn0.-zx1KP3Oy-7YzWcvhbv22Q";// mapbox影像数据源const mapBoxImgSource = new tt.plugin.MapBoxSource({token: MAPBOXKEY,dataType: "image",style: "mapbox.satellite",});// mapbox地形数据源const mapBoxDemSource = new tt.plugin.MapBoxSource({token: MAPBOXKEY,dataType: "terrain-rgb",style: "mapbox.terrain-rgb",maxLevel: 15,});// 创建地图const map = tt.TileMap.create({// 影像数据源imgSource: mapBoxImgSource,// 地形数据源demSource: mapBoxDemSource,// 地图投影中心经度lon0: 90,// 最小缩放级别minLevel: 2,// 最大缩放级别maxLevel: 18,});// 地图旋转到xz平面map.rotateX(-Math.PI / 2);// 地图中心坐标(经度,纬度,高度)const centerGeo = new THREE.Vector3(105, 30, 0);// 摄像坐标(经度,纬度,高度)const camersGeo = new THREE.Vector3(105, 0, 5000);// 地图中心转为世界坐标const centerPostion = map.localToWorld(map.geo2pos(centerGeo));// 摄像机转为世界坐标const cameraPosition = map.localToWorld(map.geo2pos(camersGeo));// 初始化场景const viewer = new tt.plugin.GLViewer("#map", { centerPostion, cameraPosition });// 地图添加到场景viewer.scene.add(map);</script></body>
</html>

将上面代码保存为html文件,不需要web服务,用浏览器打开即可运行。由于地图数据在墙外,加载可能有点慢,多等一会。

懒得复制?那直接到这里体验:https://inscode.csdn.net/@hzgjf/HTML-CSS-JS

代码比较简单,要理解,需要一些threejs或opengl基础知识,没学过也不要紧,我会后面会慢慢讲解。

1. 引入three和three-tile

three-tile是基于threejs开发,先引入这两个包:

<!-- 因three@v0.150+废弃了普通导入方式,需要改为使用importmap导入 -->
<script type="importmap">{"imports": {"three": "https://unpkg.com/three@0.165.0/build/three.module.js","three-tile": "https://unpkg.com/three-tile@0.6.1/dist/three-tile.js"}}
</script>

引入方式不是常见的写法,这是由于threejs r150+后,已经废弃老式写法了,不得不跟。详情见:

https://threejs.org/docs/index.html#manual/zh/introduction/Installation

为了简单,这里采用CDN方式,后面我们讲解会用NPM方式。

2. 创建数据源

既然是瓦片地图,那肯定先要定义数据源,three-tile内建了mapbox、bing、google、天地图、高德等等数据源定义,这里我们选用mapboxe的:

			// MapBoxToken 请更换为你自己申请的keyconst MAPBOXKEY ="pk.eyJ1Ijoic3ZjLW9rdGEtbWFwYm94LXN0YWZmLWFjY2VzcyIsImEiOiJjbG5sMnBoMm0xeWZzMmtyaWl0b2wyN2FuIn0.-zx1KP3Oy-7YzWcvhbv22Q";// mapbox影像数据源const mapBoxImgSource = new tt.plugin.MapBoxSource({token: MAPBOXKEY,dataType: "image",style: "mapbox.satellite",});// mapbox地形数据源const mapBoxDemSource = new tt.plugin.MapBoxSource({token: MAPBOXKEY,dataType: "terrain-rgb",style: "mapbox.terrain-rgb",maxLevel: 15,});

不明白啥意思?没关系,抄上就行,后面会讲解,需要注意的是,mapbox的token最好自己申请,不要用我上面的,用的人多超出限额大家都没得玩了。

3. 创建地图

// 创建地图
const map = tt.TileMap.create({// 影像数据源imgSource: mapBoxImgSource,// 地形数据源demSource: mapBoxDemSource,// 地图投影中心经度lon0: 90,// 最小缩放级别minLevel: 2,// 最大缩放级别maxLevel: 18,
});
// 地图旋转到xz平面
map.rotateX(-Math.PI / 2);

这里,用three-tile的TileMap.create函数,创建了一个地图模型,类型是threejs的Mesh,然后把模型旋转-90°到xz平面,函数参数把刚创建的地图数据源传进去,其它参数先照抄,后面讲解。

4. 初始化三维场景并添加地图

三维场景的初始化,就是threejs套路,创建场景、渲染器、摄像机、控制器、灯光等等,你从threejs中抄过来就行,但为了降低使用难度,three-tile内置了一个GLViewer类封装了这些操作,你只需要传入参数即可:

// 地图中心坐标(经度,纬度,高度)
const centerGeo = new THREE.Vector3(105, 30, 0);
// 摄像坐标(经度,纬度,高度)
const camersGeo = new THREE.Vector3(105, 0, 5000);
// 地图中心转为世界坐标
const centerPostion = map.localToWorld(map.geo2pos(centerGeo));
// 摄像机转为世界坐标
const cameraPosition = map.localToWorld(map.geo2pos(camersGeo));
// 初始化场景
const viewer = new tt.plugin.GLViewer("#map", { centerPostion, cameraPosition });// 地图添加到场景
viewer.scene.add(map);

GLViewer构造参数需要在网页上放置地图的dom的ID,这里是"#map",对应的html中那唯一的一个div,另外,需要地图中心坐标和摄像机坐标,用来控制地图的位置、缩放和旋转,这两坐标需要传入三维场景坐标,我们通过将经纬度高度转换得来:

centerGeo:地图中心经纬度高度,就是地图以哪个点为中心(105°E,30°N,0km)

cameraGeo:摄像机的经纬度高度,就是你站点哪个位置看地图(105°E,0°,5000km)

这两参数为可选参数,如果不清楚耶可以省略。

最后,将地图加入三维场景中,OK,保存看看效果。

第一讲,不需要读懂,复制过去能运行出来就行,后面将持续更新。

雄伟的喜马拉雅,我咋感觉搞辆铲车直接能开上去...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/43442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#知识|账号管理系统:UI层-添加账号窗体设计思路及流程。

哈喽,你好啊,我是雷工! 前边练习过详情页窗体的设计思路及流程: 《C#知识|上位机UI设计-详情窗体设计思路及流程(实例)》 本节练习添加账号窗体的UI设计,以下为学习笔记。 01 效果展示 02 添加窗体 在UI层添加Windows窗体,设置名称为:FrmAddAcount.cs 设置窗体属…

Nginx七层(应用层)反向代理:UWSGI代理uwsgi_pass篇

Nginx七层&#xff08;应用层&#xff09;反向代理 UWSGI代理uwsgi_pass篇 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this a…

数据结构模板2

Trie树&#xff1a;用来高效存储和查找字符串集合的数据结构&#xff1a; 模板题&#xff1a;https://www.acwing.com/problem/content/837/ AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int son[100010][26],cnt[100010],idx; char str[100010]; …

代码随想录算法训练营第二十九天

452. 用最少数量的箭引爆气球 这道题目我原本的想法是只要当前的气球半径范围在已有的箭头能够击穿的气球半径内就可以实现 但是 箭射出去的地方是一个值 而不是一个范围 因此有相同的重叠范围的许多气球并一定都有相同的值&#xff0c;因此这种方法不可取 这题的主要局部最…

mac安装配置cmake

本机是2015 macbook pro mid&#xff0c;已经有点老了&#xff0c;用homebrew下cmake老出问题 其实cmake官网安装也不麻烦 一、官网下载对应安装包 Download CMake 和所有dmg文件一样安装 二、改成命令行使用 一般来说 tutorial 给的都是命令行build 命令行的设置如下&am…

SFUZZ模糊测试平台全新升级,从标准到实践助力车企安全出海

开源网安模糊测试平台SFuzz全新升级&#xff0c;参照各国相关标准要求进行针对性建设&#xff0c;可为智能网联汽车信息安全测试提供更为强大的工具支持。SFuzz向被测系统输入大量随机数据&#xff0c;模拟各种异常情况&#xff0c;可以发现被测系统内潜在的缺陷和漏洞&#xf…

Spring中如何操作Redis

Spring毕竟是Java中的一个主流框架&#xff0c;如何在这个框架中使用Redis呢&#xff1f; 创建项目并引入相关依赖 然后进行创建。 至此就将Redis的相关依赖引入进来了。 编写Redis配置 将application.properties修改成application.yml 然后编写如下配置&#xff1a; spr…

usbserver工程师手记(二)设置定时任务

概述 部分银行ukey 长时间不使用后会导致休眠&#xff0c;出现虽然有连接&#xff0c;但是读不到证书&#xff0c;可以用定时重置端口的办法&#xff0c;调用接口 http://ip/usb_server/reset_port,参数为 {"port":"B5-1-2","vid_pid":"09…

Golang | Leetcode Golang题解之第228题汇总区间

题目&#xff1a; 题解&#xff1a; func summaryRanges(nums []int) (ans []string) {for i, n : 0, len(nums); i < n; {left : ifor i; i < n && nums[i-1]1 nums[i]; i {}s : strconv.Itoa(nums[left])if left < i-1 {s "->" strconv.It…

多个标签页中复用同一 QTableView

在 PyQt 中实现在多个标签页中复用同一个 QTableView 实例&#xff0c;复用同一个 QTableView 实例可以减少内存和资源的使用。每个 QTableView 实例都会消耗一定的内存和处理资源&#xff0c;如果每个标签页都创建一个新的实例&#xff0c;会增加系统的负担。通过复用实例&…

日常学习-20240710

1、一次一千万条数据插入和删除案例&#xff1a; 第一次&#xff1a;插入--批量插入&#xff0c;每次插入5000条数据&#xff0c;总耗时28min,数据无异常 删除--通过sql语句一次性删除&#xff0c;总耗时1h52min;一次删除的数据过多导致mysql的备份恢复文件极其庞大&#xff0…

CentOS7 安装 git 命令

通过yum源install下载的git版本比较低&#xff0c;不推荐此方式安装。 官网下载最新版git源码&#xff1a;Git 1. 解压安装包 tar -xzvf git-2.45.2.tar.gz 2. 安装相关依赖 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils…

uniapp使用高德地图(公众号+h5)

选择微信小程序的话后果就是你的地图出不来&#xff0c;出来了就报key异常 下面直接放配置和代码&#xff1a; 打包后的高德uni-app,uniCloud,serverless,高德地图,申请高德地图Key,配置使用高德地图,参数说明,高德开放平台用户名,百度地图,申请百度地图Key,配置使用百度地图,…

线性代数|机器学习-P22逐步最小化一个函数

文章目录 1. 概述2. 泰勒公式3. 雅可比矩阵4. 经典牛顿法4.1 经典牛顿法理论4.2 牛顿迭代法解求方程根4.3 牛顿迭代法解求方程根 Python 5. 梯度下降和经典牛顿法5.1 线搜索方法5.2 经典牛顿法 6. 凸优化问题6.1 约束问题6.1 凸集组合 Mit麻省理工教授视频如下&#xff1a;逐步…

SpringBoot使用RedisTemplate、StringRedisTemplate操作Redis

前言 RedisTemplate 是 Spring Boot 访问 Redis 的核心组件&#xff0c;底层通过 RedisConnectionFactory 对多种 Redis 驱动进行集成&#xff0c;上层通过 XXXOperations 提供丰富的 API &#xff0c;并结合 Spring4 基于泛型的 bean 注入&#xff0c;极大的提供了便利&#x…

深度学习和NLP中的注意力和记忆

深度学习和NLP中的注意力和记忆 文章目录 一、说明二、注意力解决了什么问题&#xff1f;#三、关注的代价#四、机器翻译之外的关注#五、注意力&#xff08;模糊&#xff09;记忆&#xff1f;# 一、说明 深度学习的最新趋势是注意力机制。在一次采访中&#xff0c;现任 OpenAI 研…

K8S中部署 Nacos 集群

1. 准备 GitK8Skubectlhelm 咱也没想到 K8S 部署系列能搞这么多次&#xff0c;我一个开发天天干运维的活&#xff0c;前端后端运维测试工程师实至名归。 2. 方案选择 https://github.com/nacos-group/nacos-k8s 我替你们看了一下&#xff0c;有好几种方式能部署&#xff…

【RHCE】基于用户认证和TLS加密的HTTP服务(HTTPS)

目录 一、创建用户账号 二、TLS加密 三、配置http服务子配置文件 四、创建访问http服务的文件夹以及输入重定向到文件 五、配置Linux本地仓库以及Windows下的本地仓库 六、基础操作 七、测试 一、创建用户账号 用户认证 # 创建两个账户 [rootlocalhost ~]# htpasswd -…

交叉熵损失函数的使用目的(很肤浅的理解)

第一种使用方法 import torch from torch import nn # Example of target with class indices loss nn.CrossEntropyLoss() input torch.randn(3, 5, requires_gradTrue) target torch.empty(3, dtypetorch.long).random_(5) output loss(input, target) output.backward(…

可控学习综述:信息检索中的方法、应用和挑战

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…