欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關于mapboxgl加載tiff的問題

 更新時間:2022年09月29日 10:46:08   作者:GIS兵器庫  
這篇文章主要介紹了mapboxgl加載tiff,先使用geotiff.js解析tiff數(shù)據(jù),再配合使用canvas繪制圖片導出base64格式數(shù)據(jù),然后就可以使用添加到mapboxgl圖層了,本文結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下

mapboxgl通過添加tiff圖層,解決小網(wǎng)格的fill圖層在地圖縮小時圖層不顯示問題

緣起

近期在項目中遇到這么一個需求,需要在地圖上展示一組格網(wǎng)數(shù)據(jù),格網(wǎng)大小為2m*2m,地圖api用的mapboxgl。起初拿到這個需要感覺很easy,在地圖上添加一個fill圖層就好啦。把格網(wǎng)面數(shù)據(jù)添加到地圖上之后,在大比例尺下顯示正常,但是當?shù)貓D層級小于15級時,渲染出的結果會消失。

簡單理一下原因,應該是在地圖縮小后,每個網(wǎng)格所占的像素太小,所以就消失了。

mapboxgl在處理symbol圖層的時候,會遇到點位自動避讓問題,導致部分點位不顯示。解決方法是把layout中的icon-allow-overlap設置為true,這樣就相當于關閉了自動避讓功能,所有點圖標保持可見狀態(tài)。但是針對fill圖層卻沒有這么一個屬性。

但是這種情況又需要查看數(shù)據(jù),要如何實現(xiàn)呢?

首先分析下數(shù)據(jù),我的原始數(shù)據(jù)是通過模型導出的tiff格式的柵格數(shù)據(jù),然后在后臺根據(jù)tiff格式數(shù)據(jù)中每個像素所在行列號以及其灰度值生成帶屬性的格網(wǎng)數(shù)據(jù),其中像素的灰度值就是在渲染時需要分類展示的值。既然原始tiff數(shù)據(jù)的灰度值就是所用的屬性值,那是不是直接添加到地圖就好了。接下來的解決方案就是看是否能直接用mapboxgl直接加載tiff數(shù)據(jù),并渲染出自己想要的效果。

mapboxgl加載tiff

查看mapboxgl文檔,可以看到mapboxgl支持image圖層,只需傳入url和coordinates

// 添加至地圖
map.addSource('some id', {
  type: 'image',
  url: 'https://www.mapbox.com/images/foo.png',
  coordinates: [
    [-76.54, 39.18],
    [-76.52, 39.18],
    [-76.52, 39.17],
    [-76.54, 39.17]
]});

可是,當我把地址換成tiff數(shù)據(jù)時卻報錯了。下面為報錯內容:

Could not load image because of The source image could not be decoded.. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported

可以簡單理解為不支持tiff格式。

tiff文件解析

既然mapboxglimage圖層不支持tiff格式,那是不是可以把tiff數(shù)據(jù)導出成png呢,于是使用arcmap打開了tiff數(shù)據(jù),導出數(shù)據(jù)格式也支持png,但是在保存時又報錯了。

經(jīng)過分析,發(fā)現(xiàn)是tiff數(shù)據(jù)波段數(shù)量的原因,我的這份數(shù)據(jù)波段數(shù)為1,從網(wǎng)上下載了一份測試數(shù)據(jù),波段數(shù)為3,可以成功導出。

在查找相關解決方案的時候,看到這么個工具,geotiff.js,可以通過js解析tiff數(shù)據(jù)并渲染,leaflet有個擴展就是用的這個工具,https://github.com/stuartmatthews/leaflet-geotiff。查看geotiff.js相關文檔,發(fā)現(xiàn)其實用起來還是挺方便的,通過簡單的代碼實現(xiàn)的我的需求。

先使用geotiff.js解析tiff數(shù)據(jù),再配合使用canvas繪制圖片導出base64格式數(shù)據(jù),然后就可以使用添加到mapboxgl圖層了。

核心代碼如下:

