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

news2024/9/23 7:33:55

更多精彩内容尽在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>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS content 计数器

CSS content 计数器 CSS 计数器通过一个变量来设置&#xff0c;根据规则递增变量。 使用计数器自动编号 CSS 计数器根据规则来递增变量。 CSS 计数器使用到以下几个属性&#xff1a; counter-reset - 创建或者重置计数器&#xff0c;给计算器命名。注意声明计算器不能在自身…

乡村振兴指数与其30个原始变量数据(Shp/Dta/Excel格式,2000-2022年)

数据简介&#xff1a;这份数据是我国各地级市乡村振兴指数与其30各原始变量数据并对其进行地图可视化表达。城镇化是当今中国社会经济发展的必由之路。当前我国城镇化处于发展的关键时期&#xff0c;但城镇化发展的加快却是一把双刃剑&#xff0c;为何要如此形容呢?因为当前城…

【产品经理】订单处理12-订单的取消与反取消

在电商ERP系统中&#xff0c;订单取消与反取消也是常见功能之一。 订单取消与反取消也是电商ERP系统的常见功能&#xff0c;本次主要讲解下订单取消与反取消的逻辑。 一、订单取消 在电商ERP系统中&#xff0c;订单取消一般由审单员操作&#xff0c;此类取消一般是由于上下游…

ICMP隧道

后台私信找我获取工具 目录 ICMP隧道作用 ICMP隧道转发TCP上线MSF 开启服务端 生成后门木马 msf开启监听 开启客户端icmp隧道 执行后门木马&#xff0c;本地上线 ICMP隧道转发SOCKS上线MSF 开启服务端 生成后门木马 msf开启监听 开启客户端icmp隧道 ​执行后…

gui创新点charts图表

import javax.swing.*; import java.awt.*;public class ComboChartExample extends JPanel {Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);// 数据int[] values {100, 200, 150, 300, 250};int[] lineValues {120, 180, 160, 280, 230};Str…

Pytorch实战(二):VGG神经网络

文章目录 一、诞生背景二、VGG网络结构2.1VGG块2.2网络运行流程2.3总结 三、实战3.1搭建模型3.2模型训练3.3训练结果可视化3.4模型参数初始化 一、诞生背景 从网络结构中可看出&#xff0c;所有版本VGG均全部使用33大小、步长为1的小卷积核&#xff0c;33卷积核同时也是最小的能…

Jenkins 常用的 Linux 指令

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

MNN安装和编译 Win10

如何优化和解决问题 步骤 1: 以管理员权限打开 Windows PowerShell 导航到 C:\Windows\System32\WindowsPowerShell\v1.0 目录。右键点击 powershell.exe 并选择“以管理员身份运行”。执行以下命令&#xff0c;设置执行策略为不受限制&#xff1a;set-executionpolicy -exec…

视频号矩阵管理系统:短视频内容营销的智能助手

随着短视频行业的蓬勃发展&#xff0c;视频号矩阵管理系统应运而生&#xff0c;为内容创作者和品牌提供了一站式的短视频管理和营销解决方案。本文将深入探讨视频号矩阵管理系统的核心功能&#xff0c;以及它如何助力用户在短视频营销领域取得成功。 视频号矩阵管理系统概述 …

Lumerical Algorithm 查找最接近给定透射率值的波长值

Lumerical Algorothm 查找最接近给定透射率值的波长值 引言正文引言 在 Lumerical Script 算法,查找数组中对应值的所有索引值 一文中我们简单介绍了 Lumerical 中的索引值获取算法,这里,我们来介绍一下如何查找最接近给定透射率值的波长值。 正文 比如我们有如下透射率图…

北斗在高铁轨道位移监测中的应用

随着高速铁路的飞速发展&#xff0c;轨道的监测与维护变得至关重要。传统的监测方法已难以满足现代高铁的需求。 近年来&#xff0c;北斗卫星导航系统凭借其高精度、全天候、全球覆盖的优势&#xff0c;在高铁轨道位移监测中发挥了重要作用。 高铁轨道监测系统通过集成北斗卫星…

如何评价Flutter?

哈喽&#xff0c;我是老刘 我们团队使用Flutter已经快6年了。 有很多人问过我们对Flutter的评价。 今天在这里回顾一下6年前选择Flutter时的原因&#xff0c;以及Flutter在这几年中的实际表现如何。 选择Flutter时的判断 1、性能 最开始吸引我们的就是其优秀的性能。 特别是…

影刀RPA | 作业实操02 | 循环

步骤1 总流程 先完成搜索商品-获取最大页码的步骤&#xff0c;跑通看下日志&#xff0c;是正确的再继续写指令 步骤2 具体指令 由嵌套循环完成 外循环&#xff08;ForEach列表循环&#xff09;&#xff1a;遍历商品内循环-1&#xff08;For次数循环&#xff09;&#xff1…

用 MATLAB Function 模块在 Simulink 中实现 MATLAB 函数

MATLAB Function 模块使您能够使用 MATLAB 语言在 Simulink 模型中定义自定义函数。MATLAB Function 模块支持从 Simulink Coder 和 Embedded Coder生成 C/C 代码。 在以下情况下使用这些模块&#xff1a; 您有现有 MATLAB 函数可用于对自定义功能进行建模&#xff0c;或您可…

240707_昇思学习打卡-Day19-基于MindSpore通过GPT实现情感分类

240707_昇思学习打卡-Day19-基于MindSpore通过GPT实现情感分类 今天基于GPT实现一个情感分类的功能&#xff0c;假设已经安装好了MindSpore环境。 # 该案例在 mindnlp 0.3.1 版本完成适配&#xff0c;如果发现案例跑不通&#xff0c;可以指定mindnlp版本&#xff0c;执行!pip…

2024HW必修高危漏洞集合_v3.0

高危风险漏洞一直是企业网络安全防护的薄弱点&#xff0c;也成为HW攻防演练期间红队的重要突破口;每年 HW期间爆发了大量的高危风险漏洞成为红队突破网络边界防护的一把利器,很多企业因为这些高危漏洞而导致整个防御体系被突破、甚至靶标失守而遗憾出局。 HW 攻防演练在即&…

vue3关于在线考试 实现监考功能 推流拉流

vue3 关于在线考试 实现监考功能&#xff0c; pc端考试 本质是直播推流的功能 使用腾讯云直播: 在线文档 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><link rel"icon" href"/f…

AI产品经理发展与规划

今天引用高飞老师的讲课内容&#xff0c;分享一下&#xff0c;何为AI产品经理&#xff1f;这个话题不仅仅希望介绍AI产品经理的工作方式等方面的内容&#xff0c;更多的在于讨论未来产品经理这个行业应该如何发展&#xff1f;行业壁垒在何处&#xff1f;如何应对中年危机&#…

AI大模型+软件开发,计算机从业者转行的契机?

自从大模型吹响新一轮技术革命的号角后&#xff0c;整个行业各个层次都面临大模型带来的范式转换。我今年在 4 月份上海举办的全球机器学习技术大会上演讲时曾提出&#xff0c;大模型为计算产业带来了计算范式、开发范式、交互范式的三大范式改变。今天是软件研发技术大会&…

使用雨云Ubuntu搭建Mc服务器

快两年没写文了吧&#xff0c;好久不见(╹ڡ╹ ) 开门见山吧&#xff0c;网上搜了很多&#xff0c;发现没有使用雨云ubuntu搭建mc服务器的教程&#xff0c;所以准备写一篇&#xff08;顺便恰米 该文章涵盖了很多我自己搭建时遇到的问题&#xff0c;没有提到的大家可以评论或…