記錄--寫一個高德地圖巡航功能的小DEMO

来源:https://www.cnblogs.com/smileZAZ/archive/2023/06/29/17515087.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 風格設置 載入地圖 使用AMapLoader.load載入地圖,從 控制台 申請一個屬於自己的key import AMapLoader from '@amap/amap-jsapi-loader'; ... const AMap = a ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

風格設置

載入地圖

使用AMapLoader.load載入地圖,從 控制台  申請一個屬於自己的key

import AMapLoader from '@amap/amap-jsapi-loader';
...

const AMap = await AMapLoader.load({
    "key": "您自己申請的KEY",              // 申請好的Web端開發者Key,首次調用 load 時必填
    "version": "2.0",
    "plugins": ["AMap.Walking", "AMap.Driving"],           // 需要使用的的插件列表,如比例尺'AMap.Scale'等
    "Loca": {
        version: '2.0.0'
    }
})

使用new AMap.Map實例化地圖,並設置mapStyle"amap://styles/grey",也可以在官網上自己設計屬於自己的風格,主要講的不是這部分所以大概交代一下就過去了,實例化Map後返回一個map實例,後續的操作都需要用到。

添加GLCustomLayer圖層

new AMap.GLCustomLayer({
    zIndex: 100,
    init:()=>{},
    render: ()=>{}
})

threejs的載入和創建需要在init屬性的方法里操作,render主要是用來渲染一些鏡頭信息和 WebGLRenderer的重繪。

在init方法中創建一個THREEJS的透視相機

camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 100, 1 << 30);

鏡頭信息的獲取

前文實例化Map後獲取一個map的實例,其中提供了customCoords數據轉換的工具,可以從這裡獲取到鏡頭信息,後續轉化經緯度到3D世界坐標時候也會用到,轉換工具需要提前獲取到,方便後續的工作。

var { near, far, fov, up, lookAt, position } = customCoords.getCameraParams();

轉換工具提供一個getCameraParams方法,其中包含相機位置等其他屬性


fov — 攝像機視錐體垂直視野角度
near — 攝像機視錐體近端面
far — 攝像機視錐體遠端面


其中大部分屬性都和threejs的透視相機屬性相同,在render方法中更新相機,這樣做的作用就是在後續做巡航功能時會實時更新相機位置

camera.near = near;
camera.far = far;
camera.fov = fov;
camera.position.set(...position);
camera.up.set(...up);
camera.lookAt(...lookAt);
camera.updateProjectionMatrix();

初始化loca

可視化圖層需要用到Loca容器,需要在地圖外繪製的圖層,需要在可視化圖層上繪製,

創建可視化作品前,首先要創建一個 Loca 容器,這個容器可以幫您載入高德地圖作為底圖,或者幫您關聯已有的高德地圖作為底圖。
在使用地圖的時,您可以使用任何一個 JS API 已有的功能,Loca 容器不會影響原有地圖的任何功能和特性。這裡創建的 Loca 容器您可以理解為是可視化圖層的管理器。

註意:創建地圖時候 Loca 版本要和map的版本一致,否則會報錯

var loca = new (window as any).Loca.Container({
    map,
    zIndex: 9
});
將創建好的AMap.GLCustomLayer添加到map圖層
    const customLayer = await createGLCustomLayer(AMap, customCoords)
    map.add(customLayer);

createGLCustomLayer方法就是之前定義的初始化AMap.GLCustomLayer方法。返回一個GLCustomLayer實例,這樣就可以在地圖內插入可視化內容。

載入模型

回到new AMap.GLCustomLayer提供的init屬性中,創建一個3d場景並把模型載入到場景中,

renderer = new THREE.WebGLRenderer({
    context: gl,  // 地圖的 gl 上下文
});

// 自動清空畫布這裡必須設置為 false,否則地圖底圖將無法顯示
renderer.autoClear = false;

scene = new THREE.Scene();
載入模型方法跟threejs相同,使用gltfloderapi,載入方法返回一個promise,再使用
// 初始化模型
function initGltf(): Promise<THREE.Object3D> {
    return new Promise((resolve, reject) => {
        var loader = new GLTFLoader();
        loader.load('https://a.amap.com/jsapi_demos/static/gltf/Duck.gltf', (gltf: any) => {
            let object = gltf.scene;
            resolve(object)
        });
    })
}

