circle-symbol
本文回答:
vjmap.Circle圆点图层 —— 参数、hover、点击、性能。
一、最小示例
const circle = new vjmap.Circle({
data: map.toLngLat(geojson),
circleColor: "#f00",
circleRadius: 5,
circleStrokeColor: "#fff",
circleStrokeWidth: 2
});
circle.addTo(map);
二、参数表(驼峰式)
| 参数 | 默认 | 说明 |
|---|---|---|
data |
— | GeoJSON FeatureCollection / feature / coord |
circleRadius |
5 | 半径(像素) |
circleColor |
#000 |
填充色 |
circleOpacity |
1 | 填充透明 |
circleBlur |
0 | 模糊(0-1) |
circleStrokeWidth |
0 | 边框像素 |
circleStrokeColor |
#000 |
边框色 |
circleStrokeOpacity |
1 | 边框透明 |
circleTranslate |
[0,0] |
平移(像素) |
circleTranslateAnchor |
"map" |
map/viewport |
circlePitchScale |
"map" |
map/viewport:pitch 时是否随地图缩放 |
circlePitchAlignment |
"viewport" |
同上 |
circleSortKey |
— | 同层排序 |
visibility |
"visible" |
可见性 |
minzoom / maxzoom |
— | 生效 zoom 区间 |
filter |
— | vjmap 样式过滤表达式 |
isHoverPointer |
false | hover 时改 cursor(vjmap 扩展) |
isHoverFeatureState |
false | hover 时自动设 feature-state.hover(vjmap 扩展) |
三、数据驱动
new vjmap.Circle({
data: map.toLngLat(geojson),
circleColor: [
"case",
["boolean", ["feature-state", "hover"], false], "#ff0",
["get", "color"]
],
circleRadius: [
"interpolate", ["linear"], ["get", "level"],
1, 3,
10, 15
]
});
四、hover / click 事件(OverlayLayer 基类提供)
// hover 改 cursor(不在 options 里开时)
circle.hoverPointer();
// hover 改 feature-state(配合 ["feature-state","hover"] 表达式)
// 回调收到的是地图事件对象,不是 { feature }:进入时读 e.features?.[0](直接从一个要素移到相邻要素时
// 进入回调在 await 离开回调之后才跑,e.features 可能已被引擎清掉,需判空);
// 离开时 e.oldFeatureId 仅在直接移到相邻要素时有值,移出图层时为 undefined
circle.hoverFeatureState(
e => console.log("enter", e.features?.[0]),
e => console.log("leave", e.oldFeatureId)
);
// 点击
circle.clickLayer(e => alert(e.features[0].properties.name));
// hover 弹 popup
circle.hoverPopup(f => `<b>${f.properties.name}</b>`, { anchor: "bottom" });
五、更新数据
circle.setData(newGeoJson);
// 获取 sourceId / layerId
const sid = circle.getSourceId();
const lid = circle.getLayerId();
六、样式单项修改
circle.setCircleColor("#0af");
circle.setCircleRadius(10);
circle.setProperty("circleOpacity", 0.5);
map.setLayerZoomRange(circle.getLayerId(), 10, 24); // 改可见级别;setLayerStyle({ minzoom }) 会丢掉 minzoom 且把未列出的 paint/layout 全重置
circle.setFilter([">=", ["get", "level"], 3]);
七、show / hide
circle.hide();
circle.show();
circle.toggle(true); // true 可见 / false 隐藏
八、移除
circle.remove(); // 移除 layer + source
九、性能
circle是最轻量的 WebGL 图层,几十万点依然可用。- 大数据量时:
- hover 要 feature-state 须要素有非 0 id(封装类不透传
generateId,见 §十 第 2 条) circleSortKey决定同层哪个在上- 按 zoom 分层(
minzoom/maxzoom)
- hover 要 feature-state 须要素有非 0 id(封装类不透传
十、常见坑
- data 坐标忘了 toLngLat:点出现在赤道。
- hoverFeatureState 不生效:feature 没有非 0 的 id。封装类不透传
generateId(且 generateId 从 0 编号,而hoverFeatureState忽略 id 0):FeatureCollection 须自带非 0id;或传[{points, properties}]形式(自动id = 序号 + 1);或先自建源(promoteId)再传sourceId。 - CircleColor 是 CSS 颜色:
rgba(255, 0, 0, 0.5)OK,rgb(255 0 0 / 50%)可能不支持。 - 想做中心透明圆环:
circle-opacity: 0+circle-stroke-color/width。