mapbox加载全球3D建筑

本案例使用Mapbox GL JavaScript库进行加载全球3D建筑。

文章目录

  • 1. 引入 CDN 链接
  • 2. 创建地图
  • 3. 监听地图加载完成事件
    • 3.1. 获取地图的样式中的图层
    • 3.2. 查找图层
    • 3.3. 添加三维建筑图层
  • 4. 演示效果
  • 5. 代码实现

1. 引入 CDN 链接

<!-- 1.引入CDN链接 -->
<script src="https://api.mapbox.com/mapbox-gl-js/v2.12.0/mapbox-gl.js"></script>
<link
  href="https://api.mapbox.com/mapbox-gl-js/v2.12.0/mapbox-gl.css"
  rel="stylesheet"
/>

2. 创建地图

我们创建了一个Mapbox GL JS地图实例,设置了地图的容器、默认的地图风格、中心点坐标、地图级别、地图俯仰角、地球旋转角度以及启用抗锯齿功能。

const map = new mapboxgl.Map({
  container: "map", //地图容器
  style: "mapbox://styles/mapbox/light-v11", //地图样式
  center: [-74.0066, 40.7135], //地图中心
  zoom: 15.5, //缩放级别
  pitch: 45, //地图俯仰角
  bearing: -17.6, //地图旋转角度
  antialias: true, //启用抗锯齿功能
});

3. 监听地图加载完成事件

3.1. 获取地图的样式中的图层

const layers = map.getStyle().layers;

3.2. 查找图层

查找图层中类型为symbol并且有text-field属性的图层。

// 3.2 查找图层
const labelLayerId = layers.find(
  (layer) => layer.type === "symbol" && layer.layout["text-field"]
).id;

3.3. 添加三维建筑图层

将三维建筑数据层添加到地图中,并应用一些样式来表现数据。

  • 首先,代码定义了一个图层对象,包括所需的属性,如 ID、数据源、图层名称、过滤器、类型和最小缩放级别。
  • 接着,为图层对象定义了一个 paint 属性,用于定义图层的样式。这里的样式包括填充颜色的透明度(opacity)、三维建筑的高度和基线。
  • 使用 "interpolate" 表达式来平滑地过渡效果,当用户缩放地图时,三维建筑的高度和基线会随着地图的放大而增加。
  • 最后,将图层对象添加到地图中,并指定标签层labelLayerId
// 3.3 添加三维建筑图层
map.addLayer(
  {
    id: "add-3d-buildings",
    source: "composite",
    "source-layer": "building",
    filter: ["==", "extrude", "true"],
    type: "fill-extrusion",
    minzoom: 15,
    paint: {
      "fill-extrusion-color": "#aaa",

      // Use an 'interpolate' expression to
      // add a smooth transition effect to
      // the buildings as the user zooms in.
      // 图层高度
      "fill-extrusion-height": [
        "interpolate",
        ["linear"],
        ["zoom"],
        1,
        0,
        8,
        ["get", "height"],
      ],
      // 离地高度
      "fill-extrusion-base": [
        "interpolate",
        ["linear"],
        ["zoom"],
        1,
        0,
        8,
        ["get", "min_height"],
      ],
      "fill-extrusion-opacity": 0.9,
    },
  },
  labelLayerId
);

4. 演示效果

image-20240228153111646

5. 代码实现

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <!-- 1.引入CDN链接 -->
    <script src="https://api.mapbox.com/mapbox-gl-js/v2.12.0/mapbox-gl.js"></script>
    <link
      href="https://api.mapbox.com/mapbox-gl-js/v2.12.0/mapbox-gl.css"
      rel="stylesheet"
    />
    <title>加载全球3D建筑</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }

      #map {
        width: 100vw;
        height: 100vh;
      }
    </style>
  </head>

  <body>
    <div id="map"></div>
    <script>
      // 2.创建地图
      window.onload = () => {
        // 注册token
        mapboxgl.accessToken =
          "pk.eyJ1IjoiY2hlbmdjaGFvODg2NiIsImEiOiJjbGhzcWowMHUwYTNyM2VwNXZhaXhjd3Q4In0.FEh2q7sEW88Z1B5GcK_TDg";
        // 初始化地图对象
        const map = new mapboxgl.Map({
          container: "map", //地图容器
          style: "mapbox://styles/mapbox/light-v11", //地图样式
          center: [-74.0066, 40.7135], //地图中心
          zoom: 15.5, //缩放级别
          pitch: 45, //地图俯仰角
          bearing: -17.6, //地图旋转角度
          antialias: true, //启用抗锯齿功能
        });

        // 3.监听地图加载完成事件
        map.on("style.load", () => {
          // Insert the layer beneath any symbol layer.

          // 3.1 获取地图的样式中的图层
          const layers = map.getStyle().layers;
          // 3.2 查找图层
          //   查找图层中类型为symbol并且有text-field属性的图层
          const labelLayerId = layers.find(
            (layer) => layer.type === "symbol" && layer.layout["text-field"]
          ).id;

          // The 'building' layer in the Mapbox Streets
          // vector tileset contains building height data
          // from OpenStreetMap.

          // 3.3 添加三维建筑图层
          map.addLayer(
            {
              id: "add-3d-buildings",
              source: "composite",
              "source-layer": "building",
              filter: ["==", "extrude", "true"],
              type: "fill-extrusion",
              minzoom: 15,
              paint: {
                "fill-extrusion-color": "#aaa",

                // Use an 'interpolate' expression to
                // add a smooth transition effect to
                // the buildings as the user zooms in.
                // 图层高度
                "fill-extrusion-height": [
                  "interpolate",
                  ["linear"],
                  ["zoom"],
                  1,
                  0,
                  8,
                  ["get", "height"],
                ],
                // 离地高度
                "fill-extrusion-base": [
                  "interpolate",
                  ["linear"],
                  ["zoom"],
                  1,
                  0,
                  8,
                  ["get", "min_height"],
                ],
                "fill-extrusion-opacity": 0.9,
              },
            },
            labelLayerId
          );
        });
      };
    </script>
  </body>
