主頁 > 企業開發 > 記錄--寫一個高德地圖巡航功能的小DEMO

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

2023-06-30 08:29:46 企業開發

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

風格設定

加載地圖

使用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

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

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/556353.html

標籤:其他

上一篇:CSS基礎-背景

下一篇:返回列表

標籤雲
其他(161889) Python(38266) JavaScript(25517) Java(18284) C(15238) 區塊鏈(8274) C#(7972) AI(7469) 爪哇(7425) MySQL(7273) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5876) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4609) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2438) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1985) HtmlCss(1979) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 記錄--寫一個高德地圖巡航功能的小DEMO

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

    uj5u.com 2023-06-30 08:29:46 more
  • CSS基礎-背景

    # 背景 ### **background-color** 背景顏色, 可以使用十六進制、rgb、rgba表示。 **語法** ```css /**selector 背景元素的原則去*/ /** color 背景顏色的值, 可以是 顏色名稱、十六進制值、RGB、RGBA*/ selector { b ......

    uj5u.com 2023-06-30 08:29:30 more
  • 京東到家小程式-在性能及多端能力的探索實踐

    為了提高研發效率,經過技術選型采用了taro3+原生混合開發模式,本文主要講解我們是如何基于taro框架,進行多端能力的探索和性能優化。 ......

    uj5u.com 2023-06-30 08:29:18 more
  • 初入前端-HTML

    ## HTML ### HTML歷史 HTML(Hypertext Markup Language)的歷史可以追溯到上世紀90年代初,以下是HTML的主要歷史階段: 1. HTML 1.0:在1991年發布,是HTML的最初版本,用于創建基本的文本和鏈接結構,但功能有限。 2. HTML 2.0:于 ......

    uj5u.com 2023-06-30 08:29:14 more
  • 圖書商城專案練習②后端服務Node/Express/Sqlite

    本系列文章是為學習Vue的專案練習筆記,盡量詳細記錄一下一個完整專案的開發程序。面向初學者,本人也是初學者,搬磚技識訓不成熟。專案在技術上前端為主,包含一些后端代碼,從基礎的資料庫(Sqlite)、到后端服務Node.js(Express),再到Web端的Vue,包含服務端、管理后臺、商城網站、小程... ......

    uj5u.com 2023-06-30 08:28:53 more
  • XHbuilder 需要的 ipa 簽名,超詳細的教程,你不看吃虧的是自己!

    今天使用 hbuilder 運行到 ios 真機的時候,突然發現還需要 ipa 簽名,這是什么東東呢? 1、IPA 簽名是什么? 因蘋果公司禁止企業證書用于非企業內部開發者。所以開發者無法再使用DCloud的企業證書簽名的標準運行基座。 運行標準基座到iOS真機設備前,需要使用開發者的證書對基座簽名 ......

    uj5u.com 2023-06-30 08:28:36 more
  • 圖書商城專案練習①管理后臺Vue2/ElementUI

    本系列文章是為學習Vue的專案練習筆記,盡量詳細記錄一下一個完整專案的開發程序。面向初學者,本人也是初學者,搬磚技識訓不成熟。專案在技術上前端為主,包含一些后端代碼,從基礎的資料庫(Sqlite)、到后端服務Node.js(Express),再到Web端的Vue,包含服務端、管理后臺、商城網站、小程... ......

    uj5u.com 2023-06-30 08:22:43 more
  • typescript的必要性及使用

    作為一個前端語言,Javascript從最初只是用來寫頁面,到如今的移動終端、后端服務、神經網路等等,它變得幾乎無處不在。如此廣闊的應用領域,對語言的安全性、健壯性以及可維護性都有了更高的要求。盡管ECMAScript標準在近幾年有了長足的進步,但是在型別檢查方面依然毫無建樹。在這種情況下TypeS... ......

    uj5u.com 2023-06-30 08:22:16 more
  • Vue Router 原始碼分析

    最終成果,實作了一個可運行的核心路由工程:柏成/vue-router3.x。地址如下:https://gitee.com/lbcjs/vue-router3.x ......

    uj5u.com 2023-06-30 08:22:12 more
  • typescript的必要性及使用

    作為一個前端語言,Javascript從最初只是用來寫頁面,到如今的移動終端、后端服務、神經網路等等,它變得幾乎無處不在。如此廣闊的應用領域,對語言的安全性、健壯性以及可維護性都有了更高的要求。盡管ECMAScript標準在近幾年有了長足的進步,但是在型別檢查方面依然毫無建樹。在這種情況下TypeS... ......

    uj5u.com 2023-06-30 08:21:59 more