Mapboxgl 根据 AWS 地形的高程值制作等高线

更多精彩内容尽在dt.sim3d.cn,关注公众号【sky的数孪技术】,技术交流、源码下载请添加VX:digital_twin123

image.png

使用mapboxgl 3.0版本,根据 AWS 地形图块的高程值制作等高线,源码如下:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>Contours</title>
    <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
    <link href="https://api.mapbox.com/mapbox-gl-js/v3.0.0/mapbox-gl.css" rel="stylesheet">
    <script src="https://api.mapbox.com/mapbox-gl-js/v3.0.0/mapbox-gl.js"></script>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.7.7/dat.gui.min.js"></script>

    <style>
        body {
            margin: 0;
            padding: 0;
        }

        #map {
            position: absolute;
            top: 0;
            bottom: 0;
            width: 100%;
        }
    </style>
</head>

<body>
<div id="map"></div>
<script>
    function generateContours() {
        let steps = ['step',
            ['raster-value']
        ]

        for (let i = guiInstance.minElev + guiInstance.stepInterval; i <= guiInstance.maxElev; i++) {
            if (Math.abs(guiInstance.referenceElev - i) % guiInstance.stepInterval === 0) {
                steps.push('transparent')
                steps.push(i)

            } else if (Math.abs((guiInstance.referenceElev + guiInstance.stepWidth) - i) % guiInstance.stepInterval === 0) {
                steps.push(guiInstance.contourColor)
                steps.push(i)
            }
        }

        steps.push('transparent')

        map.setPaintProperty('aws-terrain-raster', 'raster-color', steps)
    }
    let guiObject = function () {
        this.referenceElev = 0;
        this.minElev = 0;
        this.maxElev = 8900;
        this.stepInterval = 200;
        this.stepWidth = 50;
        this.contourColor = '#452d1f';
        this.contourOpacity = 0.75;
    };

    let guiInstance = new guiObject();

    let gui = new dat.GUI();

    let params = gui.addFolder("Contour Options")
    params.open();
    params.add(guiInstance, "referenceElev", 0, 8900, 1).name("参考高程").onChange(function (value) {
        generateContours()
    });
    let minElev = params.add(guiInstance, "minElev", 0, 8899, 1).name("最小高程").onChange(function (value) {
        if (value >= guiInstance.maxElev) {
            guiInstance.maxElev = value + 1;
            maxElev.updateDisplay();
        }
        generateContours()
    });
    let maxElev = params.add(guiInstance, "maxElev", 1, 8900, 1).name("最大高程").onChange(function (value) {
        if (value <= guiInstance.minElev) {
            guiInstance.minElev = value - 1;
            minElev.updateDisplay();
        }
        generateContours()
    });
    let stepInterval = params.add(guiInstance, "stepInterval", 20, 2000, 20).name("等高线间距").onChange(function (value) {
        if (value <= guiInstance.stepWidth) {
            guiInstance.stepWidth = value - 10;
            stepWidth.updateDisplay();
        }
        generateContours()
    });
    let stepWidth = params.add(guiInstance, "stepWidth", 10, 1000, 10).name("等高线宽度").onChange(function (value) {
        if (value >= guiInstance.stepInterval) {
            guiInstance.stepInterval = value + 20;
            stepInterval.updateDisplay();
        }
        generateContours()
    });
    params.addColor(guiInstance, "contourColor").name("等高线颜色").onChange(function (value) {
        generateContours()
    });
    params.add(guiInstance, "contourOpacity", 0, 1).name("等高线透明度").onChange(function (value) {
        map.setPaintProperty('aws-terrain-raster', 'raster-opacity', value)
    });

    mapboxgl.accessToken = 'pk.eyJ1IjoiZGt3aWVucyIsImEiOiJjbHJ3aWZxZWcwaWVnMnFvMnlxdjMwOWJjIn0.0JZciL5p5aT8AWSoIhgH6A';

    const map = new mapboxgl.Map({
        container: "map",
        center: {
            lat: 45,
            lng: -123
        },
        zoom: 6,
        attributionControl: false
    });

    map.addControl(new mapboxgl.ScaleControl({
        maxWidth: 200,
        unit: 'metric'
    }));

    map.on('load', () => {
        map.addSource('mapbox-dem', {
            'type': 'raster-dem',
            'url': 'mapbox://mapbox.mapbox-terrain-dem-v1',
            'tileSize': 512,
            'maxzoom': 14
        });
        map.setTerrain({ 'source': 'mapbox-dem', 'exaggeration': 2.5 });

        map.addSource('aws-terrain-raster', {
            "type": "raster",
            "minzoom": 1,
            "maxzoom": 18,
            "tiles": ["https://elevation-tiles-prod.s3.amazonaws.com/v2/terrarium/{z}/{x}/{y}.png"],
            "tileSize": 256,
            "attribution": "<a href='https://registry.opendata.aws/terrain-tiles/' target='_blank'>AWS Terrain Tiles</a>"
        })

        map.addLayer({
            id: 'aws-terrain-raster',
            source: 'aws-terrain-raster',
            type: 'raster',
            paint: {
                'raster-color': [
                    'step',
                    ['raster-value'],
                    '#000098', 1,
                    'transparent'
                ],
                'raster-color-mix': [
                    255 * 256.0,
                    255 * 1.0,
                    255 * 0.00390625,
                    -32768.0
                ],
                'raster-color-range': [0, 8900],
                'raster-opacity': 0.75,
                'raster-resampling': 'nearest'
            }
        })

        generateContours(guiInstance.elev)
    })
