threejs 地图根据gdp数值的不同显示不同的高度 学习笔记

threejs yekong

threejs 地图根据gdp数值的不同显示不同的高度

地图根据gdp数值的不同显示不同的高度实例

地图根据gdp数值的不同显示不同的高度

加载地图数据

loader.load(modelUrl + 'json/gdp.json', function (data) {
    var gdpObj = {};//每个省份的名字作为属性,属性值是国家对应GDP
    var gdpMax = 120000//设置一个基准值,以最高的广州gdp为准
    data.arr.forEach(function (obj) {
        var gdp = obj.value;//当前省份GDP
        gdpObj[obj.name] = gdp;//每个省份的名字作为属性,属性值是国家对应GDP
    })
    //  加载./china.json,结构和world.json 一样,省份对应国家
    loader.load(modelUrl + 'json/china.json', function (data2) {
        // 访问所有子行政区(省份)边界坐标数据:data.features
        data2.features.forEach(function (area) {
            // "Polygon":省份area有一个封闭轮廓
            //"MultiPolygon":省份area有多个封闭轮廓
            if (area.geometry.type === "Polygon") {
                // 把"Polygon"和"MultiPolygon"的geometry.coordinates数据结构处理为一致
                area.geometry.coordinates = [area.geometry.coordinates];
            }
            var name = area.properties.name;//省份名
            // height:行政区轮廓拉伸高度,和gdp大小正相关,不过注意相机渲染范围(或者说地图尺寸范围)
            var height = gdpObj[name] / 10000;//拉伸高度
            var mesh = ExtrudeMesh(area.geometry.coordinates, height)
            mesh.name = name;//设置mesh对应的省份名字
            meshGroup.add(mesh);//省份轮廓拉伸Mesh插入组对象mapGroup

            // 解析所有封闭轮廓边界坐标area.geometry.coordinates
            var line = metesBounds(area.geometry.coordinates);
            lineGroup.add(line);//省份边界轮廓插入组对象lineGroup
            var line2 = line.clone();
            line2.position.z = height;//顶部边界线跟随轮廓拉伸高度保持一致
            lineGroup2.add(line2);
        });
    })
})

轮廓代码

// 引入three.js
import * as THREE from 'three/build/three.module.js';
// pointsArrs:一个行政区包含一个或多个轮廓,一个轮廓对应pointsArrs的一个元素
function ExtrudeMesh(pointsArrs, height) {
  var shapeArr = [];//轮廓形状Shape集合
  pointsArrs.forEach(pointsArr => {
    var vector2Arr = [];
    // 转化为Vector2构成的顶点数组
    pointsArr[0].forEach(elem => {
      vector2Arr.push(new THREE.Vector2(elem[0], elem[1]))
    });
    var shape = new THREE.Shape(vector2Arr);
    shapeArr.push(shape);
  });
  // MeshBasicMaterial:不受光照影响
  // MeshLambertMaterial:几何体表面和光线角度不同,明暗不同
  var material = new THREE.MeshLambertMaterial({
    color: 0x004444,
    // transparent: true,
    // opacity: 0.8,
  }); //材质对象
  var geometry = new THREE.ExtrudeBufferGeometry( //拉伸造型
    shapeArr, //多个多边形二维轮廓
    //拉伸参数
    {
      // depth:根据行政区尺寸范围设置,比如高度设置为尺寸范围的2%,过小感觉不到高度,过大太高了
      depth: height, //拉伸高度
      bevelEnabled: false //无倒角
    }
  );
  var mesh = new THREE.Mesh(geometry, material); //网格模型对象
  return mesh;
}


export { ExtrudeMesh };

增加颜色

threejs 不同gdp拉伸不同高度并添加颜色变化

最终实现效果

webGL 3D地图可视化实例

喜欢