記錄--在高德地圖實現流動的線圖層

来源:https://www.cnblogs.com/smileZAZ/archive/2023/11/01/17803817.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 介紹 有朋友反饋說最近分享的內容不太好理解,那麼今天來分享個早前開發的圖層製作過程,基於GIS數據代碼生成流動的車行線,上手很簡單。下麵我將在實現思路、具體開發、數據來源這幾方面逐步講解,希望讀者能從中獲取對數據可視化開發的興趣。文中使用 ...


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

介紹

有朋友反饋說最近分享的內容不太好理解,那麼今天來分享個早前開發的圖層製作過程,基於GIS數據代碼生成流動的車行線,上手很簡單。下麵我將在實現思路、具體開發、數據來源這幾方面逐步講解,希望讀者能從中獲取對數據可視化開發的興趣。文中使用到高德地圖JSAPI、three.js和一些GIS數據處理工具。

實現思路

1.這是我們通常能夠獲取到的數據,從geoJSON數據通常沒有真正的曲線,得到通常是基於關鍵節點生成的線段幾何體,只要線越密集,看上去就越平滑,所消耗的資源也就越多。

 2.在空間幾何中,線本身是沒有寬度這個概念的,我們能看到不同粗細程度到線,其本質其實是一連串拼合的三角面帶,這些面始終朝著相機,這樣的話才保證我們在不同角度看到的始終是“均勻圓潤”的線。

 3.給這些幾何賦予純色材質,整條線看著像一個整體。

 4.根據具體場景給幾何體賦予貼圖,我們知道如果用相機長曝光模式去拍攝夜晚車輛移動,能夠看到一條從亮到暗的軌跡,因為給線圖層也賦予這樣一層貼圖。

 5.通過調整貼圖的X軸偏移讓線條動起來。

 6.增加後期輝光效果,給圖層賦予光的質感。

實現步驟

1.編寫構造函數,聲明基礎的參數。這裡Layer為基類,封裝了在高德地圖上創建glCustomLayer圖,管理圖層,逐幀函數等基礎操作。

class FlowlineLayer extends Layer {
  // 圖層數據
        _data = []
        // 線材質
  _material = null

  /**
   *  @param {Object}   config
   *  @param {geoJSON}  config.data 路徑數據  
   *  @param {Number}   [config.lineWidth=20.0] 路徑線條寬度
   *  @param {Number}   [config.altitude=0.0] 整體海拔高度
   *  @param {Array}    [config.zooms=[5,14]] 顯示區間
   *  @param {Boolean}  [config.animate=true] 是否顯示動畫
   *  @param {Number}   [config.speed=1.0]  流動速度繫數
   *  @param {String}   [config.uvMapURL='./static/texture/road_bg1.png'] 線條紋理URL
   */
  constructor (config) {
    const conf = {
      data: null,
      speed: 1,
      animate: true,
      lineWidth: 20.0,
      altitude: 0.0,
      uvMapURL: './static/texture/road_bg1.png',
      ...config
    }

    super(conf)

    this.initData(conf.data)
  }	
}

2.將Polyline的geoJSON數據並轉為空間坐標

initData (data) {
  const arr = data?.features.map(item => {
    return item?.geometry?.coordinates[0]
  })
	// 經緯度轉為空間坐標
  const res = this.customCoords.lngLatsToCoords(arr)
  this._data = res
}
3.根據數據創建幾何體,並設置材質。事實上我們得到的是一條沒有寬度的線的數據,而最終的展示的是平行於地面的一條平面帶,這裡我們使用插件meshline,它提供的MeshLineGeometry能夠自動幫我們生成所需的幾何體。
import { MeshLineGeometry, MeshLineMaterial } from '../plugins/meshline.js'
//...

initLines () {
    const { scene } = this

	  //材質紋理
    const texture = new THREE.TextureLoader().load(this.mergeSourceURL(this._conf.uvMapURL))
    texture.wrapS = THREE.RepeatWrapping
    texture.wrapT = THREE.RepeatWrapping
    const material = new MeshLineMaterial({
      lineWidth: this._conf.lineWidth,
      sizeAttenuation: 1,
      useMap: 1,
      opacity: 1,
      map: texture,
      transparent: true,
      depthTest: true
    })
    this._material = material

	  //生成網格體
    const multiLine = [...this._data]
    multiLine.forEach(lineData => {
      const points = []
      lineData.forEach(([x, y]) => {
        points.push(new THREE.Vector3(x, y, this._conf.altitude))
      })

      const line = new MeshLineGeometry()
      line.setPoints(points)
      const mesh = new THREE.Mesh(line, material)

      scene.add(mesh)
    })
  }