</script>

</body>

</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/783394.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OV证书签发一般要多久?

OV证书&#xff0c;即组织验证型SSL证书&#xff0c;的签发流程涉及多个阶段&#xff0c;其具体时间取决于多种因素。OV证书的签发一般需要1-3个工作日&#xff0c;这个过程可以分为以下几个阶段&#xff1a; 1、选择和购买证书&#xff1a; 用户需要在SSL证书服务商处选择合适…

AnaPico为众多工厂产线老化测试提供高效经济的微波解决方案

在电子设备的生产中&#xff0c;老化测试在整个使用寿命期间的可靠性和对声明参数的保证起着重要作用&#xff0c;尤其是在特殊应用&#xff08;国防和航天工业、电信、医药等&#xff09;方面。即使经过成功的参数和功能测试&#xff0c;在实际操作条件下使用时也有可能出现设…

【JSP+Servlet+Maven】——优质外卖订餐系统之概论部分

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

【Linux】进程的概念 + 查看进程

前言&#xff1a; 在前面我们学习了Liunx的基本指令和权限相关知识&#xff0c;还有基本工具的使用&#xff0c;有了以上的基础知识我们本章将正式接触Linux操作系统。 目录 1.冯诺依曼体系结构1.1 内存存在的意义1.2 程序加载到内存的含义1.3 程序的预加载&#xff1a; 2 .认识…

python读取指定文件夹下的图片(glob获取)

python读取指定文件夹下的图片&#xff08;glob获取&#xff09; 定义traverse_images函数&#xff0c;仅需要改变下根路径即可 glob是python中用来查找符合特定规则的文件路径名的函数 import os from glob import globdef traverse_images (folder_path):image_formats …

Google账号输入用户名和密码后提醒要到手机通知点是,还要点击数字,但是我手机收不到

有一些朋友换了一个新的电脑后手机登录谷歌账号时&#xff0c;用户名和密码都正确输入以后&#xff0c;第三步弹出一个提示&#xff0c;要在手机上的通知栏点击是&#xff0c;并且点击手机上相应的数字才能继续登录。 但是自己的手机上下拉通知栏却没有来自谷歌的通知&#xf…

mkv怎么改成mp4格式?把mkv改成MP4的几种方法介绍

mkv怎么改成mp4格式&#xff1f;将mkv格式的视频文件转换为MP4格式是许多用户常常需要解决的问题&#xff0c;尤其是在不同设备之间传输和播放视频时。mkv是一种灵活且功能强大的多媒体容器格式&#xff0c;能够包含多种视频、音频和字幕轨道。然而&#xff0c;尽管其优势显著&…

前端web在线PPT编辑器-PPTLIST

哈喽&#xff0c;大家好&#xff0c;今天给大家介绍一款的在线的PPT编辑器开源框架-PPTLIST&#xff1b;他是一个基于 Vue3.x TypeScript 的在线演示文稿&#xff08;幻灯片&#xff09;应用&#xff0c;还原了大部分 Office PowerPoint 常用功能&#xff0c;支持 文字、图片、…

MSP学习

