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.pswp.cn/web/43442.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43442.shtml
英文地址,請注明出處:http://en.pswp.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]; …

數據的洞察力:SQL Server Analysis Services在數據分析中的卓越應用

數據的洞察力&#xff1a;SQL Server Analysis Services在數據分析中的卓越應用 在商業智能和數據分析領域&#xff0c;SQL Server Analysis Services (SSAS) 是一款強大的工具&#xff0c;它提供了多維數據和數據挖掘模型的創建、部署和管理功能。本文將深入探討如何在SQL Se…

云端生活,智能管理:在iCloud中打造您的個人購物清單與預算計劃

云端生活&#xff0c;智能管理&#xff1a;在iCloud中打造您的個人購物清單與預算計劃 在快節奏的現代生活中&#xff0c;個人財務管理和購物規劃變得尤為重要。iCloud提供了一個強大的平臺&#xff0c;讓我們能夠存儲、同步和共享個人購物清單與預算計劃。本文將詳細介紹如何…

代碼隨想錄算法訓練營第二十九天

452. 用最少數量的箭引爆氣球 這道題目我原本的想法是只要當前的氣球半徑范圍在已有的箭頭能夠擊穿的氣球半徑內就可以實現 但是 箭射出去的地方是一個值 而不是一個范圍 因此有相同的重疊范圍的許多氣球并一定都有相同的值&#xff0c;因此這種方法不可取 這題的主要局部最…

最短路徑算法(算法篇)

算法之最短路徑算法 最短路徑算法 概念&#xff1a; 考查最短路徑問題&#xff0c;可能會輸入一個賦權圖(也就是邊帶有權的圖)&#xff0c;則一條路徑的v1v2…vN的值就是對路徑的邊的權求和&#xff0c;這叫做賦權路徑長&#xff0c;如果是無權路徑長就是單純的路徑上的邊數。…

mac安裝配置cmake

本機是2015 macbook pro mid&#xff0c;已經有點老了&#xff0c;用homebrew下cmake老出問題 其實cmake官網安裝也不麻煩 一、官網下載對應安裝包 Download CMake 和所有dmg文件一樣安裝 二、改成命令行使用 一般來說 tutorial 給的都是命令行build 命令行的設置如下&am…

手機下載APP (uniapp/vue)

一、uniapp <template><view class"content"><view class"appName">{{ formData.appName }}</view><view class"appInfo">{{ formData.appInfo }}</view><image class"logo" :src"formDa…

批量修改Git歷史commit信息中的username

之前很長一段時間GitHub上的提交都在使用工作賬戶, 導致私人倉庫中的提交者比較混亂. 在StackOver里面找到了一個bash腳本可以批量修改username, 在這里記錄一下. 修改的步驟一共兩步: 執行修改腳本將本地修改同步到Git服務器 首先我們來看腳本: #!/bin/shgit filter-branch…

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;會增加系統的負擔。通過復用實例&…

每天一個數據分析題(四百二十一)- 一元線性回歸模型

關于一元線性回歸的求解過程說法正確的是&#xff1f; A.一元線性回歸只需要求解出兩個參數系數即可 B.對于新來的樣例&#xff0c;建立好的一元線性回歸模型可以做出準確的預測 C.一元線性回歸模型的基本形式是YAxe&#xff0c;其中A為系數&#xff0c;e為隨機誤差 D.一元線性…

日常學習-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;逐步…