MapboxGL可视化之千里江山图

简介: 本文记录了作者在Mapbox GL中实现山峰等值面效果的过程,灵感来源于百度地图的山峰展示方式。作者通过下载和处理DEM数据,使用QGIS生成等值面,并通过Mapbox GL的fill图层实现分段渲染,最终效果宛如“千里江山图”,美不胜收。

概述

今天在看百度地图的时候看到在山峰是以等值面的方式展示的,于是就想着试试如何在MapboxGL中来实现一下,本文就是我实现后的记录。文章标题取名为“千里江山图”,主要是生成的效果让我不由想起了“千里江山图”,美的不要不要的。

效果

image.png

image.png

image.png

image.png

image.png

实现

数据下载

在前面的文章已经有交代过,大家可以点击链接看看。

2.DEM生成等值面

通过DEM数据生成等值面我用的是QGIS来完成的,如下图。
image.png

代码实现

实现就比较简单了,用fill图层进行分段渲染就OK,实现代码如下:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Query terrain elevation</title>
    <meta
      name="viewport"
      content="initial-scale=1,maximum-scale=1,user-scalable=no"
    />
    <link href="./mapbox-gl.css" rel="stylesheet" />
    <script src="./mapbox-gl.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>
      const mapStyle = {
    
        version: 8,
        name: "Dark",
        sources: {
    
          "xyz-img": {
    
            type: "raster",
            tiles: [
              "https://webst01.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}",
              "https://webst02.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}",
              "https://webst03.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}",
              "https://webst04.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}",
            ],
            tileSize: 256,
          },
        },
        layers: [
          {
    
            id: "img",
            type: "raster",
            source: "xyz-img",
            minzoom: 1,
            maxzoom: 18,
            paint: {
    
              "raster-opacity": 0.5,
            },
          },
        ],
      };
      const map = new mapboxgl.Map({
    
        container: "map",
        zoom: 12,
        center: [104.61023753726323, 35.63101027697721],
        pitch: 75,
        bearing: 90,
        style: mapStyle,
        hash: true,
      });
      map.on("load", (e) => {
    
        // Set custom fog
        map.setFog({
    
          range: [-0.5, 2],
          color: "#c9eac2",
          "high-color": "#c9eac2",
          "space-color": "#c9eac2",
        });
        // Add terrain source, with slight exaggeration
        map.addSource("mapbox-dem", {
    
          type: "raster-dem",
          tiles: ["./terrain/{z}/{x}/{y}.png"],
          tileSize: 256,
          maxzoom: 14,
        });
        map.setTerrain({
     source: "mapbox-dem", exaggeration: 3 });
        map.addSource("building", {
    
          type: "geojson",
          data: "./hillshade1.geojson",
        });
        map.addLayer({
    
          id: "3d-buildings",
          source: "building",
          type: "fill",
          paint: {
    
            "fill-color": [
              "interpolate",
              ["linear"],
              ["get", "ELEV_MAX"],
              1600, '#f7fcf5', 
              1700, '#f1faee', 
              1800, '#eaf7e6', 
              1900, '#e4f4de', 
              2000, '#d9f0d3', 
              2100, '#cfecc8', 
              2200, '#c3e7bc', 
              2300, '#b6e2af', 
              2400, '#a9dca3', 
              2500, '#9ad696', 
              2600, '#8bcf89', 
              2700, '#7bc77c', 
              2800, '#6abf71', 
              2900, '#58b668', 
              3000, '#46ae60', 
              3100, '#3aa357', 
              3200, '#2f984f', 
              3300, '#258d46', 
              3400, '#18813d', 
              3500, '#0b7634', 
              3600, '#00692a', 
              3700, '#005723', 
              3800, '#00441b'
            ],
            "fill-opacity": 0.95,
          },
        });
      });
    </script>
  </body>
</html>
相关文章
|
2月前
|
数据可视化
教你一招,用Echarts拿下旭日图
教你一招,用Echarts拿下旭日图
|
5月前
|
数据可视化 数据挖掘 网络可视化
R语言复杂网络分析各大电视台合播电视剧数量可视化
R语言复杂网络分析各大电视台合播电视剧数量可视化
|
5月前
|
数据可视化 数据挖掘
R语言用igraph对上海公交巴士路线数据进行复杂网络、网络图可视化
R语言用igraph对上海公交巴士路线数据进行复杂网络、网络图可视化
|
C++
你们想要的开源的冰墩墩模型来了!! 先睹为快!实现冰墩墩自由!
你们想要的开源的冰墩墩模型来了!! 先睹为快!实现冰墩墩自由!
151 0
星空发现图(仿蜗牛梦话圈)
最终效果       直接使用 继承 BaseAdapter 实现onCreateCenter(ViewGroup parent) onCreateChild(ViewGroup parent, T t)方法设置中心View,子View.
1039 1
|
人工智能 云计算
新春版!2017阿里云150款产品和解决方案全向图(1月制)
在阿里云飞速向前的同时,我们的产品和服务也越来越多了。
22059 0
彩铅第四课,漂流瓶
图片发自简书App 图片发自简书App
1206 0
彩铅手绘第一课作业
彩铅学习先导课临摹作业 图片发自简书App
791 0