一、迁移资源调研 完成导入&#xff0c;类似完成选型分析 离线工具调研 账单 二、迁移计划 1、

【教程】新的Selenium!整合了隐藏浏览器指纹等功能

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 前景提要 driver Driver() 常用driver 接口 最后的话 前景提要 新的selenium&#xff0c;整合了隐藏浏览器指纹&#xff0c;非常好用&#x…

Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇

Nginx七层&#xff08;应用层&#xff09;反向代理 HTTP反向代理proxy_pass篇 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of thi…

极品AI大模型,抓紧收藏!整合包!

近期&#xff0c;科技巨头谷歌终于发布了1个月前在I/O开发者大会上预告过的Gemma 2大模型。据谷歌介绍&#xff0c;与第1代Gemma模型相比&#xff0c;新模型拥有更优的性能&#xff0c;推理效率也更高。我当然是&#xff0c;“无所谓&#xff0c;我会出手.jpg”&#xff0c;给大…

微深节能 料场堆取料机大机定位防碰撞系统 格雷母线

在现代工业领域&#xff0c;尤其是大型料场、港口、码头等复杂作业环境中&#xff0c;堆取料机的精准定位与防碰撞系统显得尤为重要。这些大型设备的高效、安全运行直接关系到生产效率和作业安全。武汉市微深节能科技有限公司推出的格雷母线高精度位移测量系统&#xff0c;为料…

AI中药处方模型构建与案例

在中医领域,人工智能(AI)可以生成各种指令来辅助诊断、治疗和研究。 1. 诊断辅助指令: 根据患者的症状和体征,自动分析并生成可能的中医证候诊断建议。利用中医望闻问切四诊信息,智能识别关键症状,提供对应的中医辨证思路。2. 治疗建议指令: 根据辨证结果,自动推荐相应…

什么牌子麦克风好,无线麦克风什么品牌好,领夹麦克风性价比推荐

在自媒体内容创作的繁荣时代&#xff0c;领夹麦克风作为提升音频质量的关键工具&#xff0c;其市场需求正以前所未有的速度扩张。面对市场上琳琅满目的品牌和型号&#xff0c;如何在众多选项中做出既贴合个人需求又具备专业水准的选择&#xff0c;成为创作者们共同面临的课题。…

TB作品】51单片机 Proteus仿真 51单片机SPI显示OLED字符驱动

// GND 电源地 // VCC 接5V或3.3v电源 // D0 P1^4&#xff08;SCL&#xff09; // D1 P1^3&#xff08;SDA&#xff09; // RES 接P12 // DC 接P11 // CS 接P10 OLED显示接口与控制实验报告 背景 OLED&#xff08;有机发光二极管&#xff09;显示器由于其高对比度、低功耗和…

【DFS(深度优先搜索)详解】看这一篇就够啦

【DFS详解】看这一篇就够啦 &#x1f343;1. 算法思想&#x1f343;2. 三种枚举方式&#x1f343;2.1 指数型枚举&#x1f343;2.2 排列型枚举&#x1f343;2.3 组合型枚举 &#x1f343;3. 剪枝优化&#x1f343;4. 图的搜索&#x1f343;5. 来几道题试试手&#x1f343;5.1 选…

通过端口转发实现docker容器运行时端口更改

通过端口转发实现docker容器运行时端口更改 前言启动容器查看容器ip地址端口转发 前言 关于修改docker正在运行中容器端口&#xff0c;网上大部分分为3类: 1. 删除原有容器重新创建;2. 改配置文件;3. 在现有容器上新提交镜像&#xff0c;用新镜像起新的容器。 1和3属于同一种流…

【Linux】进程补充知识

文章目录 前言磁盘与物理内存 数据交互局部性原理页表 前言 磁盘是计算机唯一的一个机械设备&#xff0c;在磁盘文件系统中&#xff0c;我们了解到&#xff0c;磁盘的数据读取写入相比物理内存&#xff0c;CPU等效率低了很多。但是其作为数据的载体&#xff0c;物理内存与其交…

CentOS7下安装Doris

Doris简介 Apache Doris 是一款基于 MPP 架构的高性能、实时的分析型数据库&#xff0c;以高效、简单、统一的特点被人们所熟知&#xff0c;仅需亚秒级响应时间即可返回海量数据下的查询结果&#xff0c;不仅可以支持高并发的点查询场景&#xff0c;也能支持高吞吐的复杂分析场…