async function getData() {
  GeoTIFF.fromUrl(url).then(tiff => {
    console.log(tiff)
    getImage(tiff)
  });
}
async function getImage(tiff) {
  const image = await tiff.getImage();
  let bbox = await image.getBoundingBox();
  let data = await image.readRasters({
    samples: rgbBands // 波段數(shù)量,一個波段:[0],三個波段:[2,1,0]
  });
  let base64Image = getBase64Image(data)
  addToMapboxgl(base64Image)
}
function getBase64Image(data) {
  let thumbnailPixelHeight = data.height
  let thumbnailPixelWidth = data.width
  let canvas = document.createElement('canvas')
  canvas.width = thumbnailPixelWidth
  canvas.height = thumbnailPixelHeight
  let ctx = canvas.getContext("2d")
  let totalPixelCount = 0
  for (let y = 0; y < thumbnailPixelHeight; y++) {
    for (let x = 0; x < thumbnailPixelWidth; x++) {
      let colour = 'rgb(0, 0, 0, 0)' // let the default be no data (transparent)
      // 根據(jù)灰度值所在范圍渲染顏色
      if (data[0][totalPixelCount] > 0) {
        if (data[0][totalPixelCount] > 50 && data[0][totalPixelCount] <= 55) {
          colour = `rgb(15, 255, 0, 1)`
        } else if (data[0][totalPixelCount] > 55 && data[0][totalPixelCount] <= 60) {
          colour = `rgb(155, 255, 0, 1)`
        } else if (data[0][totalPixelCount] > 60 && data[0][totalPixelCount] <= 65) {
          colour = `rgb(255, 255, 0, 1)`
        } else {
          colour = `rgb(255, 255, 0, 1)`
        }
      }
      ctx.fillStyle = colour
      ctx.fillRect(x, y, 1, 1)
      totalPixelCount++
    }
  }
  let canvasImage = canvas.toDataURL("image/png")
  return canvasImage
}
// 將圖片添加到地圖
function addToMapboxgl(image) {
  map.addSource('tiff-source', {
    "type": "image",
    "url": image,
    "coordinates": [
      [114.425597191307, 38.1091563484708],
      [114.538187627939, 38.1091563484708],
      [114.538187627939, 37.9627378349512],
      [114.425597191307, 37.9627378349512]
    ]
  });
  map.addLayer({
    id: 'tiff-layer',
    'type': 'raster',
    'source': 'tiff-source',
    'paint': {
      'raster-fade-duration': 0
    }
  });
}

本以為到這里問題已經(jīng)解決,但是在查看地圖時,發(fā)現(xiàn)圖片圖層數(shù)據(jù)疊加到底圖有不小的偏移。

經(jīng)過一番對比分析,發(fā)現(xiàn)原來是tiff數(shù)據(jù)的坐標系與地圖坐標系不一致的導致的。我拿到的tiff數(shù)據(jù)坐標系為西安80的投影坐標系,在展示時配置的為wgs84地理坐標系,所以會有偏差。既然是坐標系問題,那就通過工具對tiff文件做下投影轉換。這里用的是arcmap,打開ArcToolbox–>Data Management Tools–>Projections and Transformations–>Raster–>Project Raster

轉換之后會發(fā)現(xiàn),數(shù)據(jù)的行列值也會發(fā)生變化,也就是tiff圖片的大小和形狀都有所變化。

轉換前:

轉換后:

使用轉換后的數(shù)據(jù)再次解析,然后疊加到地圖,位置完全匹配。

最終展示方案

通過嘗試發(fā)現(xiàn),單獨的圖片展示時,由于圖片分辨率固定,當?shù)貓D等級放大到一定程度圖片會被放大很多導致圖片模糊不清,展示效果不理想;單獨的格網(wǎng)面展示時,當?shù)貓D等級縮小到一定程度,面圖層則會消失,也就是文章開頭提到的問題。

綜上,根據(jù)自己的格網(wǎng)數(shù)據(jù)大小,判斷在哪個等級格網(wǎng)面數(shù)據(jù)會消失,小于這個等級使用圖片展示,大于這個等級用格網(wǎng)面展示,就可以完美的展示出想要的效果。

處理前效果:

處理后效果:

以上為有tiff柵格數(shù)據(jù)情況的解決方案,針對于只有格網(wǎng)面數(shù)據(jù),而沒有tiff柵格數(shù)據(jù)的情況要怎么解決呢?

