OpenLayers 加载内存格式GeoTIFF影像

前言

GeoTIFF是开放地理控件联盟(OGC)实施标准,在TIFF的基础上,嵌入了地理空间元数据,也就是说,GeoTIFF是带有地理空间参考和地理数据的TIFF文件。其中GeoTIFF元数据包括坐标系、地图投影以及特定位置信息等。GeoTIFF格式广泛应用于航空影像、卫星影像以及数字高程模型中。在上节介绍了OpenLayers加载iis部署的GeoTIFF影像,

本节主要介绍采用Blob的方式加载GeoTIFF影像。OpenLayers加载iis部署的GeoTIFF影像链接:

1. 下载GeoTIFF数据

下载GeoTIFF数据,请参考GIS 影像数据源介绍。https://www.yuque.com/u37362584/pg4zca/nmw9pt7fgzkbfx3h#Geag9

2. 添加geotiff.js

OpenLayers中加载GeoTIFF影像之前,需要先引入geotiff.js库。cdn 地址: https://www.jsdelivr.com/package/npm/geotiff

3. IIS部署GeoTIFF文件

在本机测试可以采用windows自带的web服务器iis部署GeoTIFF文件,然后通过http进行访问

4. 加载GeoTIFF文件

通过fetch接口请求tif数据,然后调用blob()获取文件数据。

php 复制代码
    const url = "http://localhost/GeoTIFF/s1a_clip.tif"
    fetch(url)
        .then(response => response.blob())
        .then(blob => {
            console.log("blob:", blob)
            const source = new ol.source.GeoTIFF({
                sources: [
                    {
                        blob: blob
                    }
                ],
                nodata: 0, // 设置无效数据为0
                opaque: true, // 开启透明
                convertToRGB: true // 将色彩系统转换为RGB
            })

            // 加载GeoTIFF影像数据
            const tiffLayer = new ol.layer.WebGLTile({
                source: source
            })
            const map = new ol.Map({
                target: "map",
                loadTilesWhileInteracting: true,
                layers: [tiffLayer],
                view: source.getView().then(viewConfig => {
                    console.log("viewConfig:", viewConfig)
                    viewConfig.showFullExtent = true // 初始化时全幅显示图层
                    // viewConfig.extent = []
                    return viewConfig
                }),
                // 地图默认控件
                controls: ol.control.defaults.defaults({
                    zoom: false,
                    attribution: true,
                    rotate: true
                })
            })
        })

5. 完整代码

其中libs文件夹下的包需要更换为自己下载的本地包或者引用在线资源。本示例引用了layui组件,请自行替换。

xml 复制代码
<!DOCTYPE html>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>加载GeoTIFF影像</title>
    <meta charset="utf-8" />

    <script src="../../../js/ol9.2.4.js"></script>
    <script src="../../../libs/layui/layui.js"></script>

    <link rel="stylesheet" href="../../../css/ol9.2.4.css">
    <link rel="stylesheet" href="../../../libs/layui/css/layui.css">

    <script src="https://cdn.jsdelivr.net/npm/geotiff@2.1.3/dist-browser/geotiff.min.js"></script>
    <style>
        * {
            padding: 0;
            margin: 0;
            font-size: 14px;
            font-family: '微软雅黑';
        }

        html,
        body {
            width: 100%;
            height: 100%;
        }

        #map {
            position: absolute;
            top: 50px;
            bottom: 0;
            width: 100%;
        }

        #top-content {
            position: absolute;
            width: 100%;
            height: 50px;
            line-height: 50px;
            background: linear-gradient(135deg, #ff00cc, #ffcc00, #00ffcc, #ff0066);
            color: #fff;
            text-align: center;
            font-size: 32px;
        }

        #top-content span {
            font-size: 32px;
        }
    </style>
</head>

<body>
    <div id="top-content">
        <span>加载GeoTIFF影像数据</span>
    </div>
    <div id="map" title="地图显示"></div>

</body>

</html>

<script>

    /** 自行更换为本地tif文件地址**/

    // url: "http://localhost/GeoTIFF/tci.tif"
    // url: "http://localhost/GeoTIFF/LC08_B7.tif"
    // url: "http://localhost/GeoTIFF/s1a_clip.tif"
    // url: "http://localhost/GeoTIFF/LC08_B1.tif"
    // url: "http://localhost/GeoTIFF/LE07_clip.tif"

    const url = "http://localhost/GeoTIFF/s1a_clip.tif"
    fetch(url)
        .then(response => response.blob())
        .then(blob => {
            const source = new ol.source.GeoTIFF({
                sources: [
                    {
                        blob: blob
                    }
                ],
                nodata: 0, // 设置无效数据为0
                opaque: true, // 开启透明
                convertToRGB: true // 将色彩系统转换为RGB
            })

            // 加载GeoTIFF影像数据
            const tiffLayer = new ol.layer.WebGLTile({
                source: source
            })

            const map = new ol.Map({
                target: "map",
                loadTilesWhileInteracting: true,
                layers: [tiffLayer],
                view: source.getView().then(viewConfig => {
                    console.log("viewConfig:", viewConfig)
                    viewConfig.showFullExtent = true // 初始化时全幅显示图层
                    // viewConfig.extent = []
                    // for (let i = 2; i < 5; i++) {
                    //     viewConfig.resolutions.unshift(Math.pow(i, 2))
                    // }
                    return viewConfig
                }),
                // 地图默认控件
                controls: ol.control.defaults.defaults({
                    zoom: false,
                    attribution: true,
                    rotate: true
                })
            })
        })
</script>

OpenLayers示例数据下载,请回复关键字:ol数据

全国信息化工程师-GIS 应用水平考试资料,请回复关键字:GIS考试

【GIS之路】 已经接入了智能助手,欢迎关注,欢迎提问。

欢迎访问我的博客网站-长谈GIShttp://shanhaitalk.com

都看到这了,不要忘记点赞、收藏 + 关注

本号不定时更新有关 GIS开发 相关内容,欢迎关注 !

相关推荐
Setsuna_F_Seiei3 小时前
前端的 AI 学习之路 01 之 Agent API 调用 - 和 Agent 的基础对话
前端·人工智能·ai编程
threerocks4 小时前
AI 原生软件开发生命周期手册 - 如何借助 AI,逐阶段改造软件开发生命周期
前端·javascript·后端
徐小夕4 小时前
3分钟从想法到Agent上线:我们开源了一款AI可视化工作流“IDE”
前端·算法·github
why技术6 小时前
eli5,我觉得这个全网在吹的技能,使用体验真的很一般啊。
前端·人工智能·后端
excel6 小时前
记录升级 nuxt3 到 nuxt4 记录
前端
剑胆琴心静水深流6 小时前
全栈之路6---web集成与呈现
前端·vue.js·spring boot·分布式·spring·前端框架·npm
前端snow7 小时前
ai agent -- Memory汇总
前端
ITresearchGuest7 小时前
AI 焦虑下,前端该何去何从
前端·人工智能
Codiggerworld7 小时前
Chrome DevTools 隐藏神技:这 5 个调试技巧你可能从来没用过
前端·chrome·chrome devtools
旋生万物7 小时前
【终极实战】用Python从零“生成“一个宇宙:螺旋干涉模型的代码实现
开发语言·前端·人工智能·react.js·php·wpf