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

news2024/11/13 8:51:44

上篇介绍了: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" />
		<meta
			name="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 请更换为你自己申请的key
			const 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 请更换为你自己申请的key
			const 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.coloradmin.cn/o/1917926.html

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

相关文章

自建邮局服务器相比云邮箱有哪些优势特性?

自建邮局服务器如何配置&#xff1f;搭建自建邮局服务器的技术&#xff1f; 尽管云邮箱服务提供了便捷和低成本的解决方案&#xff0c;自建邮局服务器依然具有许多独特的优势和特性&#xff0c;吸引了众多企业和组织。AokSend将深入探讨自建邮局服务器相比云邮箱的主要优势。 …

如何指定多块GPU卡进行训练-数据并行

训练代码&#xff1a; train.py import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, Dataset import torch.nn.functional as F# 假设我们有一个简单的文本数据集 class TextDataset(Dataset):def __init__(self, te…

本地部署私人知识库的大模型!Llama 3 + RAG!

在今天的的教程中&#xff0c;我们将打造更加个性化的大模型&#xff0c;可以定制搭载私人知识库的本地大模型&#xff01; 我们探讨Meta AI 的尖端 Llama 3 语言模型构建强大的检索增强生成 &#xff08;RAG&#xff09; 来实现。通过利用 Llama 3 和 RAG 技术的功能&#xf…

雨季的文物保护

随着夏季的到来&#xff0c;高温和多雨给文物保护带来了新的挑战。在这个季节&#xff0c;文物不仅面临着物理和化学损害的风险&#xff0c;还可能因为管理不善而遭受人为破坏。因此&#xff0c;探讨如何在夏季炎热天气中做好文物保护工作&#xff0c;对于维护文化遗产的完整性…

【深度学习】图形模型基础(7):机器学习优化中的方差减少方法(1)

摘要 随机优化是机器学习中至关重要的组成部分&#xff0c;其核心是随机梯度下降算法&#xff08;SGD&#xff09;&#xff0c;这种方法自60多年前首次提出以来一直被广泛使用。近八年来&#xff0c;我们见证了一个激动人心的新进展&#xff1a;随机优化方法的方差降低技术。这…

小白学c嘎嘎(第二天)入门基础下

温馨提醒&#xff1a;本篇文章起&#xff0c;文章内容排版将更新&#xff0c;层层深入 基础知识 回顾 引用的语法格式&#xff1a;类型& 引⽤别名 引⽤对象; 引用特性 1. 引⽤在定义时必须初始化 2. ⼀个变量可以有多个引⽤ 3. ⼀旦引⽤⼀个实体&#xff0c;再不…