模型添加到場景

const { x, y, z } = setRotation(new THREE.Vector3(90, 90, 0))

object.scale.set(15, 15, 15);


group.add(object)
group.add(new THREE.AxesHelper(100))
scene.add(group)
object.name = 'duck'

image.png

我在模型上添加了一個AxesHelper輔助線,官網上表示藍色代表z軸,但是放在地圖中發生了坐標方向不一致的問題,threejs的向上方向是y軸,地圖中z是向上方向,這一點可能要註意一下了

用於簡單模擬3個坐標軸的對象.
紅色代表 X 軸. 綠色代表 Y 軸. 藍色代表 Z 軸.

旋轉模型

const { x, y, z } = setRotation(new THREE.Vector3(90, -90, 0))
group.rotation.set(x, y, z)
獲取旋轉角度的方法
export function setRotation(rotation: THREE.Vector3) {
    var x = Math.PI / 180 * (rotation.x || 0);
    var y = Math.PI / 180 * (rotation.y || 0);
    var z = Math.PI / 180 * (rotation.z || 0);
    return new THREE.Vector3(x, y, z)
}
 

image.png

計算軌跡

使用viewControl

現在模型已經載入好,接下來就是要獲取軌跡數據,鏡頭跟蹤在Loca中有相應的apiviewControl,使用這個api調用addTrackAnimate方法,提供對應參數即可;

loca.viewControl.addTrackAnimate({
    path: pathArr, // 鏡頭軌跡,二維數組,支持海拔
    duration: 120000, // 時長
    timing: [[0, 0.3], [1, 0.7]], // 速率控制器
    rotationSpeed: 1800, // 每秒旋轉多少度
}, function () {
    console.log('完成',);
});
pathArr是一個軌跡數組,
const pathArr = [[116.310348, 39.89702], [116.310541, 39.884855], [116.320963, 39.889154], [116.322894, 39.889608], [116.325542, 39.889822], [116.328074, 39.889761], [116.349104, 39.889429], [116.348517, 39.89747], [116.355205, 39.898413], [116.35656, 39.90021], [116.355802, 39.93225]]
為了方便查看,我們在使用Loca提供的繪製引導線功能將這幾個關鍵點連接的引導線畫一下
// 導航線
var polyline = new AMap.Polyline({
    path: pathArr,            // 設置線覆蓋物路徑
    showDir: true,
    strokeColor: '#3366bb',   // 線顏色
    strokeWeight: 10,           // 線寬
    zIndex: 1
});
map.add(polyline)

以上工作做完後,需要調用一下loca.animate.start();方法,否則可視化圖層不會更新,相應數據也獲取不到,現在畫面變成這樣了

2023-06-08 11.17.03.gif


除了以上這種方法去實現鏡頭的移動,還可以通過插入坐標的方式去實現,也是傳統threejs中使用的方法,就是利用tweenjs的動畫,運動過程中改變map.setCenter,實現跟蹤,這部分代碼在changeObject方法中,感興趣的可以去 倉庫 查看,

鏡頭跟蹤

移動模型

利用requestAnimationFrame函數寫一個迴圈渲染的方法,在調用的同時獲取鏡頭中心坐標,通過customCoords轉換工具將經緯度轉為3D世界的坐標,並將該坐標賦值給object模型,再通過map提供的getRotation方法,獲取地圖的旋轉角度,並將該角度賦值給object模型的y軸,使模型沿著y軸旋轉,至於旋轉的速度,在前面定義addTrackAnimate時的rotationSpeed屬性定義的

const render = () => {
    requestAnimationFrame(() => {
        render()
    })
    if (object) {
        const center = map.getCenter()
        var position = customCoords.lngLatsToCoords([
            [center.lng, center.lat]
        ])[0];
        const v3 = new THREE.Vector3(position[1], 0, position[0])
        object.position.copy(v3)
        const rotation = map.getRotation()

        object.rotation.y = rotation * Math.PI / 180
    }
    map.render();
    TWEEN && TWEEN.update()
}

