Layers 图层类

类型 / 参数 / 返回值 / 用法 · 右侧为本页导航

自定义 本库 API OL OpenLayers 融合 自定义与 OL 混用

Layers 图层类

Layers(内部模块)

路径 src/layers/。由 _getLayertype 创建。下列为高频 API。

CloudLayer

构造 options 常用字段

字段类型说明
codestring图层编码
minZoomnumber点可见最小级别
labelObject{ minZoom, field, hidden… }
cloudMinZoomnumber飘窗最小级别
cloudDirectionstring'bottom-center'
cloudOffsetnumber[]像素偏移
cloudHoverboolean悬停显示(会注册 pointermove)
alarmColor / alarmColorsstring / Object告警色
cloudClassstring飘窗 CSS 类

方法

方法参数说明
addGraphics(data)Array<Object>加点
removeGraphics(data)Array删点
refreshData(data)*刷新
refreshAlarm(objCodes)Array告警
showGraphics(codes)Array仅显示指定 code
displayPart(data)`Array\Object`条件显示
addCloud(cloudData)Object飘窗
hideCloud / showCloudobjCode单个飘窗
hideClouds / showClouds— / objCodes批量
removeCloud / removeAllCloudsobjCode?移除飘窗
changeStatus(status)*状态样式
clear / clearGraphics清空
setVisible(bool)boolean显隐(扩展 OL)
const layer = map.layers.hydrant;
layer.addGraphics([{ objCode: 'H1', gpsX: 13528430, gpsY: 3676466 }]);
layer.setVisible(true);

ClusterLayer

new ClusterLayer(options, main)

