经纬志
首页 / deck.gl / API 文档

PolygonLayer

先看结论

以坐标数组描述面,支持空洞、挤出与线框,是自定义面状渲染的底层图层。

最后验证 2026-11-03 · deck.gl 9.0 · 更新 2026-10-27 · 引用本文
new deck.PolygonLayer(props)

核心参数

参数默认说明
data[]每条记录对应一个面
getPolygon—顶点数组,多环时嵌套
filledtrue是否填充
strokedfalse是否描边
extrudedfalse是否挤出为柱体
wireframefalse挤出后只显示边线
getFillColor[0, 0, 0, 255]填充色
getLineColor[0, 0, 0, 255]边界色
getLineWidth1边界宽度
lineWidthUnits'meters'建议用 'pixels'
getElevation1000挤出高度,米
elevationScale1高度倍率
_normalizefalse自动修正绕序与重复点
_windingOrder'CW'指定外环方向,配合 _normalize

顶点结构

简单面用坐标数组的数组: [[116.3, 39.9], [116.5, 39.9], [116.5, 40.1]]。 带空洞的面再套一层,第一个环是外环,其余环是洞:

getPolygon: function (d) {
  return [
    d.outer,      // 外环
    d.hole        // 内环(洞)
  ];
}

圆角半径、坐标精度不会自动处理,顶点密度由数据决定。 一个只有三个点的面,放大后会看到明显的直边。

示例

var layer = new deck.PolygonLayer({
  id: 'blocks',
  data: blocks,
  getPolygon: function (d) { return d.ring; },
  filled: true,
  stroked: true,
  extruded: true,
  getFillColor: function (d) {
    return [60, 120 + d.floors * 4, 220, 200];
  },
  getLineColor: [220, 235, 255, 180],
  getLineWidth: 1,
  lineWidthUnits: 'pixels',
  lineWidthMinPixels: 1,
  getElevation: function (d) { return d.floors * 12; },
  elevationScale: 1,
  material: { ambient: 0.5, diffuse: 0.6, shininess: 16 },
  pickable: true
});

绕序与三角化

面在 GPU 里要拆成三角形。拆分依赖顶点顺序判断内外, 外环逆时针、内环顺时针是通用约定。数据来源复杂时, 直接开 _normalize: true,让图层先统一绕序, 代价是启动时多一遍顶点处理。

非简单多边形(自相交、共线点过多)会让三角化失败, 表现为整块面缺失。预处理阶段用几何库修复, 比在前端猜参数更可靠。

边界与挤出

extruded: true 时,stroked 只沿顶面边界绘制, 侧面没有描边。需要完整的体块轮廓,用 wireframe: true,它会画出顶面、底面与侧棱。

挤出高度叠加在坐标第三位上:如果顶点本身带高程, 最终高度是两者之和,容易得到意外的尖塔。数据带高程时 把 getElevation 设为 0,只靠坐标第三位。

面数据优先用 GeoJsonLayer。PolygonLayer 只接受顶点数组,属性读取、点线面混排都要自己拆。 只有在数据结构特殊、或需要精确控制顶点时才直接用它。

引用本文

经纬志(2026)。《PolygonLayer》。https://www.jingweizhi.com/deckgl/api/polygon-layer.html(访问日期 2026-11-03)。