4.在requestAnimationFrame逐幀修改紋理的x偏移量,形成動畫效果

// 更新紋理偏移量
update () {
    if (!this._isAnimate) {
      return
    }
    if (this._material?.uniforms?.offset) {
      this._material.uniforms.offset.value.x -= 0.01 * this._conf.speed
    }
}

5.添加後期效果,這塊不作展開,有興趣可以看 這裡

const layer = new FlowlineLayer({
    id: 'trafficLayer',
    //...
  })

  layer.on('complete',(layer)=>{
    new EffectLayer({
        layer,
        style:{
            strength: 1.0, //發光強度
            radius: 0.5 //泛光半徑
        }
    })
  })

路徑數據從哪來

1.通過地圖引擎的路徑導航功能獲取路徑,如下圖所示,通過指定起點、終點、經過點可以從API中獲取規劃好的路徑數據,適合在地圖上能查得到的部分道路

 2.自行繪製,如果需要展示的路徑還處於規劃中,或者屬於園區內部道路數據,在官方地圖上無法獲取,則需要人工使用工具做繪製,這裡推薦使用QGIS繪製矢量圖層。

 3.如果是涉及範圍或數據量較大的路徑,則需要通過某些途徑導出了,通過OSM可以無套路導出所需的各種點線面數據,缺點就是有些數據實在太老舊了。在國內我們使用水經註之類的GIS數據下載器獲取最新最全的數據,當然,優質的數據都是收費的。

本文轉載於:

https://juejin.cn/post/7294844864020348982

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

 


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

-Advertisement-
Play Games
更多相關文章
  • CodeBuilder是一款強大的代碼生成工具,目前發佈了 3.2 版本,大家可以前去下載體驗 官方主頁。 1、多種數據源 基於 ADO.NET 的數據驅動 Power Designer PDManer DbSchema Swagger 這幾種數據源基本上已經覆蓋了我們常用的數據環境了,如果你有能力 ...
  • 300元到手啦-阿裡云云工開物計劃 阿裡雲要給所有中國高校在讀大學生每人送一臺雲伺服器 先放鏈接: 點擊進入 優惠券適用於以下場景 阿裡雲預付費通用,增量帶寬,降級,阿裡雲按量付費賬單,新購,續費,轉正,帶寬補償,試用,轉換訂單,更換操作系統,擴容,升級,換購 必須是在校大學生且完成認證,認證跟著指 ...
  • Apollo 特點:成熟,穩定 支持管理多環境/多集群/多命名空間的配置 配置修改發佈實時(1s)通知到應用程式 支持許可權控制、配置繼承,版本管理,灰度發佈,使用監控等 ...
  • TerraMoursGPT V1.0 開發總結 TerraMoursGPT V1.0 是之前gpt項目基於TerraMours後端框架的重構,實現用戶登陸和基於SK的多語言模型聊天、基於chatgpt和SD的多模型圖片生成等功能。管理端實現數據看板、聊天記錄管理,圖片記錄管理、用戶管理、系統配置等。 ...
  • 前言 為滿足業務需要,需要為項目中自定義模板添加一個計算欄位的組件,通過設置字元串表達式,使用時在改變表達式其中一個欄位的數據時,自動計算另外一個欄位的值。 本篇為上篇,介紹原理,簡單實現一個工具,輸入字元串表達式,解析其中的參數,輸入參數計算結果。 下篇將基於此封裝實現對Mongo查詢語法的封裝, ...
  • 簡介: 背景:一直以來在項目上經常使用ping指令來測試網路通信,最近稍微研究了一下常用的指令,記錄以作備忘。--MaQaQ 2023-11-1 ping (Packet Internet Groper)是一種網際網路包探索器,用於測試網路連接量的程式 。Ping是工作在 TCP/IP網路體繫結構中應 ...
  • 根據北京研精畢智信息咨詢發佈的調查報告,2018-2021年,全球數據存儲量由30ZB上升至55ZB左右,年平均增長率約為27.8%。到2022年,數據總存儲量進一步增加至65ZB以上,較2021年同期新增了約10ZB,同比增長18.2%。各市場主體對數據的重視程度不斷提升,數據應用逐步由批量處理向 ...
  • HarmonyOS 提供了強大的 UI 開發工具和組件,使開發者能夠創建吸引人的用戶界面。本章將詳細介紹在 HarmonyOS 中應用 JS、CSS、HTML,HarmonyOS 的 UI 組件以及如何自定義 UI 組件。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...