From fdebb7fb278087ffc170c4bc0d06a28e7b4c61e5 Mon Sep 17 00:00:00 2001 From: xiaoluoHe Date: Fri, 27 Dec 2024 18:14:03 +0800 Subject: [PATCH 1/5] refactor: migrate mapLabel component into `vchart-extension` package --- .../browser/test-page/map-label/map-label.ts | 171 +++++++ .../src/components/map-label/index.ts | 2 + .../src/components/map-label/layout.ts | 303 ++++++++++++ .../src/components/map-label/map-label.ts | 451 ++++++++++++++++++ .../src/components/map-label/type.ts | 62 +++ packages/vchart-extension/src/index.ts | 1 + packages/vchart/src/core/index.ts | 11 +- packages/vchart/src/index.ts | 4 + packages/vchart/src/util/math.ts | 2 +- packages/vchart/src/vchart-all.ts | 2 - 10 files changed, 1005 insertions(+), 4 deletions(-) create mode 100644 packages/vchart-extension/__tests__/runtime/browser/test-page/map-label/map-label.ts create mode 100644 packages/vchart-extension/src/components/map-label/index.ts create mode 100644 packages/vchart-extension/src/components/map-label/layout.ts create mode 100644 packages/vchart-extension/src/components/map-label/map-label.ts create mode 100644 packages/vchart-extension/src/components/map-label/type.ts diff --git a/packages/vchart-extension/__tests__/runtime/browser/test-page/map-label/map-label.ts b/packages/vchart-extension/__tests__/runtime/browser/test-page/map-label/map-label.ts new file mode 100644 index 0000000000..4e674f8a20 --- /dev/null +++ b/packages/vchart-extension/__tests__/runtime/browser/test-page/map-label/map-label.ts @@ -0,0 +1,171 @@ +import { registerMapLabel } from './../../../../../src/components/map-label/map-label'; +import { default as VChart } from '@visactor/vchart'; + +// register3DPlugin(); +registerMapLabel({ VChart }); +const run = async () => { + // 图表配置 + const spec = { + type: 'common', + padding: 0, + region: [ + { + roam: true, + coordinate: 'geo', + longitudeField: 'lon', + latitudeField: 'lat' + } + ], + mapLabel: { + visible: true, + position: 'outer', + seriesId: 'scatter', + nameField: 'name', + valueField: 'value', + leader: { + visible: true, + style: { + stroke: 'blue' + } + }, + icon: { + visible: true, + style: { + size: 14, + lineWidth: 1, + fill: 'red', + shape: + // eslint-disable-next-line max-len + 'M-.4431-.4293h.2844l.1138.1138h.512v.6258H-.4431V-.4293zm.0569.6827h.7964V-.2587H-.0676l-.1138-.1138H-.3862v.6258z' + } + }, + background: { + style: { + shadowColor: 'red', + shadowBlur: 5 + } + } + }, + series: [ + { + type: 'map', + map: 'china', + nameField: 'name', + valueField: 'value', + seriesField: 'name', + nameMap: { + 广东省: '广东', + 江苏省: '江苏', + 山东省: '山东', + 河南省: '河南', + 河北省: '河北', + 浙江省: '浙江', + 四川省: '四川', + 安徽省: '安徽', + 辽宁省: '辽宁', + 陕西省: '陕西', + 山西省: '山西', + 湖北省: '湖北', + 北京市: '北京', + 湖南省: '湖南', + 黑龙江省: '黑龙江', + 福建省: '福建', + 内蒙古自治区: '内蒙古', + 云南省: '云南', + 江西省: '江西', + 重庆市: '重庆', + 上海市: '上海', + 贵州省: '贵州', + 吉林省: '吉林', + 天津市: '天津', + 广西壮族自治区: '广西', + 甘肃省: '甘肃', + 新疆维吾尔自治区: '新疆', + 宁夏回族自治区: '宁夏', + 海南省: '海南', + 青海省: '青海', + 西藏自治区: '西藏', + 香港特别行政区: '中国香港', + 台湾省: '中国台湾', + 澳门特别行政区: '澳门' + }, + area: { + style: { + fill: '#E9F2FF', + stroke: 'grey', + lineWidth: 1 + } + } + }, + { + regionIndex: 0, + id: 'scatter', + type: 'scatter', + data: { + values: [ + { + name: '乌鲁木齐', + value: '2197', + lat: '43.50', + lon: '87.37' + }, + { + name: '济南', + value: '2197', + lat: '36.606472', + lon: '117.164382' + }, + { + name: '江苏', + value: '21197', + lat: '32.983908', + lon: '119.486395' + }, + { + name: '成都', + value: '21197', + lat: '30.659462', + lon: '104.065735' + } + ] + }, + xField: 'name', + yField: 'value', + point: { + style: { + fill: 'blue', + fillOpacity: 1, + size: 10 + } + } + } + ], + tooltip: { + transitionDuration: 0 + } + }; + + const chinaMapUrl_topojson = 'https://tosv.byted.org/obj/gis/topojson/china.json'; + + const chinaRes_topojson = await fetch(chinaMapUrl_topojson); + const china_topojson = await chinaRes_topojson.json(); + + VChart.registerMap('china', china_topojson, { + type: 'topojson', + object: 'china', + simplify: true + }); + + const cs = new VChart(spec, { + dom: document.getElementById('chart') as HTMLElement + }); + console.time('renderTime'); + cs.renderSync(); + console.timeEnd('renderTime'); + window['vchart'] = cs; + console.log(cs); + cs.on('click', event => { + console.log(event); + }); +}; +run(); diff --git a/packages/vchart-extension/src/components/map-label/index.ts b/packages/vchart-extension/src/components/map-label/index.ts new file mode 100644 index 0000000000..47cde94673 --- /dev/null +++ b/packages/vchart-extension/src/components/map-label/index.ts @@ -0,0 +1,2 @@ +export * from './map-label'; +export * from './type'; diff --git a/packages/vchart-extension/src/components/map-label/layout.ts b/packages/vchart-extension/src/components/map-label/layout.ts new file mode 100644 index 0000000000..24b24e5ccd --- /dev/null +++ b/packages/vchart-extension/src/components/map-label/layout.ts @@ -0,0 +1,303 @@ +import type { Feature } from '@visactor/vutils'; +import { isPointInPolygon, destination, getAABBFromPoints } from '@visactor/vutils'; +import type { IRect, IOrientType, IPoint } from '@visactor/vchart'; + +type IBound = { + x1: number; + x2: number; + y1: number; + y2: number; +}; +export interface IPairInfo { + /** 矩形信息 */ + rect: IRect; + /** 对应点的画布坐标 */ + point: IPoint; + /** 对应点的经纬度坐标 */ + pointCoord?: IPoint; + /** 基于锚点的可放置位置 */ + anchors?: IOrientType[]; + /** 距离锚点的位置偏移量 */ + offset?: number; + /** 原始顺序 */ + index: number; +} + +function overlap(a: T, b: T, sep = 0) { + return sep > Math.max(b.x1 - a.x2, a.x1 - b.x2, b.y1 - a.y2, a.y1 - b.y2); +} + +export function bound(rect: IRect): IBound { + return { + x1: rect.x, + x2: rect.x + rect.width, + y1: rect.y, + y2: rect.y + rect.height + }; +} + +function toRect(bound: IBound): IRect { + return { + x: bound.x1, + y: bound.y1, + width: bound.x2 - bound.x1, + height: bound.y2 - bound.y1 + }; +} + +/** + * 根据可选位置进行躲避布局 + * @param pairs + * @returns + */ +export function layoutByPosition(pairs: IPairInfo[]): IRect[] { + if (!pairs || pairs.length === 0) { + return []; + } + + // 只有一个无需布局 + if (pairs.length === 1) { + return [pairs[0].rect]; + } + + const _pairs = pairs.map(pair => { + return { + ...pair, + bound: bound(pair.rect), + anchorCandidates: candidatesByOrient(pair.anchors ?? [], pair.point!, pair.rect, pair.offset) + }; + }); + + const resultBound: IBound[] = []; + // 默认布局第一个 + resultBound.push(_pairs[0].bound); + + for (let i = 1; i <= _pairs.length - 1; i++) { + const curPair = _pairs[i]; + const curBound = curPair.bound; + // 遍历检测 + let isOverlap = resultBound.some(r => overlap(r, curBound)); + if (!curPair.anchorCandidates) { + continue; + } + if (isOverlap && curPair.anchorCandidates?.length > 0) { + for (let j = 0; j < curPair.anchorCandidates.length; j++) { + const anchor = curPair.anchorCandidates[j]; + const newBound = { + x1: anchor.x, + y1: anchor.y, + x2: anchor.x + curBound.x2 - curBound.x1, + y2: anchor.y + curBound.y2 - curBound.y1, + anchor + }; + if (!resultBound.some(r => overlap(r, newBound))) { + resultBound.push(newBound); + isOverlap = false; + break; + } + } + if (isOverlap) { + // 所有候选位置都放不下 + resultBound.push(curPair.bound); + } + } else { + resultBound.push(curPair.bound); + } + } + + return resultBound.map(bound => toRect(bound)); +} + +export function layoutOuter( + pairs: IPairInfo[], + features: Feature[], + dataToPosition: (coord: number[]) => IPoint | null +): IRect[] { + // 1. 计算包围圆 + const _points = pairs.map(rect => rect.pointCoord); + const { x1, x2, y1, y2 } = getAABBFromPoints(_points); + const geoCenter = [(x1 + x2) / 2, (y1 + y2) / 2]; + const centerPosition = dataToPosition(geoCenter); + + if (!centerPosition) { + return []; + } + + // 2. 遍历每个rect + // anchor与圆心的交点方向,尝试寻找不在地图区域内部的新锚点 + const result = pairs.map(pair => { + const rect = pair.rect; + const targetPoint = !isPointWithinFeatures(features, pair.pointCoord!) + ? pair.point + : dataToPosition( + nearestPoint( + features, + [pair.pointCoord!.x, pair.pointCoord!.y], + uniformDegree(lineDegree(pair.point!, centerPosition)) + ) + ); + + if (targetPoint) { + rect.x = targetPoint.x; + rect.y = targetPoint.y; + } + // 3. 根据finalAnchor在包围圆上的位置,调整rect的位置 + // 将圆根据圆心角划分为4个区域,对应不同的position + + const degree = uniformDegree(lineDegree(pair.point!, centerPosition)); + + let position: IOrientType; + const anchors: IOrientType[] = []; + if (degree >= -45 && degree < 45) { + position = 'top'; + anchors.push('left', 'right'); + } else if (degree >= 45 && degree < 135) { + position = 'right'; + } else if (degree >= -135 && degree < -45) { + position = 'left'; + anchors.push('left'); + } else { + position = 'bottom'; + anchors.push('left', 'right'); + } + pair.anchors = anchors; + pair.offset = 20; + pair.rect = placeRectByOrient(pair.rect, position, 0); + return pair; + }); + + return layoutByPosition(result); +} + +export function layoutOuter2( + pairs: IPairInfo[], + features: Feature[], + dataToPosition: (coord: number[]) => IPoint | null +): IRect[] { + // 1. 计算几何中心 + let x = 0; + let y = 0; + for (let i = 0; i < pairs.length; i++) { + x += pairs[i].pointCoord.x; + y += pairs[i].pointCoord.y; + } + x /= pairs.length; + y /= pairs.length; + const centerPosition = dataToPosition([x, y]); + if (!centerPosition) { + return []; + } + + const count = pairs.length; + + // 2. 按照圆心角排序 + pairs.sort((a, b) => { + return lineDegree(centerPosition, a.point) - lineDegree(centerPosition, b.point); + }); + + const result = pairs.map((pair, index) => { + let degree = (360 / count) * index; + const _degree = lineDegree(centerPosition, pair.point); + degree = uniformDegree((degree + _degree) / 2); + const targetPoint = !isPointWithinFeatures(features, pair.pointCoord) + ? pair.point + : dataToPosition(nearestPoint(features, [pair.pointCoord.x, pair.pointCoord.y], degree)); + if (targetPoint) { + pair.rect.x = targetPoint.x; + pair.rect.y = targetPoint.y; + } + // 3. 根据finalAnchor在包围圆上的位置,调整rect的位置 + // 将圆根据圆心角划分为4个区域,对应不同的position + let position: IOrientType; + const anchors: IOrientType[] = []; + if (degree >= -45 && degree < 45) { + position = 'top'; + anchors.push('left', 'right'); + } else if (degree >= 45 && degree < 135) { + position = 'right'; + } else if (degree >= -135 && degree < -45) { + position = 'left'; + anchors.push('left'); + } else { + position = 'bottom'; + anchors.push('left', 'right'); + } + + pair.anchors = anchors; + pair.offset = 20; + pair.rect = placeRectByOrient(pair.rect, position, 0); + return pair; + }); + + return layoutByPosition(result.sort((a, b) => a.index - b.index)); +} + +function uniformDegree(degree: number) { + return degree > 180 ? degree - 360 : degree; +} + +function lineDegree(start: IPoint, end: IPoint) { + return (Math.atan2(start.y - end.y, start.x - end.x) * 180) / Math.PI + 90; +} + +function nearestPoint(features: Feature[], origin: number[], bearing: number, distance = 200) { + const count = 5621 / distance; + let curOrigin = origin; + for (let i = 1; i <= count; i++) { + const dest = destination(curOrigin as unknown as IPoint, distance, bearing); + if (!isPointWithinFeatures(features, dest)) { + return [dest.x, dest.y]; + } + curOrigin = [dest.x, dest.y]; + } + return origin; +} + +function isPointWithinFeatures(features: Feature[], p: IPoint) { + for (let i = 0; i < features.length; i++) { + const inside = isPointInPolygon(p, features[i] as any); + if (inside) { + return true; + } + } + return false; +} + +/** + * 以rect左上角为锚点的,根据position位置调整rect布局。 + * @param rect + * @param position 在锚点的四周位置,'top' | 'bottom' | 'left' | 'right' + * @param offset rect与锚点间的距离 + * @returns + */ +export function placeRectByOrient(rect: IRect, position: IOrientType, offset = 0) { + const result: IRect = { ...rect }; + if (position === 'top') { + result.x -= rect.width / 2; + result.y -= offset + rect.height / 2; + } else if (position === 'bottom') { + result.x -= rect.width / 2; + result.y += offset - rect.height / 2; + } else if (position === 'left') { + result.x -= offset + rect.width; + result.y -= rect.height / 2; + } else if (position === 'right') { + result.x += offset; + result.y -= rect.height / 2; + } + return result; +} + +export function candidatesByOrient( + positions: IOrientType[], + anchor: IPoint, + rect: Pick, + offset = 0 +) { + const candidates: IPoint[] = []; + positions.forEach((p: IOrientType) => { + const { x, y } = placeRectByOrient({ ...anchor, width: rect.width, height: rect.height }, p, offset); + candidates.push({ x, y }); + }); + return candidates; +} diff --git a/packages/vchart-extension/src/components/map-label/map-label.ts b/packages/vchart-extension/src/components/map-label/map-label.ts new file mode 100644 index 0000000000..c136346ca1 --- /dev/null +++ b/packages/vchart-extension/src/components/map-label/map-label.ts @@ -0,0 +1,451 @@ +import { DataView } from '@visactor/vdataset'; +import type { IGraphic, IGroup, INode, IRect as IRectGraphic } from '@visactor/vrender-core'; +import { graphicCreator } from '@visactor/vrender-core'; +import type { Maybe } from '@visactor/vutils'; +import { isValid } from '@visactor/vutils'; +import { MarkPoint } from '@visactor/vrender-components'; +import { + LayoutZIndex, + normalizeLayoutPaddingSpec, + transformToGraphic, + TransformLevel, + getSpecInfo, + CompilableData, + VChart, + BaseComponent +} from '@visactor/vchart'; +import type { + IPadding, + IRect, + IOrientType, + IPoint, + Datum, + IModel, + IModelSpecInfo, + PanEventParam, + ICartesianSeries, + IGeoSeries +} from '@visactor/vchart'; +import type { IPairInfo } from './layout'; +import { layoutByPosition, layoutOuter, placeRectByOrient } from './layout'; +import type { IMapLabelSpec, MapLabelSceneNodeMap } from './type'; + +export class MapLabelComponent extends BaseComponent { + static type = 'mapLabel'; + type = 'mapLabel'; + name = ' mapLabel'; + + static specKey = 'mapLabel'; + specKey = 'mapLabel'; + + layoutType: 'none' = 'none'; + + layoutZIndex = LayoutZIndex.MarkPoint; + + protected nameField: string; + protected valueField?: string; + + protected _series: ICartesianSeries | IGeoSeries; + protected _map: any[]; + protected _longitudeField: string; + protected _latitudeField: string; + + protected _markerComponents: MarkPoint[]; + + private _activeDatum: Datum[] = []; + + static getSpecInfo(chartSpec: any): Maybe { + return getSpecInfo(chartSpec, this.specKey, this.type, (s: IMapLabelSpec) => { + return s.visible && isValid(s.seriesId); + }); + } + + setAttrFromSpec(): void { + this.nameField = this._spec.nameField ?? this._series?.getDimensionField()[0]; + this.valueField = this._spec.valueField ?? this._series?.getMeasureField()[0]; + } + + created() { + super.created(); + if (!!this._spec.visible === false) { + return; + } + this.initRelatedInfo(); + this.initData(); + this.initEvent(); + } + + initRelatedInfo(): void { + this._series = this._option.getSeriesInUserIdOrIndex([this._spec.seriesId])[0] as ICartesianSeries; + if (this._spec.position === 'outer') { + // 需要获取region上的地理坐标系 + this._map = (this._regions[0].getSeriesInType('map')[0] as IGeoSeries)?.getMapViewData()?.latestData; + this._longitudeField = this._regions[0].getSpec?.()?.longitudeField; + this._latitudeField = this._regions[0].getSpec?.()?.latitudeField; + } + } + + initData() { + const series = this._series; + if (!series) { + return; + } + const seriesData = series.getViewData(); + if (seriesData) { + const data = new DataView(this._option.dataSet, { name: `${this.name}_data` }); + data.parse([seriesData], { + type: 'dataview' + }); + data.transform({ type: 'copyDataView', level: TransformLevel.copyDataView }, false); + + this._data = new CompilableData(this._option, data); + data.target.addListener('change', () => { + if (this._spec.trigger !== 'hover' && this._spec.trigger !== 'click') { + this._activeDatum = this._data.getLatestData(); + } + }); + } + } + + initEvent() { + this.event.on('zoom', { filter: params => this._isRelativeModel(params.model) }, () => { + this.handleZoom(); + return true; + }); + + this.event.on('panmove', { filter: params => this._isRelativeModel(params.model) }, e => { + this.handlePan(e as unknown as PanEventParam); + return true; + }); + + const trigger = this._spec.trigger; + if (trigger === 'none') { + return; + } + + const view = this.getCompiler()?.getVGrammarView(); + + if (!view) { + return; + } + + if (trigger === 'hover') { + view.addEventListener('element-highlight:start', (params: any) => { + if (this._isRelativeSeries(params.options.seriesId)) { + this._updateDatum(params.elements[0].getDatum()); + } + }); + view.addEventListener('element-highlight:reset', (params: any) => { + if (this._isRelativeSeries(params.options.seriesId)) { + this._updateDatum(null); + } + }); + } else if (trigger === 'click') { + view.addEventListener('element-select:start', (params: any) => { + if (this._isRelativeSeries(params.options.seriesId)) { + this._updateDatum(params.elements[0].getDatum()); + } + }); + view.addEventListener('elementSelectReset', (params: any) => { + if (this._isRelativeSeries(params.options.seriesId)) { + this._updateDatum([]); + } + }); + } + } + + handlePan(e: PanEventParam) { + const { delta } = e; + this._markerComponents.forEach(marker => { + marker.translate(delta[0], delta[1]); + }); + } + + handleZoom() { + this._updateMarkerLayoutAttribute(); + } + + private _updateDatum(datum: Datum[]) { + this._activeDatum = datum; + this._markerComponents.forEach((marker, index) => { + const markerDatum = this._data?.getLatestData()[index]; + if (this._activeDatum.includes(markerDatum)) { + marker.setAttribute('visible', true); + } else { + marker.setAttribute('visible', false); + } + }); + } + + dataToPosition(datum: any) { + return this._series.dataToPosition(datum); + } + + updateLayoutAttribute() { + const markData = this._data?.getLatestData(); + if (!markData || markData.length === 0) { + return; + } + super.updateLayoutAttribute(); + this._updateMarkerLayoutAttribute(); + } + + protected _updateMarkerLayoutAttribute() { + const layoutPairInfo: IPairInfo[] = []; + const markerMarks: MapLabelSceneNodeMap[] = []; + if (!this._markerComponents) { + this._markerComponents = this._data?.getLatestData().map((data: Datum, index: number) => { + const cmp = new MarkPoint({ + position: undefined, + animation: false // 地图标签使用的是markPoint, 暂不开启动画, 待优化@chensiji + }); + if (cmp) { + cmp.name = `${this.name}_marker_${index}`; + cmp.id = (this._spec as any).id ?? `${this.name}_marker_${this.id}`; + cmp.setAttribute('zIndex', this.layoutZIndex); + } + return cmp; + }); + } + const markerComponents = this._markerComponents; + markerComponents.forEach((marker, index) => { + const { pairInfo, contentMarks } = this._evaluateMarker(this._data.getLatestData()[index], index); + pairInfo && layoutPairInfo.push(pairInfo); + contentMarks && markerMarks.push(contentMarks); + }); + + const positionedRects = this._layoutLabels(layoutPairInfo); + this._layoutMarkers(positionedRects, markerMarks); + this._renderMarkers(); + } + + protected _evaluateMarker(data: Datum, index: number) { + let contentItemCount = 0; + let paddingWidth = 0; + let paddingHeight = 0; + let contentWidth = 0; + let contentHeight = 0; + + const position = this._spec.position || 'top'; + const offset = this._spec.offset; + + const padding = normalizeLayoutPaddingSpec(this._spec.background?.padding) as IPadding; + const space = this._spec.space || 0; + paddingWidth += (padding?.left || 0) + (padding?.right || 0); + paddingHeight += (padding?.top || 0) + (padding?.bottom || 0); + + const contentMarks: MapLabelSceneNodeMap = {}; + const positionAttr = this.dataToPosition(data); + + const container = graphicCreator.group({}); + container.name = `${this.name}_marker_itemContainer_${index}`; + contentMarks.container = container; + + if (this._spec.background?.visible) { + const labelBackground = graphicCreator.rect(transformToGraphic({ ...this._spec.background.style })); + labelBackground.setAttributes(positionAttr); + contentMarks.labelBackground = labelBackground; + container.appendChild(labelBackground); + } + + if (this._spec.icon?.visible) { + const icon = graphicCreator.symbol(transformToGraphic({ ...this._spec.icon.style })); + icon.setAttributes(positionAttr); + icon.setAttribute('symbolType', this._spec.icon.style?.shape); + const iconBound = icon.AABBBounds; + const iconHeight = iconBound?.y2 - iconBound?.y1 ?? 0; + const iconWidth = iconBound?.x2 - iconBound?.x1 ?? 0; + contentMarks.icon = icon; + container.appendChild(icon); + + contentHeight = iconHeight; + contentWidth += iconWidth; + contentItemCount++; + } + + if (this._spec.nameLabel?.visible) { + const nameLabel = graphicCreator.text(transformToGraphic({ ...this._spec.nameLabel.style })); + nameLabel.setAttributes(positionAttr); + nameLabel.setAttribute('text', data[this.nameField]); + const nameLabelBound = nameLabel.AABBBounds; + const nameLabelHeight = nameLabelBound?.y2 - nameLabelBound?.y1 ?? 0; + const nameLabelWidth = nameLabelBound?.x2 - nameLabelBound?.x1 ?? 0; + contentMarks.nameLabel = nameLabel; + container.appendChild(nameLabel); + + contentHeight = Math.max(contentHeight, nameLabelHeight); + contentWidth += nameLabelWidth; + contentItemCount++; + } + + if (this._spec.valueLabel?.visible && isValid(data[this.valueField])) { + const valueLabel = graphicCreator.text(transformToGraphic({ ...this._spec.valueLabel.style })); + valueLabel.setAttributes(positionAttr); + valueLabel.setAttribute('text', data[this.valueField]); + const valueLabelBound = valueLabel.AABBBounds; + const valueLabelHeight = valueLabelBound?.y2 - valueLabelBound?.y1 ?? 0; + const valueLabelWidth = valueLabelBound?.x2 - valueLabelBound?.x1 ?? 0; + contentMarks.valueLabel = valueLabel; + container.appendChild(valueLabel); + + contentHeight = Math.max(contentHeight, valueLabelHeight); + contentWidth += valueLabelWidth; + contentItemCount++; + } + + const firstValidMark = Object.values(contentMarks).find(m => !!m && m.type !== 'group'); + + const anchor: IPoint = { + x: firstValidMark?.getComputedAttribute('x'), + y: firstValidMark?.getComputedAttribute('y') + }; + const itemRect = { + x: anchor.x, + y: anchor.y, + width: 0, + height: 0 + }; + + itemRect.width = paddingWidth + contentWidth + (contentItemCount - 1) * space; + itemRect.height = paddingHeight + contentHeight; + + const pairInfo: IPairInfo = { + rect: itemRect, + point: anchor, + index + }; + // 计算得到最终所有元素包围盒的布局位置 + if (position !== 'outer') { + const anchors = ['top', 'right', 'left', 'bottom'].filter(a => a !== position); + pairInfo.rect = placeRectByOrient(itemRect, position, offset); + pairInfo.anchors = anchors as IOrientType[]; + pairInfo.offset = offset; + } else { + pairInfo.pointCoord = { + x: +data?.[this._longitudeField], + y: +data?.[this._latitudeField] + }; + } + return { pairInfo, contentMarks }; + } + + protected _layoutMarkers(positionedRects: IRect[], contentMarks: MapLabelSceneNodeMap[]) { + for (let i = 0; i < contentMarks.length; i++) { + if (!positionedRects[i] || !contentMarks[i]) { + return; + } + const { icon, nameLabel, valueLabel, labelBackground, container } = contentMarks[i]; + + const itemRect = positionedRects[i]; + const padding = normalizeLayoutPaddingSpec(this._spec.background?.padding) as IPadding; + const space = this._spec.space || 0; + + const curY = itemRect.height / 2; + let curX = padding?.left || 0; + [icon, nameLabel, valueLabel].forEach((item, index) => { + if (item) { + const bounds = item.AABBBounds; + let offset = 0; + if (item.type === 'symbol') { + // 文字的锚点在文字左侧,baseline在中心 + // symbol的锚点[0,0]在图形中心。所以x方向要偏移半个bound。 + offset += (bounds.x2 - bounds.x1 ?? 0) / 2; + } + item.setAttributes({ + x: curX + offset, + y: curY + }); + + curX += bounds.x2 - bounds.x1 ?? 0; + if (index !== 2) { + curX += space; + } + } + }); + (labelBackground as IRectGraphic)?.setAttributes({ + x: 0, + y: 0, + width: itemRect.width, + height: itemRect.height + }); + container?.setAttributes({ + dx: -itemRect.width / 2, + dy: -itemRect.height / 2 + }); + const datum = this._data.getLatestData()[i]; + const anchor = this.dataToPosition(datum); + const regionPos = this.getRegions()[0].getLayoutStartPoint(); + const showLeader = !!(this._spec.leader?.visible && (icon || nameLabel || valueLabel)); + this._markerComponents[i].setAttributes({ + x: regionPos.x, + y: regionPos.y, + position: anchor, + visible: this._activeDatum.includes(datum), + itemContent: { + refX: 0, + type: 'custom', + renderCustomCallback: () => container as unknown as IGroup, + autoRotate: false, + offsetX: itemRect.x + itemRect.width / 2 - anchor.x, + offsetY: itemRect.y + itemRect.height / 2 - anchor.y + }, + itemLine: { + visible: showLeader, + type: 'type-po', + lineStyle: transformToGraphic({ ...this._spec.leader?.style }), + startSymbol: { visible: false } + } + }); + } + } + + protected _renderMarkers() { + if (!this._markerComponents || !this._markerComponents.length) { + return; + } + + for (let i = 0; i < this._markerComponents.length; i++) { + this.getContainer().add(this._markerComponents[i] as unknown as INode); + } + } + + protected _layoutLabels(rects: IPairInfo[]) { + const result = + this._spec.position === 'outer' && this._map + ? layoutOuter(rects, this._map, (coord: number[]) => + this._series.dataToPosition({ + [this._longitudeField]: coord[0], + [this._latitudeField]: coord[1] + }) + ) + : layoutByPosition(rects); + + return result; + } + + private _isRelativeModel(model: IModel) { + const id = + (this._series as ICartesianSeries).getXAxisHelper()?.getAxisId() ?? + (this._series as IGeoSeries).getCoordinateHelper()?.getCoordinateId(); + return model?.id === id; + } + + private _isRelativeSeries(model: IModel) { + return model?.id === this._series.id; + } + + protected _getNeedClearVRenderComponents(): IGraphic[] { + return this._markerComponents as unknown as IGroup[]; + } + + getVRenderComponents() { + return this._markerComponents as unknown as IGroup[]; + } +} + +export const registerMapLabel = (option?: { VChart?: typeof VChart }) => { + const vchartConstructor = option?.VChart || VChart; + if (vchartConstructor) { + vchartConstructor.useComponent([MapLabelComponent as any]); + } +}; diff --git a/packages/vchart-extension/src/components/map-label/type.ts b/packages/vchart-extension/src/components/map-label/type.ts new file mode 100644 index 0000000000..93956a839d --- /dev/null +++ b/packages/vchart-extension/src/components/map-label/type.ts @@ -0,0 +1,62 @@ +import type { IGraphic } from '@visactor/vrender-core'; +import type { IPadding, IOrientType, StringOrNumber } from '@visactor/vchart'; +import type { IPathMarkSpec, IRectMarkSpec, ISymbolMarkSpec, ITextMarkSpec } from '@visactor/vchart'; + +export type LabelPosition = IOrientType | 'outer'; + +export interface IMapLabelSpec extends IMapLabelTheme { + /** 关联的系列 id */ + seriesId: StringOrNumber; + /** 名称文本的数据字段 */ + nameField?: string; + /** 数值文本的数据字段 */ + valueField?: string; + /** + * 交互触发类型 + * @default 'none' + */ + trigger?: 'hover' | 'click' | 'none'; +} + +export type IMapLabelNodes = 'nameLabel' | 'valueLabel' | 'icon' | 'labelBackground' | 'container'; + +export type MapLabelSceneNodeMap = Partial>; + +export interface IMapLabelTheme { + /** 是否显示,默认 false */ + visible?: boolean; + /** 标签非 outer 位置下与标记点的间距 */ + offset?: number; + /** + * icon/label之间的距离 + */ + space?: number; + /** 标签位置 */ + position?: LabelPosition; + /** 名称文本样式设置 */ + nameLabel?: { + visible?: boolean; + style?: ITextMarkSpec; + }; + /** 数值文本样式设置 */ + valueLabel?: { + visible?: boolean; + style?: ITextMarkSpec; + }; + /** 图标样式设置 */ + icon?: { + visible?: boolean; + style?: ISymbolMarkSpec; + }; + /** 背景样式设置 */ + background?: { + visible?: boolean; + padding?: IPadding; + style?: IRectMarkSpec; + }; + /** 引导线样式设置 */ + leader?: { + visible?: boolean; + style?: IPathMarkSpec; + }; +} diff --git a/packages/vchart-extension/src/index.ts b/packages/vchart-extension/src/index.ts index 5d7bbec5c1..beeaa33ac0 100644 --- a/packages/vchart-extension/src/index.ts +++ b/packages/vchart-extension/src/index.ts @@ -4,3 +4,4 @@ export * from './charts/conversion-funnel'; export * from './components/series-break'; export * from './components/bar-link'; export * from './components/series-label'; +export * from './components/map-label'; diff --git a/packages/vchart/src/core/index.ts b/packages/vchart/src/core/index.ts index 68f173b8ed..72947f8e45 100644 --- a/packages/vchart/src/core/index.ts +++ b/packages/vchart/src/core/index.ts @@ -15,14 +15,18 @@ export type { IVChart } from './interface'; export type { IStateSpec, StateValueType } from '../compile/mark'; export type { IRegion } from '../region/interface'; -export * from '../typings/spec/common'; export * from '../event/interface'; export * from '../theme/interface'; +export * from '../model/interface'; + export * from './interface'; +export * from '../typings'; // some constants export * from '../constant/base'; export * from '../constant/data'; +export * from '../constant/layout'; +export { TransformLevel } from '../data/initialize'; /** * spec @@ -37,3 +41,8 @@ export * from '../theme/index'; // vrender export { vglobal } from '@visactor/vrender-core'; + +// utils +export * from '../util/space'; +export { transformToGraphic } from '../util/style'; +export { getSpecInfo } from '../component/util'; diff --git a/packages/vchart/src/index.ts b/packages/vchart/src/index.ts index bf511139d9..e97003f957 100644 --- a/packages/vchart/src/index.ts +++ b/packages/vchart/src/index.ts @@ -18,3 +18,7 @@ export * from './plugin/chart'; export * from './plugin/components/tooltip-handler'; export * from './plugin/components/axis-sync'; export * from './plugin/other'; + +// base component model for extension +export * from './component/base'; +export * from './compile/data/compilable-data'; diff --git a/packages/vchart/src/util/math.ts b/packages/vchart/src/util/math.ts index bb50f5f917..83417b6574 100644 --- a/packages/vchart/src/util/math.ts +++ b/packages/vchart/src/util/math.ts @@ -1,5 +1,5 @@ import type { IBoundsLike } from '@visactor/vutils'; -import type { IPoint, Quadrant, TextAlign, TextBaseLine } from '../typings'; +import type { IPoint, TextAlign, TextBaseLine } from '../typings'; import type { Datum } from '@visactor/vgrammar-core'; import { isValidNumber } from './type'; import { regressionLinear } from '@visactor/vgrammar-util'; diff --git a/packages/vchart/src/vchart-all.ts b/packages/vchart/src/vchart-all.ts index 79779c7209..eb78356aa0 100644 --- a/packages/vchart/src/vchart-all.ts +++ b/packages/vchart/src/vchart-all.ts @@ -54,7 +54,6 @@ import { registerTotalLabel } from './component/label/total-label'; import { registerMarkPoint, registerPolarMarkPoint, registerGeoMarkPoint } from './component/marker/mark-point'; import { registerBrush } from './component/brush'; import { registerCustomMark } from './component/custom-mark'; -import { registerMapLabel } from './component/map-label'; import { registerGridLayout } from './layout/grid-layout/grid-layout'; import { registerLayout3d } from './layout/layout3d'; import { registerPoptip } from './component/poptip'; @@ -154,7 +153,6 @@ VChart.useRegisters([ registerTotalLabel, registerBrush, registerCustomMark, - registerMapLabel, registerPoptip, // layout From 8b8ae07be000792373a8cda950f78fb265b73a72 Mon Sep 17 00:00:00 2001 From: xiaoluoHe Date: Mon, 30 Dec 2024 11:59:10 +0800 Subject: [PATCH 2/5] feat: remove mapLabel in vchart --- .../browser/test-page/map-label/map-label.ts | 43 +- .../map-label/map-label-transformer.ts | 12 + .../src/components/map-label/map-label.ts | 6 +- .../src/components/map-label/theme.ts} | 16 +- .../src/components/map-label/type.ts | 4 +- packages/vchart/src/component/index.ts | 6 - .../src/component/map-label/component.ts | 451 ------------------ .../vchart/src/component/map-label/index.ts | 6 - .../src/component/map-label/interface.ts | 63 --- .../vchart/src/component/map-label/layout.ts | 303 ------------ packages/vchart/src/core/index.ts | 1 + .../theme/builtin/common/component/index.ts | 2 - 12 files changed, 53 insertions(+), 860 deletions(-) create mode 100644 packages/vchart-extension/src/components/map-label/map-label-transformer.ts rename packages/{vchart/src/theme/builtin/common/component/map-label.ts => vchart-extension/src/components/map-label/theme.ts} (60%) delete mode 100644 packages/vchart/src/component/map-label/component.ts delete mode 100644 packages/vchart/src/component/map-label/index.ts delete mode 100644 packages/vchart/src/component/map-label/interface.ts delete mode 100644 packages/vchart/src/component/map-label/layout.ts diff --git a/packages/vchart-extension/__tests__/runtime/browser/test-page/map-label/map-label.ts b/packages/vchart-extension/__tests__/runtime/browser/test-page/map-label/map-label.ts index 4e674f8a20..536501f23a 100644 --- a/packages/vchart-extension/__tests__/runtime/browser/test-page/map-label/map-label.ts +++ b/packages/vchart-extension/__tests__/runtime/browser/test-page/map-label/map-label.ts @@ -22,27 +22,32 @@ const run = async () => { seriesId: 'scatter', nameField: 'name', valueField: 'value', - leader: { - visible: true, - style: { - stroke: 'blue' - } - }, + + space: 6, icon: { visible: true, style: { - size: 14, - lineWidth: 1, + size: 20, + dx: -8, + dy: -10, fill: 'red', - shape: - // eslint-disable-next-line max-len - 'M-.4431-.4293h.2844l.1138.1138h.512v.6258H-.4431V-.4293zm.0569.6827h.7964V-.2587H-.0676l-.1138-.1138H-.3862v.6258z' + symbolType: `` } }, + nameLabel: { + style: { fill: '#1677ff' } + }, + valueLabel: { + style: { fill: '#1677ff' } + }, + leader: { + visible: true, + style: { stroke: '#1677ff' } + }, background: { style: { - shadowColor: 'red', - shadowBlur: 5 + fill: '#e6f4ff', + stroke: '#1677ff' } } }, @@ -133,16 +138,18 @@ const run = async () => { yField: 'value', point: { style: { - fill: 'blue', + fill: '#1677ff', + outerBorder: { + distance: 2, + lineWidth: 3, + strokeOpacity: 0.2 + }, fillOpacity: 1, size: 10 } } } - ], - tooltip: { - transitionDuration: 0 - } + ] }; const chinaMapUrl_topojson = 'https://tosv.byted.org/obj/gis/topojson/china.json'; diff --git a/packages/vchart-extension/src/components/map-label/map-label-transformer.ts b/packages/vchart-extension/src/components/map-label/map-label-transformer.ts new file mode 100644 index 0000000000..1b7f78450d --- /dev/null +++ b/packages/vchart-extension/src/components/map-label/map-label-transformer.ts @@ -0,0 +1,12 @@ +import { BaseComponentSpecTransformer } from '@visactor/vchart'; +import { IMapLabelSpec, IMapLabelStyleSpec } from './type'; +import { mapLabel } from './theme'; + +export class MapLabelSpecTransformer< + T extends IMapLabelSpec = IMapLabelSpec, + K extends IMapLabelStyleSpec = IMapLabelStyleSpec +> extends BaseComponentSpecTransformer { + protected _getDefaultSpecFromChart(): Partial { + return mapLabel as Partial; + } +} diff --git a/packages/vchart-extension/src/components/map-label/map-label.ts b/packages/vchart-extension/src/components/map-label/map-label.ts index c136346ca1..723c001515 100644 --- a/packages/vchart-extension/src/components/map-label/map-label.ts +++ b/packages/vchart-extension/src/components/map-label/map-label.ts @@ -29,6 +29,7 @@ import type { import type { IPairInfo } from './layout'; import { layoutByPosition, layoutOuter, placeRectByOrient } from './layout'; import type { IMapLabelSpec, MapLabelSceneNodeMap } from './type'; +import { MapLabelSpecTransformer } from './map-label-transformer'; export class MapLabelComponent extends BaseComponent { static type = 'mapLabel'; @@ -38,6 +39,9 @@ export class MapLabelComponent extends BaseComponent { static specKey = 'mapLabel'; specKey = 'mapLabel'; + static readonly transformerConstructor = MapLabelSpecTransformer as any; + readonly transformerConstructor = MapLabelSpecTransformer; + layoutType: 'none' = 'none'; layoutZIndex = LayoutZIndex.MarkPoint; @@ -251,7 +255,7 @@ export class MapLabelComponent extends BaseComponent { if (this._spec.icon?.visible) { const icon = graphicCreator.symbol(transformToGraphic({ ...this._spec.icon.style })); icon.setAttributes(positionAttr); - icon.setAttribute('symbolType', this._spec.icon.style?.shape); + icon.setAttribute('symbolType', this._spec.icon.style?.symbolType ?? this._spec.icon.style?.shape); const iconBound = icon.AABBBounds; const iconHeight = iconBound?.y2 - iconBound?.y1 ?? 0; const iconWidth = iconBound?.x2 - iconBound?.x1 ?? 0; diff --git a/packages/vchart/src/theme/builtin/common/component/map-label.ts b/packages/vchart-extension/src/components/map-label/theme.ts similarity index 60% rename from packages/vchart/src/theme/builtin/common/component/map-label.ts rename to packages/vchart-extension/src/components/map-label/theme.ts index 8db858b209..d5200ce4b8 100644 --- a/packages/vchart/src/theme/builtin/common/component/map-label.ts +++ b/packages/vchart-extension/src/components/map-label/theme.ts @@ -1,7 +1,7 @@ -import type { IMapLabelTheme } from '../../../../component/map-label'; -import type { ITextMarkSpec } from '../../../../typings/visual'; +import type { IMapLabelStyleSpec } from './type'; +import type { ITextMarkSpec } from '@visactor/vchart'; -const getLabelTheme = (): { +const getLabelSpec = (): { visible?: boolean; style?: ITextMarkSpec; } => { @@ -11,18 +11,18 @@ const getLabelTheme = (): { textBaseline: 'middle', textAlign: 'left', fill: 'black', - fontSize: { type: 'token', key: 'l6FontSize' } + fontSize: 10 } }; }; -export const mapLabel: IMapLabelTheme = { +export const mapLabel: IMapLabelStyleSpec = { visible: true, offset: 12, position: 'top', space: 10, - nameLabel: getLabelTheme(), - valueLabel: getLabelTheme(), + nameLabel: getLabelSpec(), + valueLabel: getLabelSpec(), background: { visible: true, padding: { top: 4, bottom: 4, left: 6, right: 6 }, @@ -37,7 +37,7 @@ export const mapLabel: IMapLabelTheme = { visible: false, style: { lineWidth: 1, - stroke: 'red' + stroke: 'black' } } }; diff --git a/packages/vchart-extension/src/components/map-label/type.ts b/packages/vchart-extension/src/components/map-label/type.ts index 93956a839d..711abf3ef3 100644 --- a/packages/vchart-extension/src/components/map-label/type.ts +++ b/packages/vchart-extension/src/components/map-label/type.ts @@ -4,7 +4,7 @@ import type { IPathMarkSpec, IRectMarkSpec, ISymbolMarkSpec, ITextMarkSpec } fro export type LabelPosition = IOrientType | 'outer'; -export interface IMapLabelSpec extends IMapLabelTheme { +export interface IMapLabelSpec extends IMapLabelStyleSpec { /** 关联的系列 id */ seriesId: StringOrNumber; /** 名称文本的数据字段 */ @@ -22,7 +22,7 @@ export type IMapLabelNodes = 'nameLabel' | 'valueLabel' | 'icon' | 'labelBackgro export type MapLabelSceneNodeMap = Partial>; -export interface IMapLabelTheme { +export interface IMapLabelStyleSpec { /** 是否显示,默认 false */ visible?: boolean; /** 标签非 outer 位置下与标记点的间距 */ diff --git a/packages/vchart/src/component/index.ts b/packages/vchart/src/component/index.ts index 7c1cd9d552..f75fd2828a 100644 --- a/packages/vchart/src/component/index.ts +++ b/packages/vchart/src/component/index.ts @@ -10,8 +10,6 @@ import { DataZoom, registerDataZoom } from './data-zoom/data-zoom/data-zoom'; import { CustomMark, registerCustomMark } from './custom-mark/custom-mark'; import type { IBrushSpec, IBrushTheme } from './brush'; import { Brush, registerBrush } from './brush/brush'; -import type { IMapLabelSpec, IMapLabelTheme } from './map-label'; -import { MapLabelComponent, registerMapLabel } from './map-label/component'; import type { ICartesianLinearAxisSpec, ICartesianBandAxisSpec, @@ -88,7 +86,6 @@ export { DataZoom, CustomMark, Brush, - MapLabelComponent, CartesianAxis, CartesianBandAxis, CartesianLinearAxis, @@ -137,7 +134,6 @@ export { registerIndicator, registerLabel, registerTotalLabel, - registerMapLabel, registerMarkLine, registerMarkArea, registerMarkPoint, @@ -169,7 +165,6 @@ export type { IIndicatorSpec, ILabelSpec, ITotalLabelSpec, - IMapLabelSpec, IMarkAreaSpec, IMarkLineSpec, IStepMarkLineSpec, @@ -195,7 +190,6 @@ export type { IDataZoomTheme, IScrollBarTheme, IIndicatorTheme, - IMapLabelTheme, ITotalLabelTheme, ISizeLegendTheme, IColorLegendTheme, diff --git a/packages/vchart/src/component/map-label/component.ts b/packages/vchart/src/component/map-label/component.ts deleted file mode 100644 index 1a3ae6490c..0000000000 --- a/packages/vchart/src/component/map-label/component.ts +++ /dev/null @@ -1,451 +0,0 @@ -import type { IPadding, IRect, IOrientType } from '../../typings/space'; -import { DataView } from '@visactor/vdataset'; -import { BaseComponent } from '../base/base-component'; -// eslint-disable-next-line no-duplicate-imports -import { ComponentTypeEnum } from '../interface/type'; -import { LayoutZIndex } from '../../constant/layout'; -import type { IMapLabelSpec, MapLabelSceneNodeMap } from './interface'; -import type { ICartesianSeries, IGeoSeries } from '../../series/interface'; -import type { IPoint, Datum } from '../../typings'; -import type { IPairInfo } from './layout'; -// eslint-disable-next-line no-duplicate-imports -import { layoutByPosition, layoutOuter, placeRectByOrient } from './layout'; - -import { CompilableData } from '../../compile/data/compilable-data'; -import { normalizeLayoutPaddingSpec } from '../../util/space'; -import { MarkPoint } from '@visactor/vrender-components'; -import type { IGraphic, IGroup, INode, IRect as IRectGraphic } from '@visactor/vrender-core'; -import { createGroup, createRect, createSymbol, createText } from '@visactor/vrender-core'; -import { transformToGraphic } from '../../util/style'; -import type { Maybe } from '@visactor/vutils'; -// eslint-disable-next-line no-duplicate-imports -import { isValid } from '@visactor/vutils'; -import type { PanEventParam, ZoomEventParam } from '../../event/interface'; -import type { IModel, IModelSpecInfo } from '../../model/interface'; -import { Factory } from '../../core/factory'; -import { TransformLevel } from '../../data/initialize'; -import { getSpecInfo } from '../util'; - -export class MapLabelComponent extends BaseComponent { - static type = ComponentTypeEnum.mapLabel; - type = ComponentTypeEnum.mapLabel; - name: string = ComponentTypeEnum.mapLabel; - - static specKey = 'mapLabel'; - specKey = 'mapLabel'; - - layoutType: 'none' = 'none'; - - layoutZIndex = LayoutZIndex.MarkPoint; - - protected nameField: string; - protected valueField?: string; - - protected _series: ICartesianSeries | IGeoSeries; - protected _map: any[]; - protected _longitudeField: string; - protected _latitudeField: string; - - protected _markerComponents: MarkPoint[]; - - private _activeDatum: Datum[] = []; - - static getSpecInfo(chartSpec: any): Maybe { - return getSpecInfo(chartSpec, this.specKey, this.type, (s: IMapLabelSpec) => { - return s.visible && isValid(s.seriesId); - }); - } - - setAttrFromSpec(): void { - this.nameField = this._spec.nameField ?? this._series?.getDimensionField()[0]; - this.valueField = this._spec.valueField ?? this._series?.getMeasureField()[0]; - } - - created() { - super.created(); - if (!!this._spec.visible === false) { - return; - } - this.initRelatedInfo(); - this.initData(); - this.initEvent(); - } - - initRelatedInfo(): void { - this._series = this._option.getSeriesInUserIdOrIndex([this._spec.seriesId])[0] as ICartesianSeries; - if (this._spec.position === 'outer') { - // 需要获取region上的地理坐标系 - this._map = (this._regions[0].getSeriesInType('map')[0] as IGeoSeries)?.getMapViewData()?.latestData; - - this._longitudeField = this._regions[0].getSpec?.()?.longitudeField; - this._latitudeField = this._regions[0].getSpec?.()?.latitudeField; - } - } - - initData() { - const series = this._series; - if (!series) { - return; - } - const seriesData = series.getViewData(); - if (seriesData) { - const data = new DataView(this._option.dataSet, { name: `${this.name}_data` }); - data.parse([seriesData], { - type: 'dataview' - }); - data.transform({ type: 'copyDataView', level: TransformLevel.copyDataView }, false); - - this._data = new CompilableData(this._option, data); - data.target.addListener('change', () => { - if (this._spec.trigger !== 'hover' && this._spec.trigger !== 'click') { - this._activeDatum = this._data.getLatestData(); - } - }); - } - } - - initEvent() { - this.event.on('zoom', { filter: params => this._isRelativeModel(params.model) }, e => { - this.handleZoom(e as unknown as ZoomEventParam); - return true; - }); - - this.event.on('panmove', { filter: params => this._isRelativeModel(params.model) }, e => { - this.handlePan(e as unknown as PanEventParam); - return true; - }); - - const trigger = this._spec.trigger; - if (trigger === 'none') { - return; - } - - const view = this.getCompiler()?.getVGrammarView(); - - if (!view) { - return; - } - - if (trigger === 'hover') { - view.addEventListener('element-highlight:start', (params: any) => { - if (this._isRelativeSeries(params.options.seriesId)) { - this._updateDatum(params.elements[0].getDatum()); - } - }); - view.addEventListener('element-highlight:reset', (params: any) => { - if (this._isRelativeSeries(params.options.seriesId)) { - this._updateDatum(null); - } - }); - } else if (trigger === 'click') { - view.addEventListener('element-select:start', (params: any) => { - if (this._isRelativeSeries(params.options.seriesId)) { - this._updateDatum(params.elements[0].getDatum()); - } - }); - view.addEventListener('elementSelectReset', (params: any) => { - if (this._isRelativeSeries(params.options.seriesId)) { - this._updateDatum([]); - } - }); - } - } - - handlePan(e: PanEventParam) { - const { delta } = e; - this._markerComponents.forEach(marker => { - marker.translate(delta[0], delta[1]); - }); - } - - handleZoom(e: ZoomEventParam) { - this._updateMarkerLayoutAttribute(); - } - - private _updateDatum(datum: Datum[]) { - this._activeDatum = datum; - this._markerComponents.forEach((marker, index) => { - const markerDatum = this._data?.getLatestData()[index]; - if (this._activeDatum.includes(markerDatum)) { - marker.setAttribute('visible', true); - } else { - marker.setAttribute('visible', false); - } - }); - } - - dataToPosition(datum: any) { - return this._series.dataToPosition(datum); - } - - updateLayoutAttribute() { - const markData = this._data?.getLatestData(); - if (!markData || markData.length === 0) { - return; - } - super.updateLayoutAttribute(); - this._updateMarkerLayoutAttribute(); - } - - protected _updateMarkerLayoutAttribute() { - const layoutPairInfo: IPairInfo[] = []; - const markerMarks: MapLabelSceneNodeMap[] = []; - if (!this._markerComponents) { - this._markerComponents = this._data?.getLatestData().map((data: Datum, index: number) => { - const cmp = new MarkPoint({ - position: undefined, - animation: false // 地图标签使用的是markPoint, 暂不开启动画, 待优化@chensiji - }); - if (cmp) { - cmp.name = `${this.name}_marker_${index}`; - cmp.id = this._spec.id ?? `${this.name}_marker_${this.id}`; - cmp.setAttribute('zIndex', this.layoutZIndex); - } - return cmp; - }); - } - - const markerComponents = this._markerComponents; - markerComponents.forEach((marker, index) => { - marker.removeAllChild(); - const { pairInfo, contentMarks } = this._evaluateMarker(this._data.getLatestData()[index], index); - pairInfo && layoutPairInfo.push(pairInfo); - contentMarks && markerMarks.push(contentMarks); - }); - - const positionedRects = this._layoutLabels(layoutPairInfo); - this._layoutMarkers(positionedRects, markerMarks); - this._renderMarkers(); - } - - protected _evaluateMarker(data: Datum, index: number) { - let contentItemCount = 0; - let paddingWidth = 0; - let paddingHeight = 0; - let contentWidth = 0; - let contentHeight = 0; - - const position = this._spec.position || 'top'; - const offset = this._spec.offset; - - const padding = normalizeLayoutPaddingSpec(this._spec.background?.padding) as IPadding; - const space = this._spec.space || 0; - paddingWidth += (padding?.left || 0) + (padding?.right || 0); - paddingHeight += (padding?.top || 0) + (padding?.bottom || 0); - - const contentMarks: MapLabelSceneNodeMap = {}; - const positionAttr = this.dataToPosition(data); - - const container = createGroup({}); - container.name = `${this.name}_marker_itemContainer_${index}`; - contentMarks.container = container; - - if (this._spec.background?.visible) { - const labelBackground = createRect(transformToGraphic({ ...this._spec.background.style })); - labelBackground.setAttributes(positionAttr); - contentMarks.labelBackground = labelBackground; - container.appendChild(labelBackground); - } - - if (this._spec.icon?.visible) { - const icon = createSymbol(transformToGraphic({ ...this._spec.icon.style })); - icon.setAttributes(positionAttr); - icon.setAttribute('symbolType', this._spec.icon.style?.shape); - const iconBound = icon.AABBBounds; - const iconHeight = iconBound?.y2 - iconBound?.y1 ?? 0; - const iconWidth = iconBound?.x2 - iconBound?.x1 ?? 0; - contentMarks.icon = icon; - container.appendChild(icon); - - contentHeight = iconHeight; - contentWidth += iconWidth; - contentItemCount++; - } - - if (this._spec.nameLabel?.visible) { - const nameLabel = createText(transformToGraphic({ ...this._spec.nameLabel.style })); - nameLabel.setAttributes(positionAttr); - nameLabel.setAttribute('text', data[this.nameField]); - const nameLabelBound = nameLabel.AABBBounds; - const nameLabelHeight = nameLabelBound?.y2 - nameLabelBound?.y1 ?? 0; - const nameLabelWidth = nameLabelBound?.x2 - nameLabelBound?.x1 ?? 0; - contentMarks.nameLabel = nameLabel; - container.appendChild(nameLabel); - - contentHeight = Math.max(contentHeight, nameLabelHeight); - contentWidth += nameLabelWidth; - contentItemCount++; - } - - if (this._spec.valueLabel?.visible && isValid(data[this.valueField])) { - const valueLabel = createText(transformToGraphic({ ...this._spec.valueLabel.style })); - valueLabel.setAttributes(positionAttr); - valueLabel.setAttribute('text', data[this.valueField]); - const valueLabelBound = valueLabel.AABBBounds; - const valueLabelHeight = valueLabelBound?.y2 - valueLabelBound?.y1 ?? 0; - const valueLabelWidth = valueLabelBound?.x2 - valueLabelBound?.x1 ?? 0; - contentMarks.valueLabel = valueLabel; - container.appendChild(valueLabel); - - contentHeight = Math.max(contentHeight, valueLabelHeight); - contentWidth += valueLabelWidth; - contentItemCount++; - } - - const firstValidMark = Object.values(contentMarks).find(m => !!m && m.type !== 'group'); - - const anchor: IPoint = { - x: firstValidMark?.getComputedAttribute('x'), - y: firstValidMark?.getComputedAttribute('y') - }; - const itemRect = { - x: anchor.x, - y: anchor.y, - width: 0, - height: 0 - }; - - itemRect.width = paddingWidth + contentWidth + (contentItemCount - 1) * space; - itemRect.height = paddingHeight + contentHeight; - - const pairInfo: IPairInfo = { - rect: itemRect, - point: anchor, - index - }; - // 计算得到最终所有元素包围盒的布局位置 - if (position !== 'outer') { - const anchors = ['top', 'right', 'left', 'bottom'].filter(a => a !== position); - pairInfo.rect = placeRectByOrient(itemRect, position, offset); - pairInfo.anchors = anchors as IOrientType[]; - pairInfo.offset = offset; - } else { - pairInfo.pointCoord = { - x: +data?.[this._longitudeField], - y: +data?.[this._latitudeField] - }; - } - return { pairInfo, contentMarks }; - } - - protected _layoutMarkers(positionedRects: IRect[], contentMarks: MapLabelSceneNodeMap[]) { - for (let i = 0; i < contentMarks.length; i++) { - if (!positionedRects[i] || !contentMarks[i]) { - return; - } - const { icon, nameLabel, valueLabel, labelBackground, container } = contentMarks[i]; - - const itemRect = positionedRects[i]; - const padding = normalizeLayoutPaddingSpec(this._spec.background?.padding) as IPadding; - const space = this._spec.space || 0; - - const curY = itemRect.height / 2; - let curX = padding?.left || 0; - [icon, nameLabel, valueLabel].forEach((item, index) => { - if (item) { - const bounds = item.AABBBounds; - let offset = 0; - if (item.type === 'symbol') { - // 文字的锚点在文字左侧,baseline在中心 - // symbol的锚点[0,0]在图形中心。所以x方向要偏移半个bound。 - offset += (bounds.x2 - bounds.x1 ?? 0) / 2; - } - item.setAttributes({ - x: curX + offset, - y: curY - }); - - curX += bounds.x2 - bounds.x1 ?? 0; - if (index !== 2) { - curX += space; - } - } - }); - (labelBackground as IRectGraphic)?.setAttributes({ - x: 0, - y: 0, - width: itemRect.width, - height: itemRect.height - }); - container?.setAttributes({ - dx: -itemRect.width / 2, - dy: -itemRect.height / 2 - }); - const datum = this._data.getLatestData()[i]; - const anchor = this.dataToPosition(datum); - const regionPos = this.getRegions()[0].getLayoutStartPoint(); - const showLeader = !!(this._spec.leader?.visible && (icon || nameLabel || valueLabel)); - this._markerComponents[i].setAttributes({ - x: regionPos.x, - y: regionPos.y, - position: anchor, - visible: this._activeDatum.includes(datum), - itemContent: { - refX: 0, - type: 'custom', - renderCustomCallback: () => container as unknown as IGroup, - autoRotate: false, - offsetX: itemRect.x + itemRect.width / 2 - anchor.x, - offsetY: itemRect.y + itemRect.height / 2 - anchor.y - }, - itemLine: { - visible: showLeader, - type: 'type-po', - lineStyle: transformToGraphic({ ...this._spec.leader?.style }), - startSymbol: { visible: false } - } - }); - } - } - - protected _renderMarkers() { - if (!this._markerComponents || !this._markerComponents.length) { - return; - } - - for (let i = 0; i < this._markerComponents.length; i++) { - this.getContainer().add(this._markerComponents[i] as unknown as INode); - } - } - - protected _layoutLabels(rects: IPairInfo[]) { - const result = - this._spec.position === 'outer' && this._map - ? layoutOuter(rects, this._map, (coord: number[]) => - this._series.dataToPosition({ - [this._longitudeField]: coord[0], - [this._latitudeField]: coord[1] - }) - ) - : layoutByPosition(rects); - - return result; - } - - private _isRelativeModel(model: IModel) { - const id = - (this._series as ICartesianSeries).getXAxisHelper()?.getAxisId() ?? - (this._series as IGeoSeries).getCoordinateHelper()?.getCoordinateId(); - return model?.id === id; - } - - private _isRelativeSeries(model: IModel) { - return model?.id === this._series.id; - } - - onRender(ctx: any): void { - // do nothing - } - - changeRegions(/** regions: IRegion[] */): void { - // do nothing - } - - protected _getNeedClearVRenderComponents(): IGraphic[] { - return this._markerComponents as unknown as IGroup[]; - } -} - -export const registerMapLabel = () => { - Factory.registerComponent(MapLabelComponent.type, MapLabelComponent); -}; diff --git a/packages/vchart/src/component/map-label/index.ts b/packages/vchart/src/component/map-label/index.ts deleted file mode 100644 index 7cc2184efb..0000000000 --- a/packages/vchart/src/component/map-label/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * @description 地图扩展 label 组件 - * @todo 待后续 vchart 整体稳定后再拆出 - */ -export * from './component'; -export * from './interface'; diff --git a/packages/vchart/src/component/map-label/interface.ts b/packages/vchart/src/component/map-label/interface.ts deleted file mode 100644 index 8d85516b34..0000000000 --- a/packages/vchart/src/component/map-label/interface.ts +++ /dev/null @@ -1,63 +0,0 @@ -import type { IGraphic } from '@visactor/vrender-core'; -import type { IPadding, IOrientType, StringOrNumber } from '../../typings'; -import type { IPathMarkSpec, IRectMarkSpec, ISymbolMarkSpec, ITextMarkSpec } from '../../typings/visual'; -import type { IModelSpec } from '../../model/interface'; - -export type LabelPosition = IOrientType | 'outer'; - -export interface IMapLabelSpec extends IMapLabelTheme, Pick { - /** 关联的系列 id */ - seriesId: StringOrNumber; - /** 名称文本的数据字段 */ - nameField?: string; - /** 数值文本的数据字段 */ - valueField?: string; - /** - * 交互触发类型 - * @default 'none' - */ - trigger?: 'hover' | 'click' | 'none'; -} - -export type IMapLabelNodes = 'nameLabel' | 'valueLabel' | 'icon' | 'labelBackground' | 'container'; - -export type MapLabelSceneNodeMap = Partial>; - -export interface IMapLabelTheme { - /** 是否显示,默认 false */ - visible?: boolean; - /** 标签非 outer 位置下与标记点的间距 */ - offset?: number; - /** - * icon/label之间的距离 - */ - space?: number; - /** 标签位置 */ - position?: LabelPosition; - /** 名称文本样式设置 */ - nameLabel?: { - visible?: boolean; - style?: ITextMarkSpec; - }; - /** 数值文本样式设置 */ - valueLabel?: { - visible?: boolean; - style?: ITextMarkSpec; - }; - /** 图标样式设置 */ - icon?: { - visible?: boolean; - style?: ISymbolMarkSpec; - }; - /** 背景样式设置 */ - background?: { - visible?: boolean; - padding?: IPadding; - style?: IRectMarkSpec; - }; - /** 引导线样式设置 */ - leader?: { - visible?: boolean; - style?: IPathMarkSpec; - }; -} diff --git a/packages/vchart/src/component/map-label/layout.ts b/packages/vchart/src/component/map-label/layout.ts deleted file mode 100644 index c2d3e34be3..0000000000 --- a/packages/vchart/src/component/map-label/layout.ts +++ /dev/null @@ -1,303 +0,0 @@ -import type { Feature } from '@visactor/vutils'; -import { isPointInPolygon, destination, getAABBFromPoints } from '@visactor/vutils'; -import type { IRect, IOrientType, IPoint } from '../../typings'; - -type IBound = { - x1: number; - x2: number; - y1: number; - y2: number; -}; -export interface IPairInfo { - /** 矩形信息 */ - rect: IRect; - /** 对应点的画布坐标 */ - point: IPoint; - /** 对应点的经纬度坐标 */ - pointCoord?: IPoint; - /** 基于锚点的可放置位置 */ - anchors?: IOrientType[]; - /** 距离锚点的位置偏移量 */ - offset?: number; - /** 原始顺序 */ - index: number; -} - -function overlap(a: T, b: T, sep: number = 0) { - return sep > Math.max(b.x1 - a.x2, a.x1 - b.x2, b.y1 - a.y2, a.y1 - b.y2); -} - -export function bound(rect: IRect): IBound { - return { - x1: rect.x, - x2: rect.x + rect.width, - y1: rect.y, - y2: rect.y + rect.height - }; -} - -function toRect(bound: IBound): IRect { - return { - x: bound.x1, - y: bound.y1, - width: bound.x2 - bound.x1, - height: bound.y2 - bound.y1 - }; -} - -/** - * 根据可选位置进行躲避布局 - * @param pairs - * @returns - */ -export function layoutByPosition(pairs: IPairInfo[]): IRect[] { - if (!pairs || pairs.length === 0) { - return []; - } - - // 只有一个无需布局 - if (pairs.length === 1) { - return [pairs[0].rect]; - } - - const _pairs = pairs.map(pair => { - return { - ...pair, - bound: bound(pair.rect), - anchorCandidates: candidatesByOrient(pair.anchors ?? [], pair.point!, pair.rect, pair.offset) - }; - }); - - const resultBound: IBound[] = []; - // 默认布局第一个 - resultBound.push(_pairs[0].bound); - - for (let i = 1; i <= _pairs.length - 1; i++) { - const curPair = _pairs[i]; - const curBound = curPair.bound; - // 遍历检测 - let isOverlap = resultBound.some(r => overlap(r, curBound)); - if (!curPair.anchorCandidates) { - continue; - } - if (isOverlap && curPair.anchorCandidates?.length > 0) { - for (let j = 0; j < curPair.anchorCandidates.length; j++) { - const anchor = curPair.anchorCandidates[j]; - const newBound = { - x1: anchor.x, - y1: anchor.y, - x2: anchor.x + curBound.x2 - curBound.x1, - y2: anchor.y + curBound.y2 - curBound.y1, - anchor - }; - if (!resultBound.some(r => overlap(r, newBound))) { - resultBound.push(newBound); - isOverlap = false; - break; - } - } - if (isOverlap) { - // 所有候选位置都放不下 - resultBound.push(curPair.bound); - } - } else { - resultBound.push(curPair.bound); - } - } - - return resultBound.map(bound => toRect(bound)); -} - -export function layoutOuter( - pairs: IPairInfo[], - features: Feature[], - dataToPosition: (coord: number[]) => IPoint | null -): IRect[] { - // 1. 计算包围圆 - const _points = pairs.map(rect => rect.pointCoord); - const { x1, x2, y1, y2 } = getAABBFromPoints(_points); - const geoCenter = [(x1 + x2) / 2, (y1 + y2) / 2]; - const centerPosition = dataToPosition(geoCenter); - - if (!centerPosition) { - return []; - } - - // 2. 遍历每个rect - // anchor与圆心的交点方向,尝试寻找不在地图区域内部的新锚点 - const result = pairs.map(pair => { - const rect = pair.rect; - const targetPoint = !isPointWithinFeatures(features, pair.pointCoord!) - ? pair.point - : dataToPosition( - nearestPoint( - features, - [pair.pointCoord!.x, pair.pointCoord!.y], - uniformDegree(lineDegree(pair.point!, centerPosition)) - ) - ); - - if (targetPoint) { - rect.x = targetPoint.x; - rect.y = targetPoint.y; - } - // 3. 根据finalAnchor在包围圆上的位置,调整rect的位置 - // 将圆根据圆心角划分为4个区域,对应不同的position - - const degree = uniformDegree(lineDegree(pair.point!, centerPosition)); - - let position: IOrientType; - const anchors: IOrientType[] = []; - if (degree >= -45 && degree < 45) { - position = 'top'; - anchors.push('left', 'right'); - } else if (degree >= 45 && degree < 135) { - position = 'right'; - } else if (degree >= -135 && degree < -45) { - position = 'left'; - anchors.push('left'); - } else { - position = 'bottom'; - anchors.push('left', 'right'); - } - pair.anchors = anchors; - pair.offset = 20; - pair.rect = placeRectByOrient(pair.rect, position, 0); - return pair; - }); - - return layoutByPosition(result); -} - -export function layoutOuter2( - pairs: IPairInfo[], - features: Feature[], - dataToPosition: (coord: number[]) => IPoint | null -): IRect[] { - // 1. 计算几何中心 - let x = 0; - let y = 0; - for (let i = 0; i < pairs.length; i++) { - x += pairs[i].pointCoord.x; - y += pairs[i].pointCoord.y; - } - x /= pairs.length; - y /= pairs.length; - const centerPosition = dataToPosition([x, y]); - if (!centerPosition) { - return []; - } - - const count = pairs.length; - - // 2. 按照圆心角排序 - pairs.sort((a, b) => { - return lineDegree(centerPosition, a.point) - lineDegree(centerPosition, b.point); - }); - - const result = pairs.map((pair, index) => { - let degree = (360 / count) * index; - const _degree = lineDegree(centerPosition, pair.point); - degree = uniformDegree((degree + _degree) / 2); - const targetPoint = !isPointWithinFeatures(features, pair.pointCoord) - ? pair.point - : dataToPosition(nearestPoint(features, [pair.pointCoord.x, pair.pointCoord.y], degree)); - if (targetPoint) { - pair.rect.x = targetPoint.x; - pair.rect.y = targetPoint.y; - } - // 3. 根据finalAnchor在包围圆上的位置,调整rect的位置 - // 将圆根据圆心角划分为4个区域,对应不同的position - let position: IOrientType; - const anchors: IOrientType[] = []; - if (degree >= -45 && degree < 45) { - position = 'top'; - anchors.push('left', 'right'); - } else if (degree >= 45 && degree < 135) { - position = 'right'; - } else if (degree >= -135 && degree < -45) { - position = 'left'; - anchors.push('left'); - } else { - position = 'bottom'; - anchors.push('left', 'right'); - } - - pair.anchors = anchors; - pair.offset = 20; - pair.rect = placeRectByOrient(pair.rect, position, 0); - return pair; - }); - - return layoutByPosition(result.sort((a, b) => a.index - b.index)); -} - -function uniformDegree(degree: number) { - return degree > 180 ? degree - 360 : degree; -} - -function lineDegree(start: IPoint, end: IPoint) { - return (Math.atan2(start.y - end.y, start.x - end.x) * 180) / Math.PI + 90; -} - -function nearestPoint(features: Feature[], origin: number[], bearing: number, distance = 200) { - const count = 5621 / distance; - let curOrigin = origin; - for (let i = 1; i <= count; i++) { - const dest = destination(curOrigin as unknown as IPoint, distance, bearing); - if (!isPointWithinFeatures(features, dest)) { - return [dest.x, dest.y]; - } - curOrigin = [dest.x, dest.y]; - } - return origin; -} - -function isPointWithinFeatures(features: Feature[], p: IPoint) { - for (let i = 0; i < features.length; i++) { - const inside = isPointInPolygon(p, features[i] as any); - if (inside) { - return true; - } - } - return false; -} - -/** - * 以rect左上角为锚点的,根据position位置调整rect布局。 - * @param rect - * @param position 在锚点的四周位置,'top' | 'bottom' | 'left' | 'right' - * @param offset rect与锚点间的距离 - * @returns - */ -export function placeRectByOrient(rect: IRect, position: IOrientType, offset: number = 0) { - const result: IRect = { ...rect }; - if (position === 'top') { - result.x -= rect.width / 2; - result.y -= offset + rect.height / 2; - } else if (position === 'bottom') { - result.x -= rect.width / 2; - result.y += offset - rect.height / 2; - } else if (position === 'left') { - result.x -= offset + rect.width; - result.y -= rect.height / 2; - } else if (position === 'right') { - result.x += offset; - result.y -= rect.height / 2; - } - return result; -} - -export function candidatesByOrient( - positions: IOrientType[], - anchor: IPoint, - rect: Pick, - offset = 0 -) { - const candidates: IPoint[] = []; - positions.forEach((p: IOrientType) => { - const { x, y } = placeRectByOrient({ ...anchor, width: rect.width, height: rect.height }, p, offset); - candidates.push({ x, y }); - }); - return candidates; -} diff --git a/packages/vchart/src/core/index.ts b/packages/vchart/src/core/index.ts index 72947f8e45..dc35e74187 100644 --- a/packages/vchart/src/core/index.ts +++ b/packages/vchart/src/core/index.ts @@ -32,6 +32,7 @@ export { TransformLevel } from '../data/initialize'; * spec */ export * from '../typings/spec/index'; +export * from '../typings/visual'; // tooltip export * from '../typings/tooltip'; diff --git a/packages/vchart/src/theme/builtin/common/component/index.ts b/packages/vchart/src/theme/builtin/common/component/index.ts index 5157248ca2..7d156d41d1 100644 --- a/packages/vchart/src/theme/builtin/common/component/index.ts +++ b/packages/vchart/src/theme/builtin/common/component/index.ts @@ -11,7 +11,6 @@ import { indicator } from './indicator'; import { colorLegend } from './legend/color-legend'; import { discreteLegend } from './legend/discrete-legend'; import { sizeLegend } from './legend/size-legend'; -import { mapLabel } from './map-label'; import { markArea } from './mark-area'; import { markLine } from './mark-line'; import { markPoint } from './mark-point'; @@ -48,7 +47,6 @@ export const component: IComponentTheme = { brush, indicator, title, - mapLabel, poptip, totalLabel, scrollBar From 48e4ca4bfc83952da555eec98b110c80b524cad6 Mon Sep 17 00:00:00 2001 From: xiaoluoHe Date: Mon, 30 Dec 2024 14:41:01 +0800 Subject: [PATCH 3/5] docs: add guide for mapLabel --- .../Chart_Extensions/map_label.md | 322 ++++++++++++++++++ docs/assets/guide/menu.json | 7 + .../Chart_Extensions/map_label.md | 322 ++++++++++++++++++ .../vchart/guide/extension/map-label.png | Bin 0 -> 214153 bytes .../browser/test-page/map-label/map-label.ts | 8 +- .../src/components/map-label/type.ts | 20 +- 6 files changed, 670 insertions(+), 9 deletions(-) create mode 100644 docs/assets/guide/en/tutorial_docs/Chart_Extensions/map_label.md create mode 100644 docs/assets/guide/zh/tutorial_docs/Chart_Extensions/map_label.md create mode 100644 docs/public/vchart/guide/extension/map-label.png diff --git a/docs/assets/guide/en/tutorial_docs/Chart_Extensions/map_label.md b/docs/assets/guide/en/tutorial_docs/Chart_Extensions/map_label.md new file mode 100644 index 0000000000..f2cb0bfb77 --- /dev/null +++ b/docs/assets/guide/en/tutorial_docs/Chart_Extensions/map_label.md @@ -0,0 +1,322 @@ +# Map Label Component In Scatter Map + +The scatter map label component is an unconventional map label layout method. The labels are in the form of the [MarkPoint component](/vchart/guide/tutorial_docs/Chart_Concepts/marker), and are laid out around the perimeter of the map as much as possible. Currently, it is only recommended for use with maps of China. + +![img](/vchart/guide/extension/map-label.png) + +## How to Use This Component + +The scatter map is supported by default in VChart and can be implemented through the composite chart (Common Chart). + +```js +const spec = { + type: 'common', + padding: 50, + region: [ + { + roam: true, + coordinate: 'geo', + longitudeField: 'lon', + latitudeField: 'lat' + } + ], + series: [ + { + type: 'map', + map: 'china', + nameField: 'name', + valueField: 'value', + seriesField: 'name', + }, + { + regionIndex: 0, + id: 'scatter', + type: 'scatter', + data: { + values: [ + ... + ] + }, + xField: 'name', + yField: 'value', + } + ] + }; +``` + +The map label component needs to be registered on the chart. The registration and usage are as follows: + +```js +import VChart from '@visactor/vchart'; +import { registerMapLabel } from '@visactor/vchart-extension'; + +const spec = { + // your spec + type: 'common', + ..., + mapLabel: { + visible: true, + position: 'outer', + seriesId: 'scatter', + nameField: 'name', + valueField: 'value', + space: 6, + nameLabel: {}, + valueLabel: {}, + leader: {}, + background: {} + } +}; +registerMapLabel(); + +const vchart = new VChart(spec, { dom: 'chart' }); +vchart.renderSync(); +``` + +If using the CDN import method, the registration method is as follows: + +```html + + + +``` + +## Related Configuration Options + +```ts +export interface IMapLabelSpec extends IMapLabelStyleSpec { + /** Associated series ID */ + seriesId: StringOrNumber; + /** Data field for the name text */ + nameField?: string; + /** Data field for the value text */ + valueField?: string; + /** + * Interaction trigger type + * @default 'none' + */ + trigger?: 'hover' | 'click' | 'none'; +} + +export interface IMapLabelStyleSpec { + /** + * Whether to display + * @default false + */ + visible?: boolean; + /** + * The spacing between the label and the marker point when the label position is not 'outer' + * @default 12 + */ + offset?: number; + /** + * The distance between the icon and the label + * @default 10 + */ + space?: number; + /** + * Label position. Supports 'left' | 'top' | 'right' | 'bottom' | 'outer' + * @default 'top' + */ + position?: LabelPosition; + /** Settings for the name text style */ + nameLabel?: { + visible?: boolean; + style?: ITextMarkSpec; + }; + /** Settings for the value text style */ + valueLabel?: { + visible?: boolean; + style?: ITextMarkSpec; + }; + /** Icon style settings */ + icon?: { + visible?: boolean; + style?: ISymbolMarkSpec; + }; + /** Background style settings */ + background?: { + /** @default true */ + visible?: boolean; + /** Background frame padding */ + padding?: IPadding; + style?: IRectMarkSpec; + }; + /** Leader line style settings */ + leader?: { + visible?: boolean; + style?: IPathMarkSpec; + }; +} +``` + +## Example + +```javascript livedemo +const spec = { + type: 'common', + padding: 50, + region: [ + { + roam: true, + coordinate: 'geo', + longitudeField: 'lon', + latitudeField: 'lat' + } + ], + mapLabel: { + visible: true, + position: 'outer', + seriesId: 'scatter', + nameField: 'name', + valueField: 'value', + space: 6, + icon: { + visible: true, + style: { + size: 20, + dx: -8, + dy: -10, + fill: 'red', + symbolType: `` + } + }, + nameLabel: { + style: { fill: '#1677ff' } + }, + valueLabel: { + style: { fill: '#1677ff' } + }, + leader: { + visible: true, + style: { stroke: '#1677ff' } + }, + background: { + style: { + fill: '#e6f4ff', + stroke: '#1677ff' + } + } + }, + series: [ + { + type: 'map', + map: 'china', + nameField: 'name', + valueField: 'value', + seriesField: 'name', + nameMap: { + 广东省: '广东', + 江苏省: '江苏', + 山东省: '山东', + 河南省: '河南', + 河北省: '河北', + 浙江省: '浙江', + 四川省: '四川', + 安徽省: '安徽', + 辽宁省: '辽宁', + 陕西省: '陕西', + 山西省: '山西', + 湖北省: '湖北', + 北京市: '北京', + 湖南省: '湖南', + 黑龙江省: '黑龙江', + 福建省: '福建', + 内蒙古自治区: '内蒙古', + 云南省: '云南', + 江西省: '江西', + 重庆市: '重庆', + 上海市: '上海', + 贵州省: '贵州', + 吉林省: '吉林', + 天津市: '天津', + 广西壮族自治区: '广西', + 甘肃省: '甘肃', + 新疆维吾尔自治区: '新疆', + 宁夏回族自治区: '宁夏', + 海南省: '海南', + 青海省: '青海', + 西藏自治区: '西藏', + 香港特别行政区: '中国香港', + 台湾省: '中国台湾', + 澳门特别行政区: '澳门' + }, + area: { + style: { + fill: '#E9F2FF', + stroke: 'grey', + lineWidth: 1 + } + } + }, + { + regionIndex: 0, + id: 'scatter', + type: 'scatter', + data: { + values: [ + { + name: '乌鲁木齐', + value: '2197', + lat: '43.50', + lon: '87.37' + }, + { + name: '济南', + value: '2197', + lat: '36.606472', + lon: '117.164382' + }, + { + name: '江苏', + value: '21197', + lat: '32.983908', + lon: '119.486395' + }, + { + name: '成都', + value: '21197', + lat: '30.659462', + lon: '104.065735' + } + ] + }, + xField: 'name', + yField: 'value', + point: { + style: { + fill: '#1677ff', + outerBorder: { + distance: 2, + lineWidth: 3, + strokeOpacity: 0.2 + }, + fillOpacity: 1, + size: 10 + } + } + } + ] +}; + +const mapURL = 'https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json'; +const res = await fetch(mapURL); +const geojson = await res.json(); +VChart.registerMap('china', geojson, { + rewind: true +}); + +VChartExtension.registerMapLabel(); +const vchart = new VChart(spec, { dom: CONTAINER_ID }); +vchart.renderSync(); +// Just for the convenience of console debugging, DO NOT COPY! +window['vchart'] = vchart; +``` diff --git a/docs/assets/guide/menu.json b/docs/assets/guide/menu.json index f0d7c6ea29..55b08a47c7 100644 --- a/docs/assets/guide/menu.json +++ b/docs/assets/guide/menu.json @@ -898,6 +898,13 @@ "zh": "转化率漏斗图", "en": "Conversion Funnel" } + }, + { + "path": "map_label", + "title": { + "zh": "地图标签组件", + "en": "Map Label" + } } ] } diff --git a/docs/assets/guide/zh/tutorial_docs/Chart_Extensions/map_label.md b/docs/assets/guide/zh/tutorial_docs/Chart_Extensions/map_label.md new file mode 100644 index 0000000000..fb69e28d50 --- /dev/null +++ b/docs/assets/guide/zh/tutorial_docs/Chart_Extensions/map_label.md @@ -0,0 +1,322 @@ +# 散点地图标签组件 + +散点地图标签组件是一种非常规的地图标签布局方式,标签是 [MarkPoint 组件](/vchart/guide/tutorial_docs/Chart_Concepts/marker) 的形式,尽可能围绕在地图周边布局。目前只推荐在中国地图中使用。 + +![img](/vchart/guide/extension/map-label.png) + +## 如何使用该组件 + +散点地图是 VChart 默认支持的,可以通过组合图(Common Chart)实现。 + +```js +const spec = { + type: 'common', + padding: 50, + region: [ + { + roam: true, + coordinate: 'geo', + longitudeField: 'lon', + latitudeField: 'lat' + } + ], + series: [ + { + type: 'map', + map: 'china', + nameField: 'name', + valueField: 'value', + seriesField: 'name', + }, + { + regionIndex: 0, + id: 'scatter', + type: 'scatter', + data: { + values: [ + ... + ] + }, + xField: 'name', + yField: 'value', + } + ] + }; +``` + +散点地图标签组件需要在图表上注册,注册和使用方式如下: + +```js +import VChart from '@visactor/vchart'; +import { registerMapLabel } from '@visactor/vchart-extension'; + +const spec = { + // your spec + type: 'common', + ..., + mapLabel: { + visible: true, + position: 'outer', + seriesId: 'scatter', + nameField: 'name', + valueField: 'value', + space: 6, + nameLabel: {}, + valueLabel: {}, + leader: {}, + background: {} + } +}; +registerMapLabel(); + +const vchart = new VChart(spec, { dom: 'chart' }); +vchart.renderSync(); +``` + +如果是通过 cdn 引入的方式,注册方式如下: + +```html + + + +``` + +## 相关配置项 + +```ts +export interface IMapLabelSpec extends IMapLabelStyleSpec { + /** 关联的系列 id */ + seriesId: StringOrNumber; + /** 名称文本的数据字段 */ + nameField?: string; + /** 数值文本的数据字段 */ + valueField?: string; + /** + * 交互触发类型 + * @default 'none' + */ + trigger?: 'hover' | 'click' | 'none'; +} + +export interface IMapLabelStyleSpec { + /** + * 是否显示 + * @default false + */ + visible?: boolean; + /** + * 标签非 outer 位置下与标记点的间距 + * @default 12 + */ + offset?: number; + /** + * icon 和 label之间的距离 + * @default 10 + */ + space?: number; + /** + * 标签位置。支持 'left' | 'top' | 'right' | 'bottom' | 'outer' + * @default 'top' + */ + position?: LabelPosition; + /** 名称文本样式设置 */ + nameLabel?: { + visible?: boolean; + style?: ITextMarkSpec; + }; + /** 数值文本样式设置 */ + valueLabel?: { + visible?: boolean; + style?: ITextMarkSpec; + }; + /** 图标样式设置 */ + icon?: { + visible?: boolean; + style?: ISymbolMarkSpec; + }; + /** 背景样式设置 */ + background?: { + /** @default true */ + visible?: boolean; + /** 背景框边距 */ + padding?: IPadding; + style?: IRectMarkSpec; + }; + /** 引导线样式设置 */ + leader?: { + visible?: boolean; + style?: IPathMarkSpec; + }; +} +``` + +## 示例 + +```javascript livedemo +const spec = { + type: 'common', + padding: 50, + region: [ + { + roam: true, + coordinate: 'geo', + longitudeField: 'lon', + latitudeField: 'lat' + } + ], + mapLabel: { + visible: true, + position: 'outer', + seriesId: 'scatter', + nameField: 'name', + valueField: 'value', + space: 6, + icon: { + visible: true, + style: { + size: 20, + dx: -8, + dy: -10, + fill: 'red', + symbolType: `` + } + }, + nameLabel: { + style: { fill: '#1677ff' } + }, + valueLabel: { + style: { fill: '#1677ff' } + }, + leader: { + visible: true, + style: { stroke: '#1677ff' } + }, + background: { + style: { + fill: '#e6f4ff', + stroke: '#1677ff' + } + } + }, + series: [ + { + type: 'map', + map: 'china', + nameField: 'name', + valueField: 'value', + seriesField: 'name', + nameMap: { + 广东省: '广东', + 江苏省: '江苏', + 山东省: '山东', + 河南省: '河南', + 河北省: '河北', + 浙江省: '浙江', + 四川省: '四川', + 安徽省: '安徽', + 辽宁省: '辽宁', + 陕西省: '陕西', + 山西省: '山西', + 湖北省: '湖北', + 北京市: '北京', + 湖南省: '湖南', + 黑龙江省: '黑龙江', + 福建省: '福建', + 内蒙古自治区: '内蒙古', + 云南省: '云南', + 江西省: '江西', + 重庆市: '重庆', + 上海市: '上海', + 贵州省: '贵州', + 吉林省: '吉林', + 天津市: '天津', + 广西壮族自治区: '广西', + 甘肃省: '甘肃', + 新疆维吾尔自治区: '新疆', + 宁夏回族自治区: '宁夏', + 海南省: '海南', + 青海省: '青海', + 西藏自治区: '西藏', + 香港特别行政区: '中国香港', + 台湾省: '中国台湾', + 澳门特别行政区: '澳门' + }, + area: { + style: { + fill: '#E9F2FF', + stroke: 'grey', + lineWidth: 1 + } + } + }, + { + regionIndex: 0, + id: 'scatter', + type: 'scatter', + data: { + values: [ + { + name: '乌鲁木齐', + value: '2197', + lat: '43.50', + lon: '87.37' + }, + { + name: '济南', + value: '2197', + lat: '36.606472', + lon: '117.164382' + }, + { + name: '江苏', + value: '21197', + lat: '32.983908', + lon: '119.486395' + }, + { + name: '成都', + value: '21197', + lat: '30.659462', + lon: '104.065735' + } + ] + }, + xField: 'name', + yField: 'value', + point: { + style: { + fill: '#1677ff', + outerBorder: { + distance: 2, + lineWidth: 3, + strokeOpacity: 0.2 + }, + fillOpacity: 1, + size: 10 + } + } + } + ] +}; + +const mapURL = 'https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json'; +const res = await fetch(mapURL); +const geojson = await res.json(); +VChart.registerMap('china', geojson, { + rewind: true +}); + +VChartExtension.registerMapLabel(); +const vchart = new VChart(spec, { dom: CONTAINER_ID }); +vchart.renderSync(); +// Just for the convenience of console debugging, DO NOT COPY! +window['vchart'] = vchart; +``` diff --git a/docs/public/vchart/guide/extension/map-label.png b/docs/public/vchart/guide/extension/map-label.png new file mode 100644 index 0000000000000000000000000000000000000000..9033a17ed87b45bf2b89a01b7d3604014fdd1494 GIT binary patch literal 214153 zcmeFZXI#_S_C1`00HFy;6)91qDn$j99xU_@0@4-fU8>XsRIpG~Ksu3*NDW1)K|xeH z(gM;%dhZ>c!`vBX{+GG$o|ivoK29bH=X=U7Yp=ZyPc+pPsK{B!ArJ_alHv_*2!we*lby?8)zO~RradB}W;Y&i7E(w5d2)I3P za=+s(;N-^npF#c_=Z2-5#eG{BcUxyClk^p(y#)I!tm}8_;WQ`+^xywd ztj5Q7l}D1CMMGc+ofJ*FOH=HvDyd zX-((KjkdIK|LXA0UDg5Yp^`gK;97utV{PXly-e?9$E?kuvdoM(TX`uRbM`s@-D?nx z>JhlAx6OQUe3EztudVYmG#Tr0vz(Bqe1)5@4&G9#4%1bg`oy7Sj;f>VBx_iLYjMG8 zLNfq7GDv3Re{>uk>FQyHYil>&u^x6;y{auPBGA8Z)FN37ZqioTsYp8f$Z$e9h#>qsHhvD7xGM#T4V+5S3Yb9S`v{OA*{83k&3{ zleywMeno9`ng%^PlgepnQ4+SXve-h$1{t%`;ugJk23m77??S+~rJJI$s2PomR5$*6 z#h7$*Ube`E1CBm|nX+%Hh{SCw${QHkPDJ$m?m|KElef+1QoNPih-^f(+^g7k!B+g(Q|fh5P|W)2^O78>#+eN{9m<9%?9cAb zP_hhDZHWwC;m+ROjw;IdTsbafLVBZ(bajD8X?V=U#MpO{X*cqtqoT*SD&_F5A6q*V zUW~+|@ySGb(PTks9}vYOR|~`9b>y1xx~k+c^y)o72n1UYeTq&y*|EK+(BVJppMT99 zX+A; zzf$VxoPB%v=i&sT;MHteqCZDz=A-Goe7*Wu#f4mlRiy2W(B@7fFg7oL+~w|4+b7G` zCKBz%_XtSGG>ylGzE}P{#|VXgV?y$3*034hgbCL4Z_b{8?h zvm~PS#|oTaV?XuI%z&8u-{+HVg0c;c3a;r=a#R>gmF#_O+;J)1q)_1Kizsq9f;@fX zTqpe4K`1^(%OiLlHPeRWOqYx=jCE+Op}~(AaRvsfA}Ci zDv-7V%%23>Nt!Wwp_AnJcn{Gq7;f^HokUTgxrCGbrWULv{lwdjTb;cL)G!$N!3E=f z2j3I1e8?L|q4FmZuZX#tNIY{qx#lowe!~VUG%JvabZ6w1vc_q?Ciy&tm1u05U`t_F zUKQsRj%*sgtE=-CMDg47AVW3a)Dw*e$==ML7KTQIAOa|sBEG0%re>z@&htj8%O(JJNxNBWg4X%~L%;4d=R*x9|c zM`7C(NY~ak`UJ}JLvu96av3scpUOL4_>jt#KvTj3h0pK{XXYzRjvQYgikvv=ifPiy zI{%=Fy_BVwm>k%vkIANr4@vf~3sWoYMi;n<44JV((mFG+5ssgKxQ zkz!?wywY+;xR<9auaT9c+sPt+qd@oCY_g$6g*xw%F$xef^J%I$h9A$jakT9>ic856 zh|+>9l!$Cx92!+6gyThDM{463Lcw7b^@B4CEs!G zZ(Ocpx`y${j}lX~Yuf27n zcFi(=wEE54m+Xele6(6lPO6Qrtb_1jL$Fda?M9<^tu{V0+boern{BREtMOM)>fWQ%y~E5M<*qAB~Z$n z-VaX=R)-~rQ7KgG-l?5Cc`O^yd?`U|BRo7k*{$00J9Pl&Rh`19t%fcvq|9c z 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 z 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 UTMh#jvax9&)jN`X$mZJr0ici4X#fBK literal 0 HcmV?d00001 diff --git a/packages/vchart-extension/__tests__/runtime/browser/test-page/map-label/map-label.ts b/packages/vchart-extension/__tests__/runtime/browser/test-page/map-label/map-label.ts index 536501f23a..58d0af4e71 100644 --- a/packages/vchart-extension/__tests__/runtime/browser/test-page/map-label/map-label.ts +++ b/packages/vchart-extension/__tests__/runtime/browser/test-page/map-label/map-label.ts @@ -7,7 +7,7 @@ const run = async () => { // 图表配置 const spec = { type: 'common', - padding: 0, + padding: 50, region: [ { roam: true, @@ -152,15 +152,13 @@ const run = async () => { ] }; - const chinaMapUrl_topojson = 'https://tosv.byted.org/obj/gis/topojson/china.json'; + const chinaMapUrl_topojson = 'https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json'; const chinaRes_topojson = await fetch(chinaMapUrl_topojson); const china_topojson = await chinaRes_topojson.json(); VChart.registerMap('china', china_topojson, { - type: 'topojson', - object: 'china', - simplify: true + rewind: true }); const cs = new VChart(spec, { diff --git a/packages/vchart-extension/src/components/map-label/type.ts b/packages/vchart-extension/src/components/map-label/type.ts index 711abf3ef3..ac628e0592 100644 --- a/packages/vchart-extension/src/components/map-label/type.ts +++ b/packages/vchart-extension/src/components/map-label/type.ts @@ -23,15 +23,25 @@ export type IMapLabelNodes = 'nameLabel' | 'valueLabel' | 'icon' | 'labelBackgro export type MapLabelSceneNodeMap = Partial>; export interface IMapLabelStyleSpec { - /** 是否显示,默认 false */ + /** + * 是否显示 + * @default false + */ visible?: boolean; - /** 标签非 outer 位置下与标记点的间距 */ + /** + * 标签非 outer 位置下与标记点的间距 + * @default 12 + */ offset?: number; /** - * icon/label之间的距离 + * icon 和 label之间的距离 + * @default 10 */ space?: number; - /** 标签位置 */ + /** + * 标签位置。支持 'left' | 'top' | 'right' | 'bottom' | 'outer' + * @default 'top' + */ position?: LabelPosition; /** 名称文本样式设置 */ nameLabel?: { @@ -50,7 +60,9 @@ export interface IMapLabelStyleSpec { }; /** 背景样式设置 */ background?: { + /** @default true */ visible?: boolean; + /** 背景框边距 */ padding?: IPadding; style?: IRectMarkSpec; }; From 64309e1a2ff7b95e0ecd039ae86865adb4752736 Mon Sep 17 00:00:00 2001 From: xiaoluoHe Date: Mon, 30 Dec 2024 14:45:10 +0800 Subject: [PATCH 4/5] feat: remove map-label related code --- packages/vchart/src/chart/base/base-chart.ts | 3 +-- packages/vchart/src/component/interface/theme.ts | 5 ----- packages/vchart/src/component/interface/type.ts | 1 - packages/vchart/src/event/interface.ts | 1 - packages/vchart/src/index-harmony-simple.ts | 4 ---- packages/vchart/src/index-harmony.ts | 2 -- packages/vchart/src/index-lark.ts | 2 -- packages/vchart/src/index-wx.ts | 2 -- 8 files changed, 1 insertion(+), 19 deletions(-) diff --git a/packages/vchart/src/chart/base/base-chart.ts b/packages/vchart/src/chart/base/base-chart.ts index 5be79e7106..9d2f399181 100644 --- a/packages/vchart/src/chart/base/base-chart.ts +++ b/packages/vchart/src/chart/base/base-chart.ts @@ -874,8 +874,7 @@ export class BaseChart extends CompilableBase implements I } = {}; const checkVisibleComponents: Record = { [ComponentTypeEnum.title]: true, - [ComponentTypeEnum.brush]: true, - [ComponentTypeEnum.mapLabel]: true + [ComponentTypeEnum.brush]: true }; this._components.forEach(c => { diff --git a/packages/vchart/src/component/interface/theme.ts b/packages/vchart/src/component/interface/theme.ts index 391b8638ba..3e8551bf4c 100644 --- a/packages/vchart/src/component/interface/theme.ts +++ b/packages/vchart/src/component/interface/theme.ts @@ -6,7 +6,6 @@ import type { IScrollBarTheme } from '../data-zoom/scroll-bar/interface'; import type { IIndicatorTheme } from '../indicator/interface'; import type { IDiscreteLegendTheme } from '../legend/discrete/interface'; import type { IColorLegendTheme, ISizeLegendTheme } from '../legend/continuous/interface'; -import type { IMapLabelTheme } from '../map-label/interface'; import type { IMarkAreaTheme } from '../marker/mark-area/interface'; import type { IMarkLineTheme } from '../marker/mark-line/interface'; import type { IMarkPointTheme } from '../marker/mark-point/interface'; @@ -114,10 +113,6 @@ export interface IComponentTheme { * 图表标题配置 */ [ComponentTypeEnum.title]?: ITitleTheme; - /** - * 地图标签配置 - */ - [ComponentTypeEnum.mapLabel]?: IMapLabelTheme; /** * 省略文本配置 */ diff --git a/packages/vchart/src/component/interface/type.ts b/packages/vchart/src/component/interface/type.ts index 9eb78fd0e1..d93fb72a49 100644 --- a/packages/vchart/src/component/interface/type.ts +++ b/packages/vchart/src/component/interface/type.ts @@ -20,7 +20,6 @@ export enum ComponentTypeEnum { continuousLegend = 'continuousLegend', colorLegend = 'colorLegend', sizeLegend = 'sizeLegend', - mapLabel = 'mapLabel', markLine = 'markLine', markArea = 'markArea', markPoint = 'markPoint', diff --git a/packages/vchart/src/event/interface.ts b/packages/vchart/src/event/interface.ts index 9fd9bd18ab..37647ac85f 100644 --- a/packages/vchart/src/event/interface.ts +++ b/packages/vchart/src/event/interface.ts @@ -69,7 +69,6 @@ export type ComponentType = | 'dataZoom' | 'indicator' | 'legend' - | 'mapLabel' | 'markLine' | 'markArea' | 'markPoint' diff --git a/packages/vchart/src/index-harmony-simple.ts b/packages/vchart/src/index-harmony-simple.ts index b94a6ffa12..a97186f935 100644 --- a/packages/vchart/src/index-harmony-simple.ts +++ b/packages/vchart/src/index-harmony-simple.ts @@ -52,7 +52,6 @@ import { registerTotalLabel } from './component/label/total-label'; import { registerMarkPoint, registerPolarMarkPoint, registerGeoMarkPoint } from './component/marker/mark-point'; import { registerBrush } from './component/brush'; import { registerCustomMark } from './component/custom-mark'; -import { registerMapLabel } from './component/map-label'; import { registerGridLayout } from './layout/grid-layout/grid-layout'; import { registerPoptip } from './component/poptip'; import { registerCanvasTooltipHandler } from './plugin/components/tooltip-handler'; @@ -132,12 +131,9 @@ export { registerTotalLabel, registerBrush, registerCustomMark, - registerMapLabel, registerPoptip, - // layout registerGridLayout, - // vgrammar interactions, registerElementHighlight, registerElementSelect diff --git a/packages/vchart/src/index-harmony.ts b/packages/vchart/src/index-harmony.ts index 6b475c022f..2debc075df 100644 --- a/packages/vchart/src/index-harmony.ts +++ b/packages/vchart/src/index-harmony.ts @@ -52,7 +52,6 @@ import { registerTotalLabel } from './component/label/total-label'; import { registerMarkPoint, registerPolarMarkPoint, registerGeoMarkPoint } from './component/marker/mark-point'; import { registerBrush } from './component/brush'; import { registerCustomMark } from './component/custom-mark'; -import { registerMapLabel } from './component/map-label'; import { registerGridLayout } from './layout/grid-layout/grid-layout'; import { registerPoptip } from './component/poptip'; import { registerCanvasTooltipHandler } from './plugin/components/tooltip-handler'; @@ -127,7 +126,6 @@ VChart.useRegisters([ registerTotalLabel, registerBrush, registerCustomMark, - registerMapLabel, registerPoptip, // layout diff --git a/packages/vchart/src/index-lark.ts b/packages/vchart/src/index-lark.ts index 483870f744..310d6c1fb9 100644 --- a/packages/vchart/src/index-lark.ts +++ b/packages/vchart/src/index-lark.ts @@ -52,7 +52,6 @@ import { registerTotalLabel } from './component/label/total-label'; import { registerMarkPoint, registerPolarMarkPoint, registerGeoMarkPoint } from './component/marker/mark-point'; import { registerBrush } from './component/brush'; import { registerCustomMark } from './component/custom-mark'; -import { registerMapLabel } from './component/map-label'; import { registerGridLayout } from './layout/grid-layout/grid-layout'; import { registerPoptip } from './component/poptip'; import { registerCanvasTooltipHandler } from './plugin/components/tooltip-handler'; @@ -126,7 +125,6 @@ VChart.useRegisters([ registerTotalLabel, registerBrush, registerCustomMark, - registerMapLabel, registerPoptip, // layout diff --git a/packages/vchart/src/index-wx.ts b/packages/vchart/src/index-wx.ts index 5a6bbff004..4b06d14823 100644 --- a/packages/vchart/src/index-wx.ts +++ b/packages/vchart/src/index-wx.ts @@ -52,7 +52,6 @@ import { registerTotalLabel } from './component/label/total-label'; import { registerMarkPoint, registerPolarMarkPoint, registerGeoMarkPoint } from './component/marker/mark-point'; import { registerBrush } from './component/brush'; import { registerCustomMark } from './component/custom-mark'; -import { registerMapLabel } from './component/map-label'; import { registerGridLayout } from './layout/grid-layout/grid-layout'; import { registerPoptip } from './component/poptip'; import { registerCanvasTooltipHandler } from './plugin/components/tooltip-handler'; @@ -124,7 +123,6 @@ VChart.useRegisters([ registerTotalLabel, registerBrush, registerCustomMark, - registerMapLabel, registerPoptip, // layout From ecb1484b7fa7978f6522bda3f33c5605d772fd57 Mon Sep 17 00:00:00 2001 From: xiaoluoHe Date: Mon, 30 Dec 2024 14:48:39 +0800 Subject: [PATCH 5/5] docs: add changelog --- .../vchart/refactor-map-label_2024-12-30-06-48.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 common/changes/@visactor/vchart/refactor-map-label_2024-12-30-06-48.json diff --git a/common/changes/@visactor/vchart/refactor-map-label_2024-12-30-06-48.json b/common/changes/@visactor/vchart/refactor-map-label_2024-12-30-06-48.json new file mode 100644 index 0000000000..851e363eee --- /dev/null +++ b/common/changes/@visactor/vchart/refactor-map-label_2024-12-30-06-48.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@visactor/vchart", + "comment": "refactor: migrate mapLabel component into vchart-extension package", + "type": "none" + } + ], + "packageName": "@visactor/vchart" +} \ No newline at end of file