如果在這組格網(wǎng)數(shù)據(jù)中,每個網(wǎng)格的屬性中有他所在原始tiff數(shù)據(jù)的像素位置,以及原始tiff數(shù)據(jù)像素大小,就可以寫一個類似上文中的getBase64Image方法,遍歷每個網(wǎng)格,在網(wǎng)格對應的像素位置上繪制顏色,然后再通過canvas導出圖片添加到地圖。

總結

  • mapboxglimage圖層無法直接添加tiff柵格數(shù)據(jù)
  • mapboxgl添加fill圖層時,地圖層級縮小到一定程度,面數(shù)據(jù)所占像素值過小無法顯示
  • tiff數(shù)據(jù)可以使用geotiff.js+canvas解析,得到base64的圖片,添加到mapboxglimage圖層
  • 在解析tiff數(shù)據(jù)時,需注意它的坐標系、波段個數(shù)等信息
  • 在做展示時可以image圖層和fill圖層結合展示,效果較好

參考資料:

到此這篇關于mapboxgl加載tiff的文章就介紹到這了,更多相關mapboxgl加載tiff內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 解決maven第一次創(chuàng)建項目太慢的問題

    解決maven第一次創(chuàng)建項目太慢的問題

    Maven是 Apache 下的一個純 Java 開發(fā)的開源項目,是一個項目構建和管理的工具;它提供了幫助管理 構建、文檔、報告、依賴、scms、發(fā)布、分發(fā)的方法。這篇文章主要介紹了maven第一次創(chuàng)建項目太慢的解決方法,需要的朋友可以參考下
    2020-02-02
  • 語言編程花絮內建構建順序示例詳解

    語言編程花絮內建構建順序示例詳解

    這篇文章主要為大家介紹了語言編程花絮內建構建順序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Elasticsearch設置密碼的方法與驗證

    Elasticsearch設置密碼的方法與驗證

    在Elasticsearch中設置密碼是為了保護您的數(shù)據(jù)安全,下面這篇文章主要給大家介紹了關于Elasticsearch設置密碼方法與驗證的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-07-07
  • 網(wǎng)頁報錯"Form?elements?must?have?labels"的處理方法

    網(wǎng)頁報錯"Form?elements?must?have?labels"的處理方法

    這篇文章主要給大家介紹了關于網(wǎng)頁報錯"Form?elements?must?have?labels"的處理方法,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2023-06-06
  • 對于組件庫的思考及技術梳理詳解

    對于組件庫的思考及技術梳理詳解

    這篇文章主要為大家介紹了對于組件庫的思考及技術梳理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • 4G與5G的區(qū)別有哪些

    4G與5G的區(qū)別有哪些

    說起5G,現(xiàn)在在網(wǎng)絡中已經(jīng)是很常見的了,亦是未來生活的新標桿,接下來我們便一起來學習5G和4G有什么不同
    2021-08-08
  • VSCode + WSL 2 + Ruby環(huán)境搭建圖文詳解

    VSCode + WSL 2 + Ruby環(huán)境搭建圖文詳解

    這篇文章主要介紹了VSCode + WSL 2 + Ruby環(huán)境搭建,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • ChatGPT 中文調教指南總結

    ChatGPT 中文調教指南總結

    ChatGPT是一個訓練有素的大型語言模型,可以幫助你回答各種問題,本文介紹了ChatGPT 中文調教指南,感興趣的可以了解一下
    2023-05-05
  • 網(wǎng)址(URL)支持的最大長度是多少?最大支持多少個字符?

    網(wǎng)址(URL)支持的最大長度是多少?最大支持多少個字符?

    這篇文章主要介紹了網(wǎng)址(URL)支持的最大長度是多少?最大支持多少個字符?本文總結了IIS、apache服務器及瀏覽器軟件Internet Explorer、Firefox、Opera、chrome等主流的瀏覽器軟件支持情況,需要的朋友可以參考下
    2015-07-07
  • 字符集和字符編碼(Charset & Encoding)

    字符集和字符編碼(Charset & Encoding)

    相信大家一定碰到過,打開某個網(wǎng)頁,卻顯示一堆像亂碼,如"б&#1031;ЯАзЪСЯ"、"&#65533;????????"?還記得HTTP中的Accept-Charset、Accept-Encoding、Accept-Language、Content-Encoding、Content-Language等消息頭字段?這些就是接下來我們要探討的
    2012-04-04

最新評論