关于maptalks实现水体渲染

本文介绍了如何使用Maptalks库在Web地图上创建3D水体效果,包括导入数据、设置基础图层、使用lit渲染插件进行数据过滤和材质配置,以及创建ExtrudePolygonLayer以实现动态地形高度渲染。
摘要由CSDN通过智能技术生成

线上效果图

maptalks-Demo - 水体效果

准备数据及地图

此处写的比较简单,如发现复制代码之后如有报错,请投进官网的怀抱

// 引入 maptalks
import * as maptalks from "maptalks";
import * as maptalksGl from "@maptalks/gl-layers";

// 创建地图
const map = new maptalks.Map("map", {
        center: [116.391834,39.907696],
        zoom: 14,
});
// 创建基础图层
const baseLayer = new maptalks.TileLayer("base", {
	urlTemplate: "https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png",
	subdomains: ["a", "b", "c", "d"],
})
// 创建gl图层 sceneConfig 值参考 [官网配置项](https://doc.maptalks.com/docs/api/gl/group-gl-layer/)
const glOptions = {sceneConfig}
const glLayer = new maptalksGl.GroupGLLayer("maptalksGl_3D",
		baseLayers,glOptions).addTo(map);
// 水面的坐标集合
const polygons = [[116.391834,39.907696]...]

实现水体效果

// 设置style并使用[lit渲染插件](https://doc.maptalks.com/docs/style/plugin-lit/), 这里我主要是为了过滤出来哪些面是需要渲染成水体的,并且渲染海拔高度
//(可能理解的比较片面,如果有其他的作用也可以踢我一脚)
const style = [
  {
    renderPlugin: {
      type: "lit",
    },
    // 数据的过滤条件 过滤出Polygon类型中id包含water
    filter: ["all", ["==", "$type", "Polygon"], ["contains", "id", "water"]],
    symbol: {
      visible: true,
      ssr: true,
    }
  },
];
// 这里是设置材质 详细参考[官网材质配置说明](https://doc.maptalks.com/docs/style/material/)
const material = {
  // 开启ssr
  ssr: true,
  // 发现纹理的路径,支持url或者base64
  normalTexture: texWaveNormal,
  // 环境光遮蔽纹理的路径,支持url或者base64
  occlusionTexture: texWavePerturbation,
  // 自发光颜色值
  emissiveFactor: [0.3, 0.5, 0.1],
  // uv坐标缩放比例。
  uvScale: [0.2, 0.2],
  // 纹理旋转角度,单位度,0 - 360
  uvRotation: 20,
  // uv方向上的偏移动画,不为1时开启动画,绝对值越大动画越快,负值时则反方向动画
  uvOffsetAnim: [1, 3],
};
// 这里是新创建一个ExtrudePolygonLayer图层(此图层官网未上,详细可自行咨询官方)
const PolygonLayer = new maptalksGl.ExtrudePolygonLayer("PolygonLayer", {
  style,
  material,
  dataConfig: {
    type: "3d-extrusion",
    // 材质默认海拔高度 静态设置海拔高度 
    defaultAltitude: 30,
    // 材质顶部高度属性名称 用于动态设置海拔高度 如果该属性不为null,则覆盖默认海拔高度
    altitudeProperty: "height",
    altitudeScale: 1,
    top: true,
    side: true,
  }
}).addTo(glLayer);
// 这里新创建一个Polygon图形,并添加至PolygonLayer 图层中
const p = new maptalks.Polygon([polygons], {
  symbol: {
    topPolygonFill: "#2b9fd7cc",
    bottomPolygonFill: "#004bb5",
  },
  properties: {
  	// 参与style中的过滤
    id: "water1",
    // 设置海拔高度 
    "height": 50
  },
}).addTo(PolygonLayer);

以上就可以是视频中的效果了

参考如下

maptalks-官网
maptalksgl-官网
maptalks-示例中心
材质配置说明
lit渲染插件配置说明

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锅巴小透明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值