以上文章內容有一些關於threejs的基礎知識,可以先提前瞭解一下,否則有很多好玩有趣的效果實現不出來。

2023-06-08 14.19.35.gif

其他

關於飛線,只是作為裝飾,顯得畫面不那麼呆板,在官網上也有案例,簡單貼一個代碼吧

 // 飛線
var geo = new (window as any).Loca.GeoJSONSource({
    url: 'https://a.amap.com/Loca/static/loca-v2/demos/mock_data/bj_bus.json',
});

var layer = new (window as any).Loca.PulseLineLayer({
    // loca,
    zIndex: 10,
    opacity: 1,
    visible: true,
    zooms: [1, 30],
});

var headColors = ['#EFBB51', '#7F3CFF', '#4CC19B', '#0B5D74', '#E06AC4', '#223F9B', '#F15C1A', '#7A0FA6'];

layer.setSource(geo);

layer.setStyle({
    altitude: 0,
    lineWidth: 2,
    // 脈衝頭顏色
    headColor: (_, feature) => {
        return headColors[feature.properties.type - 1];
    },
    // 脈衝尾顏色
    trailColor: 'rgba(128, 128, 128, 0.5)',
    // 脈衝長度,0.25 表示一段脈衝占整條路的 1/4
    interval: 0.25,
    // 脈衝線的速度,幾秒鐘跑完整段路,可以通過計算距離動態改變時間
    duration: 5000,
});
// 飛線結束

loca.add(layer);

本文轉載於:

https://juejin.cn/post/7242145254056673335

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 摘要:業務應用對資料庫的數據請求分寫請求(增刪改)和讀請求(查)。當存在大量讀請求時,為避免讀請求阻塞寫請求,資料庫會提供只讀實例方案。通過主實例+N只讀實例的方式,實現讀寫分離,滿足大量的資料庫讀取需求,增加應用的吞吐量。 業務應用對資料庫的數據請求分寫請求(增刪改)和讀請求(查)。當存在大量讀請 ...
  • 摘要:本期結合示例,詳細介紹華為雲數字工廠平臺的數據分析模型和數據圖表視圖模型的配置用法。 本文分享自華為雲社區《數字工廠深入淺出系列(六):數據分析與圖表視圖模型的配置用法》,作者:雲起MAE 。 華為雲數字工廠平臺基於“數據與業務一體化”理念,提供統一的製造全域數據平臺底座,內置輕量級製造數據分 ...
  • 時下,眾多金融機構在積極推行數字化改革,以適應時代高速革新。為回應市場對信息即時生效的迫切需求,各家[券商機構](https://www.dtstack.com/solution/securities?src=szsm)都需要更具競爭力的信息服務。 本次方案結合券商場景與業務實踐,圍繞客戶實際面臨的 ...
  • 衛健行業是關乎國家和民生安全的關鍵行業。近年來,雲計算、大數據、人工智慧等技術不斷發展,並與醫療行業深入融合。同時,相關部門相繼頒發一系列政策,進一步推動醫療行業數字化、智慧化轉型,促進探索健康中國高質量發展道路。 ...
  • #其他預設調整值#MySQL Server實例配置文件# #由MySQL Server實例配置嚮導生成###安裝說明# ##在Linux上,您可以將此文件複製到/etc/my.cnf以設置全局選項,#mysql-data-dir/my.cnf設置伺服器特定選項(用於此安裝的@localstatedi ...
  • ## 索引失效 ### 準備數據: ```sql CREATE TABLE `dept` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `deptName` VARCHAR(30) DEFAULT NULL, `address` VARCHAR(40) DEFAUL ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • 一、資料庫常規概念 1、什麼是資料庫 資料庫是“按照數據結構來組織、存儲和管理數據的倉庫”。 2、有哪些常見的資料庫管理系統 關係型資料庫:存儲的數據是表結構的數據 ​ MySQL Oracle SQLServer DB2 SQLite ​ 非關係型資料庫:存儲的是鍵值對形式的數據 ​ redis ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...