</html>

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

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

相关文章

C++模拟揭秘刘谦魔术,领略数学的魅力

新的一年又开始了&#xff0c;大家新年好呀~。在这我想问大家一个问题&#xff0c;有没有同学看了联欢晚会上刘谦的魔术呢&#xff1f; 这个节目还挺有意思的&#xff0c;它最出彩的不是魔术本身&#xff0c;而是小尼老师“念错咒语”而导致他手里的排没有拼在一起&#xff0c;…

Android studio 侧边栏看不到 Commit 标签,不能方便的查看本地ChangaeList

参考 如上图&#xff0c;一次升级后找不到commit 标签&#xff0c;造成不能很好的监测本地修改了那些文件&#xff0c;通过搜索找到显示的方法。&#xff0c;进入设置找红框位置&#xff0c;勾选复选款即可。 正常显示

Python实现CCI工具判断信号:股票技术分析的工具系列(5)

Python实现CCI工具判断信号&#xff1a;股票技术分析的工具系列&#xff08;5&#xff09; 介绍算法解释 代码rolling函数介绍完整代码data代码CCI.py 介绍 在股票技术分析中&#xff0c;CCI (商品路径指标&#xff09;是一种常用的技术指标&#xff0c;用于衡量股价是否处于超…

JavaWeb Request:获取请求数据

Request是请求对象&#xff0c;Response是响应对象。 浏览器会发送HTTP请求到后台服务器[Tomcat]&#xff0c;请求中会包含很多请求数据 [请求行请求头请求体] &#xff0c;后台服务器[Tomcat]会对HTTP请求中的数据进行解析并把解析结果存入到Request对象&#xff0c;可以从Req…

Docker之数据卷

目录 一、什么是数据卷 二、自定义镜像 一、什么是数据卷 1.1Docker 数据管理 在生产环境中使用 Docker &#xff0c;往往需要对数据进行持久化&#xff0c;或者需要在多个容器之间进行 数据共享&#xff0c;这必然涉及容器的数据管理操作 二、操作 将宿主机的目录与容器的…

双通道音频功率放大电路,外接元件少, 通道分离性好,3V 的低压下可正常使用——D2025

D2025 为立体声音频功率放大集成电路&#xff0c;适用于各类袖珍或便携式立体声 收录机中作功率放放大器。 D2025 采用 DIP16 封装形式。 主要特点&#xff1a;  适用于立体声或 BTL 工作模式  外接元件少  通道分离性好  电源电压范围宽&#xff08;3V~12V &#xff…

深度学习GPU环境安装(WINDOWS安装NVIDIA)

1.检测是否支持GPU环境 1.1.打开设备管理器 winows下面搜索设备管理器&#xff08;或者从桌面"此电脑"——>右键点击——>"管理"打开&#xff09; 1.2.查看本地显卡 在"设备管理器"——"显示适配器"中&#xff0c;如果没有&…

瑞吉外卖项目详细分析笔记及所有功能补充代码

目录 项目刨析简介技术栈项目介绍项目源码 一.架构搭建1.初始化项目结构2.数据库表结构设计3.项目基本配置信息添加公共字段的自动填充全局异常处理类返回结果封装的实体类 二.管理端业务开发1.员工管理相关业务1.1员工登录1.2员工退出1.3过滤器拦截1.4员工信息修改1.5员工信息…