药监局瑞数后缀补环境教学

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; (联系看首页&#xff09; 前言 之前用…

【python算法学习2】冒泡排序的写法

目的&#xff1a;学习冒泡排序的写法 1 定义 1.1百度百科 冒泡排序_百度百科在程序设计语言中&#xff0c;排序算法主要有冒泡排序、快速排序、选择排序以及计数排序等。冒泡排序&#xff08;Bubble Sort&#xff09;是最简单和最通用的排序方法&#xff0c;其基本思想是&…

EchoMimic 数字人项目:语音驱动图像说话项目

参考: https://github.com/BadToBest/EchoMimic 安装 下载模型 下载位置放到下面下载代码目录下, cd EchoMimic 下 export HF_ENDPOINT=https://hf-mirror.comhuggingface-cli download --resume-download --local-dir-use-symlinks False BadToBest/EchoMimic --local-d…

红酒的甜蜜秘密:如何搭配甜点?

在品味美食的旅程中&#xff0c;甜点与红酒的搭配总是能带来意想不到的惊喜。红酒的醇厚与甜点的细腻&#xff0c;在口中交织出美妙的旋律&#xff0c;让人陶醉不已。今天&#xff0c;就让我们一起探索红酒的甜蜜秘密&#xff0c;看看如何与甜点很好搭配&#xff0c;享受这一场…

PCL报ptr 释放错误(Memory.h文件中aligned_free(void *ptr)触发了一个断点)

今天跑PCL处理点云&#xff0c;上来一个下马威&#xff0c;关于内存的。反复检查代码以后还是报错.于是反复查看代码&#xff0c;并搜罗指针释放&#xff0c;都没有解决。一番操作才知道是设置配置问题。下面记录一下解决过程&#xff1a; &#xff08;1&#xff09;编译报错弹…

死灰复燃的 LockBit, “现身说法”计算机安全的重要性

LockBit 死灰复燃 2024年2月&#xff0c;一场全球性的名为 “Cronos 行动” 的执法行动夺取了对 LockBit 勒索组织基础设施的控制权并扰乱了其运营。 但是&#xff0c;就像希腊神话中的九头蛇一样&#xff0c;砍掉一个 LockBit 的头并不重要——它可以迅速再生成多个新的头。…

PCL:点云均匀采样滤波并保存ply文件(附完整源码)

均匀采样滤波基本上等同于体素滤波器&#xff0c;但是其不改变点的位置。下采样后&#xff0c;其点云分布基本均匀&#xff0c;但是其点云的准确度要好于体素滤波&#xff0c;因为没有移动点的位置。均匀采样算法&#xff1a;均匀采样通过构建指定半径的球体对点云进行下采样滤…

CV05_深度学习模块之间的缝合教学(1)

1.1 在哪里缝 测试文件&#xff1f;&#xff08;&#xff09; 训练文件&#xff1f;&#xff08;&#xff09; 模型文件&#xff1f;&#xff08;√&#xff09; 1.2 骨干网络与模块缝合 以Vision Transformer为例&#xff0c;模型文件里有很多类&#xff0c;我们只在最后…

【Pytorch】Conda环境下载慢换源/删源/恢复默认源

文章目录 背景临时换源永久换源打开conda配置condarc换源执行配置 命令行修改源添加源查看源 删源恢复默认源使用示范 背景 随着实验增多&#xff0c;需要分割创建环境的情况时有出现&#xff0c;在此情况下使用conda create --name xx python3.10 pytorch torchvision pytorc…

maven——(重要)手动创建,构建项目

创建项目 手动按照maven层级建好文件夹&#xff0c;并写上java&#xff0c;测试代码和pom文件 构建项目 在dos窗口中执行如下命令 compile编译 当前maven仓库中什么都没有。 在pom所在层级下&#xff0c;执行&#xff1a; mvn compile 就开始显示下面这些&#xff0c;…

整数的英语表示

题目链接 整数的英语表示 题目描述 注意点 0 < num < 2^31 - 1 解答思路 每三个数字形成一组&#xff08;高位不足的部分可以用0填充&#xff09;&#xff0c;使用StringBuilder拼接每组的数字和单位关键是三个数字的英语表示&#xff0c;包含个位、十位、百位&…

java入门-告别C进入java世界

目标 java体系 java开发环境 helloworld java语法 java体系 java开发环境 安装JDK JDK&#xff1a; Java Developement Kit 配置jdk 为什么需要配置 操作系统找不到此程序 操作系统PATH PATH C:\Users\49354>echo %PATH% C:\Program Files (x86)\VMware\VMware Works…

Java---SpringBoot详解一

人性本善亦本恶&#xff0c; 喜怒哀乐显真情。 寒冬暖夏皆有道&#xff0c; 善恶终归一念间。 善念慈悲天下广&#xff0c; 恶行自缚梦难安。 人心如镜自省照&#xff0c; 善恶分明照乾坤。 目录 一&#xff0c;入门程序 ①&#xff0c;创建springboot工程&#…

安泰电压放大器的选型方案是什么

电压放大器是一种常见的电路元件&#xff0c;广泛应用于各种电子设备中。在选择电压放大器的时候&#xff0c;我们需要考虑一系列因素&#xff0c;以确保选型方案能够满足实际需求。下面安泰电子将详细介绍电压放大器选型的主要考虑因素&#xff0c;包括应用需求、技术性能、成…