字段类型默认值说明
clusterStatusbooleanfalse初始是否开聚合
distancenumber100聚合像素距离(传给 ol/source/Cluster
clusterBreaksnumber[][40,80,160,320]聚合数量分级断点(内部会补 1 与上限)
clusterColorstring随配置聚合圆颜色(如 '50,149,172'#…
labelColoestring'#fff'聚合文字色(源码字段名保持拼写)
labelsstring[]内置字号档各级字号,如 ['12px','14px',…]
stopZoomnumber大于该级别分辨率时切回散点层逻辑
color / pathstring自定义聚合图标/颜色样式

方法

addGraphics(data)

map.layers.device.addGraphics([
  { objCode: 'D1', objX: 13528430, objY: 3676466, unitCode: 'A', objName: '设备1' },
  { objCode: 'D2', objX: 13528500, objY: 3676500, unitCode: 'A', objName: '设备2' }
]);

setVisible(bool)

displayPart(data)

changeStatus(bool)

map.layers.device.changeStatus(true);  // 聚合
map.layers.device.changeStatus(false); // 散点

HistoryDispatch

new HistoryDispatch(options, main)

方法

setData(data)

play(index)

const hd = map.historyDispatch({
  layerCodes: ['vehicle'],
  cloudData: { cloudDirection: 'top-center' },
  innerHTML: '<div>{objName} {levelSet}</div>'
});
hd.setData(frames);
hd.play(0);

destroy()


GLayer

new GLayer(options, main)

map.addGLayer({ code: 'sketch', type: 'GLayer' });
// 或 initLayers 中 type: '11'

方法

setData(res, addType?)

addPoint(data, styleParam?, text?, attributes?)

addPoints(data, styleParam?)

map.layers.sketch.addPoints(
  [
    [13528430, 3676466],
    [13528500, 3676500]
  ],
  { color: '#2563eb', size: 6 }
);
map.layers.sketch.addPoint([13528600, 3676600], { color: '#f00', size: 8 }, 'A', { objCode: 'A1' });

addPolyline(data, styleParam?, animateType?, attributes?)

addPolylines(data, styleParam?, animateType?)

addPolygon(data, style?, text?)

map.layers.sketch.addPolygon(
  [[13528400, 3676400], [13528600, 3676400], [13528600, 3676600], [13528400, 3676400]],
  { fillColor: 'rgba(37,99,235,0.2)', lineColor: '#2563eb', lineWidth: 2 },
  '区域'
);

clear()

addFilters / resume


ContourLayer

new ContourLayer(options)

字段类型默认值说明
valueFieldstring'value'取值字段
contourTypestring'line''line' \'polygon' \'square' \'hex' \'triangle'
distancenumber1插值网格间距(公里)
widthnumber2线宽
opacitynumber0.4面填充透明度
precisionbooleanfalsetrue 走 kriging 网格
breaks / colorsnumber[] / string[]内置色带分级断点与颜色(长度须一致)
layerIdstringWFS typeName,用于拉裁剪范围 polygon
dataArray可在 update 时传入

方法

update(options)

setData(features, addType?)

map.addContour({
  code: 'pm25',
  type: 'ContourLayer',
  contourType: 'polygon',
  valueField: 'aqi',
  distance: 2
});
map.layers.pm25.setData([
  { objX: 13528430, objY: 3676466, aqi: 42 },
  { objX: 13529000, objY: 3677000, aqi: 88 }
], 'data');

setGridData(grid)


HeatmapLayer

new HeatmapLayer(options)

方法

setData(features, addType?)

refreshData(data)

map.layers.heat.refreshData([
  { objX: 13528430, objY: 3676466, weight: 0.8 },
  { objX: 13528500, objY: 3676500, weight: 0.3 }
]);

GeoTIFFLayer

业务表 / parameter 怎么配

initLayers 会把 parameter(JSON 字符串或对象)展开合并到图层配置。表字段与 parameter 建议这样拆:

位置字段说明
表字段code图层 code
表字段type'16'
表字段serviceAddress.tif / COG 的 URL
parameterqueryable建议 false,栅格不参与 WFS 点查
parameter配色 / 投影 / 性能项见下方各小节,均可写在 parameter

parameter 最小示例:

{ "queryable": false }

水深着色完整示例(写入 GIS_LAYER_CONFIG.PARAMETER):

{
  "queryable": false,
  "wkid": 4549,
  "min": 0,
  "max": 5,
  "nodata": 0,
  "transparentBelow": 0,
  "opacity": 0.85,
  "colorRamp": [
    [0, "#00000000"],
    [0.1, "#c6dbef"],
    [0.5, "#6baed6"],
    [1, "#2171b5"],
    [2, "#08519c"],
    [3.5, "#fc9272"],
    [5, "#a50f15"]
  ]
}

色带与值域(最重要)

三种配色方式任选其一(优先级:style > colorRamp > colors > colorize)。内部均使用 WebGL interpolate 线性插值,不是“每个颜色一块、中间不混色”。

min / max / nodata / transparentBelow

字段作用
min / max色带数值范围;像素按该区间拉伸后再上色。小于 min、大于 max 会落到色带两端。
nodata无数据标记值;等于该值的像元视为无效并透明。常与文件 nodata 一致(水深图常用 0)。
transparentBelow小于等于该值的像元额外强制透明(压掉极浅水/噪声)。

方式 1:colorRamp(推荐,按真实数值断点)

colorRamp: [
  [0, '#00000000'],      // [数值, 颜色]
  [0.5, '#6baed6'],
  [2, '#2171b5'],
  [5, '#a50f15']
]
// 或对象写法:[{ value: 0, color: '#00000000' }, …]

颜色支持 #rrggbb#rrggbbaargba()[r,g,b,a]。断点之间线性插值。

方式 2:colors(颜色均匀铺在 min~max)

min: 0,
max: 5,
colors: ['#00000000', '#c6dbef', '#2171b5', '#a50f15']

同样会在断点间线性插值。若画面仍呈大色块,多半是 tif 本身为分类/离散值(像元从 1 直接跳到 2),不是 colors 没做渐变。连续数值(0.1、0.3、1.2…)才会看到平滑过渡。

方式 3:colorize: true(内置默认水深色带)

min: 0,
max: 5,
nodata: 0,
colorize: true

也可 colorize: [颜色数组] 自定义默认带。

看起来像色块、不够渐变时

  1. 确认栅格是连续数值,不是分类码。
  2. 优先用 colorRamp 多设几个断点。
  3. 需要更柔的空间边界时加 "interpolate": true(或 "fastResample": false)。配色模式下默认偏 nearest,重投影更快但边缘更“像素块”。

new GeoTIFFLayer(options, main)

方法

setColorStyle(styleOptions)

setUrl(url, sourceInfo)

用法

// 1) addLayer:单波段水深(必须配色)
map.addLayer({
  code: 'flood',
  type: 'GeoTIFFLayer',
  url: 'https://example.com/flood.tif',
  queryable: false,
  wkid: 4549,
  min: 0,
  max: 5,
  nodata: 0,
  transparentBelow: 0,
  interpolate: true,
  colorRamp: [
    [0, [0, 0, 0, 0]],
    [0.5, '#6baed6'],
    [2, '#2171b5'],
    [5, '#a50f15']
  ]
});

// 2) initLayers / 业务表:type=16,着色写在 parameter
map.initLayers({
  dem: {
    code: 'dem',
    type: '16',
    serviceAddress: '/data/dem.tif',
    parameter: {
      queryable: false,
      min: 0,
      max: 100,
      colorize: true
    }
  }
});

// 3) 仅 colors(均匀断点,仍会线性插值)
map.addLayer({
  code: 'depth',
  type: 'GeoTIFFLayer',
  url: '/data/depth.tif',
  queryable: false,
  min: 0,
  max: 5,
  colors: ['#00000000', '#c6dbef', '#2171b5', '#a50f15']
});

示例页:/geotiff


VectorTileLayer

new VectorTileLayer(options, main)

方法

changeScope(objCode)

addFilters(filters)

changeStyle(data)

resume()

refreshData(data)

refreshDataByGroup(data, statusMap)

refreshGridData(data, polygon, relateLayers?)

map.displayLayer('pipe', true);
map.layers.pipe.addFilters([['==', ['get', 'caliber'], 'DN200']]);
map.layers.pipe.resume();

GraphicLayer

默认样式 vs series vs 高亮

层级作用
图层默认未写 series.style 时:线实线蓝色 #1890ff、宽 2、无描边;点白填充、蓝边、无外描边,半径 6
series.style覆盖该组。typesoliddash;线 color/width/strokeColor/strokeWidth;点 fillColor/color/width(图形边)+ strokeColor/strokeWidth(外描边)+ radius
highlightStyle另一套,默认对齐现有闪烁层:白描边 + 绿色芯,blinkSpeed: 1.6。只画 highlight(ids) 命中的条目,同一 rAF 改 alpha,不建 Feature。按图层一套,不按条配色

「已存在 / 即将添加」用两组 series 区分(实线 vs type:'dash'),不要在引擎里写死业务状态字段。

坐标与 id

几何字段
线objXStart/objYStart/objXEnd/objYEndx1/y1/x2/y2
objX/objYobjx/objy
idobjCodeid;都没有时用坐标串(删除/更新请带业务 id)

有自定义投影时与现有高亮层一样转到 3857。series 可用 id / name 区分同形状不同样式的组。

new GraphicLayer(options, main)

var layer = map.addGraphicLayer({
  code: 'deviceSketch',
  series: [
    { type: 'line', style: { type: 'solid', color: '#1890ff', width: 2 },
      data: [{ objCode: 'L1', objXStart: 13528430, objYStart: 3676466, objXEnd: 13528500, objYEnd: 3676500 }] },
    { type: 'line', style: { type: 'dash' },
      data: [{ objCode: 'L2', x1: 13528430, y1: 3676466, x2: 13528500, y2: 3676500 }] },
    { type: 'circle', style: { type: 'solid', fillColor: '#fff', color: '#1890ff' },
      data: [{ objCode: 'P1', objX: 13528430, objY: 3676466 }] },
    { type: 'triangle', style: { type: 'dash' },
      data: [{ objCode: 'P2', objx: 13528440, objy: 3676470 }] },
    { type: 'square', style: { type: 'solid' },
      data: [{ objCode: 'P3', objX: 13528450, objY: 3676480 }] }
  ]
});

layer.addData(series);
layer.updateData(series);   // upsert,同 id 更新字段(可跨组)
layer.removeData(['L1', 'P2']);
layer.getData();            // 当前全部 series + 原始字段
layer.highlight(['L1', 'P1']);
layer.clearHighlight();

也可构造后再 setSeries(series)initLayers / addLayertype: '17''GraphicLayer'

series 结构

{
  id: 'existing',          // 可选;也可用 name。省略则按 type+样式指纹分组
  type: 'line',            // 'line' | 'circle' | 'triangle' | 'square'('point' 视为 circle)
  style: { type: 'solid' },
  data: [ /* 行对象 */ ]
}

style 字段

字段线默认
typesolid / dash同左(虚线描边)solid
color芯线颜色图形边颜色#1890ff
width芯线宽图形边宽线 2 / 点 1.5
strokeColor外描边外描边填充色
strokeWidth外描边宽外描边半径增量0
fillColor填充#ffffff
radius半径6

highlightStyle 字段

字段说明默认
lineColor线芯颜色#00ff00
lineWidth线芯宽3
haloColor线白描边#ffffff
haloWidth线白描边宽14
fillColor点填充(闪烁)#00ff00
color点白描边#ffffff
width点描边宽4
radius点半径6
blinkSpeed闪烁半周期速度1.6

方法

setSeries(series)

addData(series) / updateData(series)

removeData(ids)

getData()

highlight(ids, highlightStyle?)

clearHighlight()

hitTest(coordinate, pixel, options?)

map.callback.clickCallback = function (results, current) {
  // results 可能含 GraphicLayer 点/线:{ objCode, layerCode, ...原始字段 }
};

// 关闭某层拾取
map.addGraphicLayer({ code: 'sketch', hitDetect: false, series: [...] });

clear()


EchartsLayer

new EchartsLayer(options)

方法

setData(features, addType?)

// 一般由 initLayers / 关联图层 setData 驱动
map.layers.flow.setData(geoJsonFeatures, 'geoserver');

getLayerStatesArray()

appendTo(olMap)


图层 type 与类对照(速查)

businessLayers.type基类
1 / CloudLayerCloudLayerol/layer/Vector
12 / ClusterLayerClusterLayerCloudLayer
11 / GLayerGLayerol/layer/Vector
13 / ContourLayerContourLayerol/layer/Vector
15 / HeatmapLayerHeatmapLayerol/layer/Heatmap
16 / GeoTIFFLayer / TifLayerGeoTIFFLayerol/layer/WebGLTile
17 / GraphicLayerGraphicLayerol/layer/Layer(Canvas)
6 / VectorTileLayerVectorTileLayerol/layer/VectorTile
14 / EchartsLayerEchartsLayerol-echarts
(工厂)HistoryDispatchCloudLayer
以上类从包入口导出,请通过 initLayers / addLayer / addContour / historyDispatch 等创建,再用 map.layers[code] 调用。