ElasticSearch之分片相关概念segment,merge,refresh等

写在前面 本文看下分片相关概念&#xff0c;segment&#xff0c;merge&#xff0c;refresh等。 1&#xff1a;segment&#xff0c;commit point&#xff0c;.del 一个倒排索引的文件称为segment&#xff0c;多个segment组合在一起就是lucene的index&#xff0c;也就是es的sh…

线程变量ThreadLocal用于解决多线程并发时访问共享变量的问题。

ThreadLocal介绍 ThreadLocal叫做线程变量&#xff0c;用于解决多线程并发时访问共享变量的问题。意思是ThreadLocal中填充的变量属于当前线程&#xff0c;该变量对其他线程而言是隔离的&#xff0c;也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建…

12. Nginx进阶-Location

简介 Nginx的三大区块 在Nginx中主要配置包括三个区块&#xff0c;结构如下&#xff1a; http { #协议级别include /etc/nginx/mime.types;default_type application/octet-stream;log_format main $remote_addr - $remote_user [$time_local] "$r…

ssl证书无效是否继续访问啥意思

SSL证书&#xff08;Secure Sockets Layer&#xff09;是现代互联网通信安全的基础组成部分&#xff0c;尤其对于涉及敏感信息交换的HTTPS站点至关重要。当浏览器提示“SSL证书无效”时&#xff0c;这意味着浏览器无法验证网站的身份或确定其加密连接的安全性。这种情况下&…

基于Python+Flask实现一个TODO任务管理系统网站

随着科技的进步&#xff0c;数字化的任务清单逐渐成为生活中不可或缺的一部分。它们不仅可以帮助我们跟踪日常任务&#xff0c;还可以提高效率。但是&#xff0c;你是否考虑过自己制作一个任务管理系统呢&#xff1f; 好消息是&#xff0c;使用Python和Flask&#xff0c;我们可…

器件选型【MOS,三极管篇】

三极管篇&#xff1a; 三极管的两大作用&#xff1a;做开关使用和放大电流 一句话总结&#xff1a;三极管选型主要考虑集电极最大允许电流&#xff0c;集电极-发射极反向击穿电压&#xff0c;集电极最大允许耗散功率&#xff0c;特征频率&#xff0c;封装形式&#xff0c;工作…

电脑防火墙怎么关?分享2个简单方法

在当今数字化时代&#xff0c;保护计算机免受网络威胁和恶意软件攻击是至关重要的。电脑防火墙作为一种重要的安全措施&#xff0c;可以有效地阻止未经授权的网络访问&#xff0c;保障您的个人信息和数据安全。 然而&#xff0c;有时候在特定情况下&#xff0c;您可能需要临时…

【ES入门一:基础概念】

集群层面上的基础概念 集群 由多个es实例组成的叫做集群 节点 单个ES的服务实例叫做节点。每个实例都有自己的名字&#xff0c;就是在配置文件中配置的‘node.name’中的内容。为了标识每个节点&#xff0c;每个节点启动后都会分配一个UID&#xff0c;存储在data目录。每个…

【leetcode】三数之和 双指针

/*** param {number[]} nums* return {number[][]}*/ var threeSum function(nums) {nums.sort((a,b)>a-b);let result[];for(let i0;i<nums.length-2;i){if(nums[i]>0) return result;//因为求三数之和等于0&#xff0c;如果第一个数已经大于0&#xff0c;后面肯定无…

数仓实战——懂车帝数据指标体系建设和应用实践

目录 一、如何建立指标体系规范 1.1 懂车帝业务介绍 1.2 为什么要做指标体系规范 1.3 DataLeap 指标管理平台 1.4 指标体系建设框架 1.5 指标元数据管理规范 二、指标模型建设在数仓工作中的收敛 2.1 指标模型建设存在的问题 2.2 指标模型数仓层级建设标准 2.3 从指标…

stm32f103zet6笔记1-led工程

1、选择串口调试 2、LED0连接到PB5&#xff0c;PB5设置为推挽输出。PE5同理。 3、生成成对的.c,.h文件。 4、debugger选择j-link。 5、connection选择SWD。 6、编写bsp_led.c,bsp_led.h文件。 7、下载调试&#xff0c;可以看到LED0 500ms闪烁一次&#xff0c;LED1 1000ms闪烁一…

Node.js与Webpack笔记(一)

这里使用的16.19.0版本&#xff0c;官网和github没找到&#xff0c;去黑马2023年课程里找 篇幅较大会卡&#xff0c;此篇幅不写Webpack部分&#xff0c;留着下一篇 初识 1.什么是Node.js? Node.js 是一个独立的 JavaScript 运行环境&#xff0c;能独立执行 JS 代码&#xff…