@antv/l7-component 2.8.28 → 2.8.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/markerlayer.js +16 -0
- package/es/markerlayer.js.map +1 -1
- package/lib/markerlayer.js +16 -0
- package/lib/markerlayer.js.map +1 -1
- package/package.json +4 -4
package/es/markerlayer.js
CHANGED
|
@@ -97,6 +97,14 @@ var MarkerLayer = function (_EventEmitter) {
|
|
|
97
97
|
|
|
98
98
|
if (cluster) {
|
|
99
99
|
this.addPoint(marker, this.markers.length);
|
|
100
|
+
|
|
101
|
+
if (this.mapsService) {
|
|
102
|
+
var zoom = this.mapsService.getZoom();
|
|
103
|
+
var bbox = this.mapsService.getBounds();
|
|
104
|
+
this.bbox = padBounds(bbox, 0.5);
|
|
105
|
+
this.zoom = Math.floor(zoom);
|
|
106
|
+
this.getClusterMarker(this.bbox, this.zoom);
|
|
107
|
+
}
|
|
100
108
|
}
|
|
101
109
|
|
|
102
110
|
this.markers.push(marker);
|
|
@@ -182,6 +190,10 @@ var MarkerLayer = function (_EventEmitter) {
|
|
|
182
190
|
})
|
|
183
191
|
};
|
|
184
192
|
this.points.push(feature);
|
|
193
|
+
|
|
194
|
+
if (this.clusterIndex) {
|
|
195
|
+
this.clusterIndex.load(this.points);
|
|
196
|
+
}
|
|
185
197
|
}
|
|
186
198
|
}, {
|
|
187
199
|
key: "initCluster",
|
|
@@ -283,6 +295,10 @@ var MarkerLayer = function (_EventEmitter) {
|
|
|
283
295
|
}, {
|
|
284
296
|
key: "update",
|
|
285
297
|
value: function update() {
|
|
298
|
+
if (!this.mapsService) {
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
|
|
286
302
|
var zoom = this.mapsService.getZoom();
|
|
287
303
|
var bbox = this.mapsService.getBounds();
|
|
288
304
|
|
package/es/markerlayer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/markerlayer.ts"],"names":["TYPES","bindAll","boundsContains","DOM","padBounds","Satistics","EventEmitter","Supercluster","Marker","MarkerLayer","option","markerLayerOption","getDefault","zoom","clusterOption","cluster","radius","maxZoom","minZoom","style","className","scene","mapsService","get","IMapService","initCluster","update","on","addMarkers","marker","addPoint","markers","length","push","indexOf","markerIndex","splice","map","m","getElement","opacity","clusterMarkers","getMarkers","forEach","addTo","remove","clusterMarker","off","clear","removeAllListeners","id","getLnglat","lng","lat","feature","geometry","type","coordinates","properties","getExtData","marker_id","points","clusterIndex","load","viewBounds","viewBBox","concat","clusterPoint","getClusters","field","method","cluster_id","clusterData","getLeaves","columnData","item","data","column","getColumn","stat","getSatByColumn","fieldName","toFixed","clusterId","limit","Infinity","offset","element","generateElement","bind","setLnglat","getZoom","bbox","getBounds","Math","abs","floor","getClusterMarker","el","create","label","span","point_count","text","textContent"],"mappings":"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","sourcesContent":["import { IMapService, IMarker, TYPES } from '@antv/l7-core';\nimport {\n bindAll,\n boundsContains,\n DOM,\n IBounds,\n padBounds,\n Satistics,\n} from '@antv/l7-utils';\nimport { EventEmitter } from 'eventemitter3';\nimport { Container } from 'inversify';\nimport { merge } from 'lodash';\n// @ts-ignore\n// tslint:disable-next-line:no-submodule-imports\nimport Supercluster from 'supercluster/dist/supercluster';\nimport Marker from './marker';\ntype CallBack = (...args: any[]) => any;\ninterface IMarkerStyleOption {\n element?: CallBack;\n style: { [key: string]: any } | CallBack;\n className: string;\n field?: string;\n method?: 'sum' | 'max' | 'min' | 'mean';\n radius: number;\n maxZoom: number;\n minZoom: number;\n zoom: number;\n}\n\ninterface IMarkerLayerOption {\n cluster: boolean;\n clusterOption: Partial<IMarkerStyleOption>;\n}\n\ninterface IPointFeature {\n geometry: {\n type: 'Point';\n coordinates: [number, number];\n };\n properties: any;\n}\nexport default class MarkerLayer extends EventEmitter {\n private markers: IMarker[] = [];\n private markerLayerOption: IMarkerLayerOption;\n private clusterIndex: Supercluster;\n private points: IPointFeature[] = [];\n private clusterMarkers: IMarker[] = [];\n private mapsService: IMapService<unknown>;\n private scene: Container;\n private zoom: number;\n private bbox: IBounds;\n\n constructor(option?: Partial<IMarkerLayerOption>) {\n super();\n this.markerLayerOption = merge(this.getDefault(), option);\n bindAll(['update'], this);\n this.zoom = this.markerLayerOption.clusterOption?.zoom || -99;\n }\n public getDefault() {\n return {\n cluster: false,\n clusterOption: {\n radius: 80,\n maxZoom: 20,\n minZoom: 0,\n zoom: -99,\n style: {},\n className: '',\n },\n };\n }\n public addTo(scene: Container) {\n // this.remove();\n this.scene = scene;\n this.mapsService = scene.get<IMapService>(TYPES.IMapService);\n if (this.markerLayerOption.cluster) {\n this.initCluster();\n this.update();\n // 地图视野变化时,重新计算视野内的聚合点。\n this.mapsService.on('camerachange', this.update); // amap1.x 更新事件\n this.mapsService.on('viewchange', this.update); // amap2.0 更新事件\n }\n this.addMarkers();\n return this;\n }\n public addMarker(marker: IMarker) {\n const cluster = this.markerLayerOption.cluster;\n if (cluster) {\n this.addPoint(marker, this.markers.length);\n }\n this.markers.push(marker);\n }\n\n public removeMarker(marker: IMarker) {\n this.markers.indexOf(marker);\n const markerIndex = this.markers.indexOf(marker);\n if (markerIndex > -1) {\n this.markers.splice(markerIndex, 1);\n }\n }\n\n /**\n * 隐藏 marker 在每个 marker 上单独修改属性而不是在 markerContainer 上修改(在 markerContainer 修改会有用户在场景加载完之前调用失败的问题)\n */\n public hide() {\n this.markers.map((m) => {\n m.getElement().style.opacity = '0';\n });\n\n this.clusterMarkers.map((m) => {\n m.getElement().style.opacity = '0';\n });\n }\n\n /**\n * 显示 marker\n */\n public show() {\n this.markers.map((m) => {\n m.getElement().style.opacity = '1';\n });\n\n this.clusterMarkers.map((m) => {\n m.getElement().style.opacity = '1';\n });\n }\n\n public getMarkers() {\n const cluster = this.markerLayerOption.cluster;\n return cluster ? this.clusterMarkers : this.markers;\n }\n\n public addMarkers() {\n this.getMarkers().forEach((marker: IMarker) => {\n marker.addTo(this.scene);\n });\n }\n public clear() {\n this.markers.forEach((marker: IMarker) => {\n marker.remove();\n });\n this.clusterMarkers.forEach((clusterMarker: IMarker) => {\n clusterMarker.remove();\n });\n this.mapsService.off('camerachange', this.update);\n this.markers = [];\n this.clusterMarkers = [];\n }\n\n public destroy() {\n this.clear();\n this.removeAllListeners();\n }\n\n private addPoint(marker: IMarker, id: number) {\n const { lng, lat } = marker.getLnglat();\n const feature: IPointFeature = {\n geometry: {\n type: 'Point',\n coordinates: [lng, lat],\n },\n properties: {\n ...marker.getExtData(),\n marker_id: id,\n },\n };\n this.points.push(feature);\n }\n\n private initCluster() {\n if (!this.markerLayerOption.cluster) {\n return;\n }\n const { radius, minZoom = 0, maxZoom } = this.markerLayerOption\n .clusterOption as IMarkerStyleOption;\n this.clusterIndex = new Supercluster({\n radius,\n minZoom,\n maxZoom,\n });\n // @ts-ignore\n this.clusterIndex.load(this.points);\n }\n\n private getClusterMarker(viewBounds: IBounds, zoom: number) {\n const viewBBox = viewBounds[0].concat(viewBounds[1]);\n const clusterPoint = this.clusterIndex.getClusters(viewBBox, zoom);\n this.clusterMarkers.forEach((marker: IMarker) => {\n marker.remove();\n });\n this.clusterMarkers = [];\n clusterPoint.forEach((feature: any) => {\n const { field, method } = this.markerLayerOption.clusterOption;\n // 处理聚合数据\n if (feature.properties && feature.properties?.cluster_id) {\n const clusterData = this.getLeaves(feature.properties?.cluster_id);\n feature.properties.clusterData = clusterData;\n if (field && method) {\n const columnData = clusterData?.map((item: any) => {\n const data = {\n [field]: item.properties[field],\n };\n return data;\n });\n const column = Satistics.getColumn(columnData as any, field);\n const stat = Satistics.getSatByColumn(method, column);\n const fieldName = 'point_' + method;\n feature.properties[fieldName] = stat.toFixed(2);\n }\n }\n const marker = this.clusterMarker(feature);\n this.clusterMarkers.push(marker);\n marker.addTo(this.scene);\n });\n }\n private getLeaves(\n clusterId: number,\n limit: number = Infinity,\n offset: number = 0,\n ) {\n if (!clusterId) {\n return null;\n }\n return this.clusterIndex.getLeaves(clusterId, limit, offset);\n }\n private clusterMarker(feature: any) {\n const clusterOption = this.markerLayerOption.clusterOption;\n\n const {\n element = this.generateElement.bind(this),\n } = clusterOption as IMarkerStyleOption;\n const marker = new Marker({\n element: element(feature),\n }).setLnglat({\n lng: feature.geometry.coordinates[0],\n lat: feature.geometry.coordinates[1],\n });\n return marker;\n }\n private normalMarker(feature: any) {\n const marker_id = feature.properties.marker_id;\n return this.markers[marker_id];\n }\n\n private update() {\n const zoom = this.mapsService.getZoom();\n const bbox = this.mapsService.getBounds();\n if (\n !this.bbox ||\n Math.abs(zoom - this.zoom) >= 1 ||\n !boundsContains(this.bbox, bbox)\n ) {\n this.bbox = padBounds(bbox, 0.5);\n this.zoom = Math.floor(zoom);\n this.getClusterMarker(this.bbox, this.zoom);\n }\n }\n\n private generateElement(feature: any) {\n const el = DOM.create('div', 'l7-marker-cluster');\n const label = DOM.create('div', '', el);\n const span = DOM.create('span', '', label);\n const { field, method } = this.markerLayerOption.clusterOption;\n feature.properties.point_count = feature.properties.point_count || 1;\n\n const text =\n field && method\n ? feature.properties['point_' + method] || feature.properties[field]\n : feature.properties.point_count;\n span.textContent = text;\n return el;\n }\n}\n"],"file":"markerlayer.js"}
|
|
1
|
+
{"version":3,"sources":["../src/markerlayer.ts"],"names":["TYPES","bindAll","boundsContains","DOM","padBounds","Satistics","EventEmitter","Supercluster","Marker","MarkerLayer","option","markerLayerOption","getDefault","zoom","clusterOption","cluster","radius","maxZoom","minZoom","style","className","scene","mapsService","get","IMapService","initCluster","update","on","addMarkers","marker","addPoint","markers","length","getZoom","bbox","getBounds","Math","floor","getClusterMarker","push","indexOf","markerIndex","splice","map","m","getElement","opacity","clusterMarkers","getMarkers","forEach","addTo","remove","clusterMarker","off","clear","removeAllListeners","id","getLnglat","lng","lat","feature","geometry","type","coordinates","properties","getExtData","marker_id","points","clusterIndex","load","viewBounds","viewBBox","concat","clusterPoint","getClusters","field","method","cluster_id","clusterData","getLeaves","columnData","item","data","column","getColumn","stat","getSatByColumn","fieldName","toFixed","clusterId","limit","Infinity","offset","element","generateElement","bind","setLnglat","abs","el","create","label","span","point_count","text","textContent"],"mappings":"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","sourcesContent":["import { IMapService, IMarker, TYPES } from '@antv/l7-core';\nimport {\n bindAll,\n boundsContains,\n DOM,\n IBounds,\n padBounds,\n Satistics,\n} from '@antv/l7-utils';\nimport { EventEmitter } from 'eventemitter3';\nimport { Container } from 'inversify';\nimport { merge } from 'lodash';\n// @ts-ignore\n// tslint:disable-next-line:no-submodule-imports\nimport Supercluster from 'supercluster/dist/supercluster';\nimport Marker from './marker';\ntype CallBack = (...args: any[]) => any;\ninterface IMarkerStyleOption {\n element?: CallBack;\n style: { [key: string]: any } | CallBack;\n className: string;\n field?: string;\n method?: 'sum' | 'max' | 'min' | 'mean';\n radius: number;\n maxZoom: number;\n minZoom: number;\n zoom: number;\n}\n\ninterface IMarkerLayerOption {\n cluster: boolean;\n clusterOption: Partial<IMarkerStyleOption>;\n}\n\ninterface IPointFeature {\n geometry: {\n type: 'Point';\n coordinates: [number, number];\n };\n properties: any;\n}\nexport default class MarkerLayer extends EventEmitter {\n private markers: IMarker[] = [];\n private markerLayerOption: IMarkerLayerOption;\n private clusterIndex: Supercluster;\n private points: IPointFeature[] = [];\n private clusterMarkers: IMarker[] = [];\n private mapsService: IMapService<unknown>;\n private scene: Container;\n private zoom: number;\n private bbox: IBounds;\n\n constructor(option?: Partial<IMarkerLayerOption>) {\n super();\n this.markerLayerOption = merge(this.getDefault(), option);\n bindAll(['update'], this);\n this.zoom = this.markerLayerOption.clusterOption?.zoom || -99;\n }\n public getDefault() {\n return {\n cluster: false,\n clusterOption: {\n radius: 80,\n maxZoom: 20,\n minZoom: 0,\n zoom: -99,\n style: {},\n className: '',\n },\n };\n }\n public addTo(scene: Container) {\n // this.remove();\n this.scene = scene;\n this.mapsService = scene.get<IMapService>(TYPES.IMapService);\n if (this.markerLayerOption.cluster) {\n this.initCluster();\n this.update();\n // 地图视野变化时,重新计算视野内的聚合点。\n this.mapsService.on('camerachange', this.update); // amap1.x 更新事件\n this.mapsService.on('viewchange', this.update); // amap2.0 更新事件\n }\n this.addMarkers();\n return this;\n }\n public addMarker(marker: IMarker) {\n const cluster = this.markerLayerOption.cluster;\n if (cluster) {\n this.addPoint(marker, this.markers.length);\n if (this.mapsService) {\n // 在新增 marker 的时候需要更新聚合信息(哪怕此时的 zoom 没有发生变化)\n const zoom = this.mapsService.getZoom();\n const bbox = this.mapsService.getBounds();\n this.bbox = padBounds(bbox, 0.5);\n this.zoom = Math.floor(zoom);\n this.getClusterMarker(this.bbox, this.zoom);\n }\n }\n this.markers.push(marker);\n }\n\n public removeMarker(marker: IMarker) {\n this.markers.indexOf(marker);\n const markerIndex = this.markers.indexOf(marker);\n if (markerIndex > -1) {\n this.markers.splice(markerIndex, 1);\n }\n }\n\n /**\n * 隐藏 marker 在每个 marker 上单独修改属性而不是在 markerContainer 上修改(在 markerContainer 修改会有用户在场景加载完之前调用失败的问题)\n */\n public hide() {\n this.markers.map((m) => {\n m.getElement().style.opacity = '0';\n });\n\n this.clusterMarkers.map((m) => {\n m.getElement().style.opacity = '0';\n });\n }\n\n /**\n * 显示 marker\n */\n public show() {\n this.markers.map((m) => {\n m.getElement().style.opacity = '1';\n });\n\n this.clusterMarkers.map((m) => {\n m.getElement().style.opacity = '1';\n });\n }\n\n public getMarkers() {\n const cluster = this.markerLayerOption.cluster;\n return cluster ? this.clusterMarkers : this.markers;\n }\n\n public addMarkers() {\n this.getMarkers().forEach((marker: IMarker) => {\n marker.addTo(this.scene);\n });\n }\n public clear() {\n this.markers.forEach((marker: IMarker) => {\n marker.remove();\n });\n this.clusterMarkers.forEach((clusterMarker: IMarker) => {\n clusterMarker.remove();\n });\n this.mapsService.off('camerachange', this.update);\n this.markers = [];\n this.clusterMarkers = [];\n }\n\n public destroy() {\n this.clear();\n this.removeAllListeners();\n }\n\n private addPoint(marker: IMarker, id: number) {\n const { lng, lat } = marker.getLnglat();\n const feature: IPointFeature = {\n geometry: {\n type: 'Point',\n coordinates: [lng, lat],\n },\n properties: {\n ...marker.getExtData(),\n marker_id: id,\n },\n };\n this.points.push(feature);\n if (this.clusterIndex) {\n // 在新增点的时候需要更新 cluster 的数据\n this.clusterIndex.load(this.points);\n }\n }\n\n private initCluster() {\n if (!this.markerLayerOption.cluster) {\n return;\n }\n const { radius, minZoom = 0, maxZoom } = this.markerLayerOption\n .clusterOption as IMarkerStyleOption;\n this.clusterIndex = new Supercluster({\n radius,\n minZoom,\n maxZoom,\n });\n // @ts-ignore\n this.clusterIndex.load(this.points);\n }\n\n private getClusterMarker(viewBounds: IBounds, zoom: number) {\n const viewBBox = viewBounds[0].concat(viewBounds[1]);\n const clusterPoint = this.clusterIndex.getClusters(viewBBox, zoom);\n this.clusterMarkers.forEach((marker: IMarker) => {\n marker.remove();\n });\n this.clusterMarkers = [];\n clusterPoint.forEach((feature: any) => {\n const { field, method } = this.markerLayerOption.clusterOption;\n // 处理聚合数据\n if (feature.properties && feature.properties?.cluster_id) {\n const clusterData = this.getLeaves(feature.properties?.cluster_id);\n feature.properties.clusterData = clusterData;\n if (field && method) {\n const columnData = clusterData?.map((item: any) => {\n const data = {\n [field]: item.properties[field],\n };\n return data;\n });\n const column = Satistics.getColumn(columnData as any, field);\n const stat = Satistics.getSatByColumn(method, column);\n const fieldName = 'point_' + method;\n feature.properties[fieldName] = stat.toFixed(2);\n }\n }\n const marker = this.clusterMarker(feature);\n this.clusterMarkers.push(marker);\n marker.addTo(this.scene);\n });\n }\n private getLeaves(\n clusterId: number,\n limit: number = Infinity,\n offset: number = 0,\n ) {\n if (!clusterId) {\n return null;\n }\n return this.clusterIndex.getLeaves(clusterId, limit, offset);\n }\n private clusterMarker(feature: any) {\n const clusterOption = this.markerLayerOption.clusterOption;\n\n const {\n element = this.generateElement.bind(this),\n } = clusterOption as IMarkerStyleOption;\n const marker = new Marker({\n element: element(feature),\n }).setLnglat({\n lng: feature.geometry.coordinates[0],\n lat: feature.geometry.coordinates[1],\n });\n return marker;\n }\n private normalMarker(feature: any) {\n const marker_id = feature.properties.marker_id;\n return this.markers[marker_id];\n }\n\n private update() {\n if (!this.mapsService) {\n return;\n }\n const zoom = this.mapsService.getZoom();\n const bbox = this.mapsService.getBounds();\n if (\n !this.bbox ||\n Math.abs(zoom - this.zoom) >= 1 ||\n !boundsContains(this.bbox, bbox)\n ) {\n this.bbox = padBounds(bbox, 0.5);\n this.zoom = Math.floor(zoom);\n this.getClusterMarker(this.bbox, this.zoom);\n }\n }\n\n private generateElement(feature: any) {\n const el = DOM.create('div', 'l7-marker-cluster');\n const label = DOM.create('div', '', el);\n const span = DOM.create('span', '', label);\n const { field, method } = this.markerLayerOption.clusterOption;\n feature.properties.point_count = feature.properties.point_count || 1;\n\n const text =\n field && method\n ? feature.properties['point_' + method] || feature.properties[field]\n : feature.properties.point_count;\n span.textContent = text;\n return el;\n }\n}\n"],"file":"markerlayer.js"}
|
package/lib/markerlayer.js
CHANGED
|
@@ -106,6 +106,14 @@ var MarkerLayer = function (_EventEmitter) {
|
|
|
106
106
|
|
|
107
107
|
if (cluster) {
|
|
108
108
|
this.addPoint(marker, this.markers.length);
|
|
109
|
+
|
|
110
|
+
if (this.mapsService) {
|
|
111
|
+
var zoom = this.mapsService.getZoom();
|
|
112
|
+
var bbox = this.mapsService.getBounds();
|
|
113
|
+
this.bbox = (0, _l7Utils.padBounds)(bbox, 0.5);
|
|
114
|
+
this.zoom = Math.floor(zoom);
|
|
115
|
+
this.getClusterMarker(this.bbox, this.zoom);
|
|
116
|
+
}
|
|
109
117
|
}
|
|
110
118
|
|
|
111
119
|
this.markers.push(marker);
|
|
@@ -191,6 +199,10 @@ var MarkerLayer = function (_EventEmitter) {
|
|
|
191
199
|
})
|
|
192
200
|
};
|
|
193
201
|
this.points.push(feature);
|
|
202
|
+
|
|
203
|
+
if (this.clusterIndex) {
|
|
204
|
+
this.clusterIndex.load(this.points);
|
|
205
|
+
}
|
|
194
206
|
}
|
|
195
207
|
}, {
|
|
196
208
|
key: "initCluster",
|
|
@@ -294,6 +306,10 @@ var MarkerLayer = function (_EventEmitter) {
|
|
|
294
306
|
}, {
|
|
295
307
|
key: "update",
|
|
296
308
|
value: function update() {
|
|
309
|
+
if (!this.mapsService) {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
|
|
297
313
|
var zoom = this.mapsService.getZoom();
|
|
298
314
|
var bbox = this.mapsService.getBounds();
|
|
299
315
|
|
package/lib/markerlayer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/markerlayer.ts"],"names":["MarkerLayer","option","markerLayerOption","getDefault","zoom","clusterOption","cluster","radius","maxZoom","minZoom","style","className","scene","mapsService","get","TYPES","IMapService","initCluster","update","on","addMarkers","marker","addPoint","markers","length","push","indexOf","markerIndex","splice","map","m","getElement","opacity","clusterMarkers","getMarkers","forEach","addTo","remove","clusterMarker","off","clear","removeAllListeners","id","getLnglat","lng","lat","feature","geometry","type","coordinates","properties","getExtData","marker_id","points","clusterIndex","Supercluster","load","viewBounds","viewBBox","concat","clusterPoint","getClusters","field","method","cluster_id","clusterData","getLeaves","columnData","item","data","column","Satistics","getColumn","stat","getSatByColumn","fieldName","toFixed","clusterId","limit","Infinity","offset","element","generateElement","bind","Marker","setLnglat","getZoom","bbox","getBounds","Math","abs","floor","getClusterMarker","el","DOM","create","label","span","point_count","text","textContent","EventEmitter"],"mappings":"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","sourcesContent":["import { IMapService, IMarker, TYPES } from '@antv/l7-core';\nimport {\n bindAll,\n boundsContains,\n DOM,\n IBounds,\n padBounds,\n Satistics,\n} from '@antv/l7-utils';\nimport { EventEmitter } from 'eventemitter3';\nimport { Container } from 'inversify';\nimport { merge } from 'lodash';\n// @ts-ignore\n// tslint:disable-next-line:no-submodule-imports\nimport Supercluster from 'supercluster/dist/supercluster';\nimport Marker from './marker';\ntype CallBack = (...args: any[]) => any;\ninterface IMarkerStyleOption {\n element?: CallBack;\n style: { [key: string]: any } | CallBack;\n className: string;\n field?: string;\n method?: 'sum' | 'max' | 'min' | 'mean';\n radius: number;\n maxZoom: number;\n minZoom: number;\n zoom: number;\n}\n\ninterface IMarkerLayerOption {\n cluster: boolean;\n clusterOption: Partial<IMarkerStyleOption>;\n}\n\ninterface IPointFeature {\n geometry: {\n type: 'Point';\n coordinates: [number, number];\n };\n properties: any;\n}\nexport default class MarkerLayer extends EventEmitter {\n private markers: IMarker[] = [];\n private markerLayerOption: IMarkerLayerOption;\n private clusterIndex: Supercluster;\n private points: IPointFeature[] = [];\n private clusterMarkers: IMarker[] = [];\n private mapsService: IMapService<unknown>;\n private scene: Container;\n private zoom: number;\n private bbox: IBounds;\n\n constructor(option?: Partial<IMarkerLayerOption>) {\n super();\n this.markerLayerOption = merge(this.getDefault(), option);\n bindAll(['update'], this);\n this.zoom = this.markerLayerOption.clusterOption?.zoom || -99;\n }\n public getDefault() {\n return {\n cluster: false,\n clusterOption: {\n radius: 80,\n maxZoom: 20,\n minZoom: 0,\n zoom: -99,\n style: {},\n className: '',\n },\n };\n }\n public addTo(scene: Container) {\n // this.remove();\n this.scene = scene;\n this.mapsService = scene.get<IMapService>(TYPES.IMapService);\n if (this.markerLayerOption.cluster) {\n this.initCluster();\n this.update();\n // 地图视野变化时,重新计算视野内的聚合点。\n this.mapsService.on('camerachange', this.update); // amap1.x 更新事件\n this.mapsService.on('viewchange', this.update); // amap2.0 更新事件\n }\n this.addMarkers();\n return this;\n }\n public addMarker(marker: IMarker) {\n const cluster = this.markerLayerOption.cluster;\n if (cluster) {\n this.addPoint(marker, this.markers.length);\n }\n this.markers.push(marker);\n }\n\n public removeMarker(marker: IMarker) {\n this.markers.indexOf(marker);\n const markerIndex = this.markers.indexOf(marker);\n if (markerIndex > -1) {\n this.markers.splice(markerIndex, 1);\n }\n }\n\n /**\n * 隐藏 marker 在每个 marker 上单独修改属性而不是在 markerContainer 上修改(在 markerContainer 修改会有用户在场景加载完之前调用失败的问题)\n */\n public hide() {\n this.markers.map((m) => {\n m.getElement().style.opacity = '0';\n });\n\n this.clusterMarkers.map((m) => {\n m.getElement().style.opacity = '0';\n });\n }\n\n /**\n * 显示 marker\n */\n public show() {\n this.markers.map((m) => {\n m.getElement().style.opacity = '1';\n });\n\n this.clusterMarkers.map((m) => {\n m.getElement().style.opacity = '1';\n });\n }\n\n public getMarkers() {\n const cluster = this.markerLayerOption.cluster;\n return cluster ? this.clusterMarkers : this.markers;\n }\n\n public addMarkers() {\n this.getMarkers().forEach((marker: IMarker) => {\n marker.addTo(this.scene);\n });\n }\n public clear() {\n this.markers.forEach((marker: IMarker) => {\n marker.remove();\n });\n this.clusterMarkers.forEach((clusterMarker: IMarker) => {\n clusterMarker.remove();\n });\n this.mapsService.off('camerachange', this.update);\n this.markers = [];\n this.clusterMarkers = [];\n }\n\n public destroy() {\n this.clear();\n this.removeAllListeners();\n }\n\n private addPoint(marker: IMarker, id: number) {\n const { lng, lat } = marker.getLnglat();\n const feature: IPointFeature = {\n geometry: {\n type: 'Point',\n coordinates: [lng, lat],\n },\n properties: {\n ...marker.getExtData(),\n marker_id: id,\n },\n };\n this.points.push(feature);\n }\n\n private initCluster() {\n if (!this.markerLayerOption.cluster) {\n return;\n }\n const { radius, minZoom = 0, maxZoom } = this.markerLayerOption\n .clusterOption as IMarkerStyleOption;\n this.clusterIndex = new Supercluster({\n radius,\n minZoom,\n maxZoom,\n });\n // @ts-ignore\n this.clusterIndex.load(this.points);\n }\n\n private getClusterMarker(viewBounds: IBounds, zoom: number) {\n const viewBBox = viewBounds[0].concat(viewBounds[1]);\n const clusterPoint = this.clusterIndex.getClusters(viewBBox, zoom);\n this.clusterMarkers.forEach((marker: IMarker) => {\n marker.remove();\n });\n this.clusterMarkers = [];\n clusterPoint.forEach((feature: any) => {\n const { field, method } = this.markerLayerOption.clusterOption;\n // 处理聚合数据\n if (feature.properties && feature.properties?.cluster_id) {\n const clusterData = this.getLeaves(feature.properties?.cluster_id);\n feature.properties.clusterData = clusterData;\n if (field && method) {\n const columnData = clusterData?.map((item: any) => {\n const data = {\n [field]: item.properties[field],\n };\n return data;\n });\n const column = Satistics.getColumn(columnData as any, field);\n const stat = Satistics.getSatByColumn(method, column);\n const fieldName = 'point_' + method;\n feature.properties[fieldName] = stat.toFixed(2);\n }\n }\n const marker = this.clusterMarker(feature);\n this.clusterMarkers.push(marker);\n marker.addTo(this.scene);\n });\n }\n private getLeaves(\n clusterId: number,\n limit: number = Infinity,\n offset: number = 0,\n ) {\n if (!clusterId) {\n return null;\n }\n return this.clusterIndex.getLeaves(clusterId, limit, offset);\n }\n private clusterMarker(feature: any) {\n const clusterOption = this.markerLayerOption.clusterOption;\n\n const {\n element = this.generateElement.bind(this),\n } = clusterOption as IMarkerStyleOption;\n const marker = new Marker({\n element: element(feature),\n }).setLnglat({\n lng: feature.geometry.coordinates[0],\n lat: feature.geometry.coordinates[1],\n });\n return marker;\n }\n private normalMarker(feature: any) {\n const marker_id = feature.properties.marker_id;\n return this.markers[marker_id];\n }\n\n private update() {\n const zoom = this.mapsService.getZoom();\n const bbox = this.mapsService.getBounds();\n if (\n !this.bbox ||\n Math.abs(zoom - this.zoom) >= 1 ||\n !boundsContains(this.bbox, bbox)\n ) {\n this.bbox = padBounds(bbox, 0.5);\n this.zoom = Math.floor(zoom);\n this.getClusterMarker(this.bbox, this.zoom);\n }\n }\n\n private generateElement(feature: any) {\n const el = DOM.create('div', 'l7-marker-cluster');\n const label = DOM.create('div', '', el);\n const span = DOM.create('span', '', label);\n const { field, method } = this.markerLayerOption.clusterOption;\n feature.properties.point_count = feature.properties.point_count || 1;\n\n const text =\n field && method\n ? feature.properties['point_' + method] || feature.properties[field]\n : feature.properties.point_count;\n span.textContent = text;\n return el;\n }\n}\n"],"file":"markerlayer.js"}
|
|
1
|
+
{"version":3,"sources":["../src/markerlayer.ts"],"names":["MarkerLayer","option","markerLayerOption","getDefault","zoom","clusterOption","cluster","radius","maxZoom","minZoom","style","className","scene","mapsService","get","TYPES","IMapService","initCluster","update","on","addMarkers","marker","addPoint","markers","length","getZoom","bbox","getBounds","Math","floor","getClusterMarker","push","indexOf","markerIndex","splice","map","m","getElement","opacity","clusterMarkers","getMarkers","forEach","addTo","remove","clusterMarker","off","clear","removeAllListeners","id","getLnglat","lng","lat","feature","geometry","type","coordinates","properties","getExtData","marker_id","points","clusterIndex","load","Supercluster","viewBounds","viewBBox","concat","clusterPoint","getClusters","field","method","cluster_id","clusterData","getLeaves","columnData","item","data","column","Satistics","getColumn","stat","getSatByColumn","fieldName","toFixed","clusterId","limit","Infinity","offset","element","generateElement","bind","Marker","setLnglat","abs","el","DOM","create","label","span","point_count","text","textContent","EventEmitter"],"mappings":"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","sourcesContent":["import { IMapService, IMarker, TYPES } from '@antv/l7-core';\nimport {\n bindAll,\n boundsContains,\n DOM,\n IBounds,\n padBounds,\n Satistics,\n} from '@antv/l7-utils';\nimport { EventEmitter } from 'eventemitter3';\nimport { Container } from 'inversify';\nimport { merge } from 'lodash';\n// @ts-ignore\n// tslint:disable-next-line:no-submodule-imports\nimport Supercluster from 'supercluster/dist/supercluster';\nimport Marker from './marker';\ntype CallBack = (...args: any[]) => any;\ninterface IMarkerStyleOption {\n element?: CallBack;\n style: { [key: string]: any } | CallBack;\n className: string;\n field?: string;\n method?: 'sum' | 'max' | 'min' | 'mean';\n radius: number;\n maxZoom: number;\n minZoom: number;\n zoom: number;\n}\n\ninterface IMarkerLayerOption {\n cluster: boolean;\n clusterOption: Partial<IMarkerStyleOption>;\n}\n\ninterface IPointFeature {\n geometry: {\n type: 'Point';\n coordinates: [number, number];\n };\n properties: any;\n}\nexport default class MarkerLayer extends EventEmitter {\n private markers: IMarker[] = [];\n private markerLayerOption: IMarkerLayerOption;\n private clusterIndex: Supercluster;\n private points: IPointFeature[] = [];\n private clusterMarkers: IMarker[] = [];\n private mapsService: IMapService<unknown>;\n private scene: Container;\n private zoom: number;\n private bbox: IBounds;\n\n constructor(option?: Partial<IMarkerLayerOption>) {\n super();\n this.markerLayerOption = merge(this.getDefault(), option);\n bindAll(['update'], this);\n this.zoom = this.markerLayerOption.clusterOption?.zoom || -99;\n }\n public getDefault() {\n return {\n cluster: false,\n clusterOption: {\n radius: 80,\n maxZoom: 20,\n minZoom: 0,\n zoom: -99,\n style: {},\n className: '',\n },\n };\n }\n public addTo(scene: Container) {\n // this.remove();\n this.scene = scene;\n this.mapsService = scene.get<IMapService>(TYPES.IMapService);\n if (this.markerLayerOption.cluster) {\n this.initCluster();\n this.update();\n // 地图视野变化时,重新计算视野内的聚合点。\n this.mapsService.on('camerachange', this.update); // amap1.x 更新事件\n this.mapsService.on('viewchange', this.update); // amap2.0 更新事件\n }\n this.addMarkers();\n return this;\n }\n public addMarker(marker: IMarker) {\n const cluster = this.markerLayerOption.cluster;\n if (cluster) {\n this.addPoint(marker, this.markers.length);\n if (this.mapsService) {\n // 在新增 marker 的时候需要更新聚合信息(哪怕此时的 zoom 没有发生变化)\n const zoom = this.mapsService.getZoom();\n const bbox = this.mapsService.getBounds();\n this.bbox = padBounds(bbox, 0.5);\n this.zoom = Math.floor(zoom);\n this.getClusterMarker(this.bbox, this.zoom);\n }\n }\n this.markers.push(marker);\n }\n\n public removeMarker(marker: IMarker) {\n this.markers.indexOf(marker);\n const markerIndex = this.markers.indexOf(marker);\n if (markerIndex > -1) {\n this.markers.splice(markerIndex, 1);\n }\n }\n\n /**\n * 隐藏 marker 在每个 marker 上单独修改属性而不是在 markerContainer 上修改(在 markerContainer 修改会有用户在场景加载完之前调用失败的问题)\n */\n public hide() {\n this.markers.map((m) => {\n m.getElement().style.opacity = '0';\n });\n\n this.clusterMarkers.map((m) => {\n m.getElement().style.opacity = '0';\n });\n }\n\n /**\n * 显示 marker\n */\n public show() {\n this.markers.map((m) => {\n m.getElement().style.opacity = '1';\n });\n\n this.clusterMarkers.map((m) => {\n m.getElement().style.opacity = '1';\n });\n }\n\n public getMarkers() {\n const cluster = this.markerLayerOption.cluster;\n return cluster ? this.clusterMarkers : this.markers;\n }\n\n public addMarkers() {\n this.getMarkers().forEach((marker: IMarker) => {\n marker.addTo(this.scene);\n });\n }\n public clear() {\n this.markers.forEach((marker: IMarker) => {\n marker.remove();\n });\n this.clusterMarkers.forEach((clusterMarker: IMarker) => {\n clusterMarker.remove();\n });\n this.mapsService.off('camerachange', this.update);\n this.markers = [];\n this.clusterMarkers = [];\n }\n\n public destroy() {\n this.clear();\n this.removeAllListeners();\n }\n\n private addPoint(marker: IMarker, id: number) {\n const { lng, lat } = marker.getLnglat();\n const feature: IPointFeature = {\n geometry: {\n type: 'Point',\n coordinates: [lng, lat],\n },\n properties: {\n ...marker.getExtData(),\n marker_id: id,\n },\n };\n this.points.push(feature);\n if (this.clusterIndex) {\n // 在新增点的时候需要更新 cluster 的数据\n this.clusterIndex.load(this.points);\n }\n }\n\n private initCluster() {\n if (!this.markerLayerOption.cluster) {\n return;\n }\n const { radius, minZoom = 0, maxZoom } = this.markerLayerOption\n .clusterOption as IMarkerStyleOption;\n this.clusterIndex = new Supercluster({\n radius,\n minZoom,\n maxZoom,\n });\n // @ts-ignore\n this.clusterIndex.load(this.points);\n }\n\n private getClusterMarker(viewBounds: IBounds, zoom: number) {\n const viewBBox = viewBounds[0].concat(viewBounds[1]);\n const clusterPoint = this.clusterIndex.getClusters(viewBBox, zoom);\n this.clusterMarkers.forEach((marker: IMarker) => {\n marker.remove();\n });\n this.clusterMarkers = [];\n clusterPoint.forEach((feature: any) => {\n const { field, method } = this.markerLayerOption.clusterOption;\n // 处理聚合数据\n if (feature.properties && feature.properties?.cluster_id) {\n const clusterData = this.getLeaves(feature.properties?.cluster_id);\n feature.properties.clusterData = clusterData;\n if (field && method) {\n const columnData = clusterData?.map((item: any) => {\n const data = {\n [field]: item.properties[field],\n };\n return data;\n });\n const column = Satistics.getColumn(columnData as any, field);\n const stat = Satistics.getSatByColumn(method, column);\n const fieldName = 'point_' + method;\n feature.properties[fieldName] = stat.toFixed(2);\n }\n }\n const marker = this.clusterMarker(feature);\n this.clusterMarkers.push(marker);\n marker.addTo(this.scene);\n });\n }\n private getLeaves(\n clusterId: number,\n limit: number = Infinity,\n offset: number = 0,\n ) {\n if (!clusterId) {\n return null;\n }\n return this.clusterIndex.getLeaves(clusterId, limit, offset);\n }\n private clusterMarker(feature: any) {\n const clusterOption = this.markerLayerOption.clusterOption;\n\n const {\n element = this.generateElement.bind(this),\n } = clusterOption as IMarkerStyleOption;\n const marker = new Marker({\n element: element(feature),\n }).setLnglat({\n lng: feature.geometry.coordinates[0],\n lat: feature.geometry.coordinates[1],\n });\n return marker;\n }\n private normalMarker(feature: any) {\n const marker_id = feature.properties.marker_id;\n return this.markers[marker_id];\n }\n\n private update() {\n if (!this.mapsService) {\n return;\n }\n const zoom = this.mapsService.getZoom();\n const bbox = this.mapsService.getBounds();\n if (\n !this.bbox ||\n Math.abs(zoom - this.zoom) >= 1 ||\n !boundsContains(this.bbox, bbox)\n ) {\n this.bbox = padBounds(bbox, 0.5);\n this.zoom = Math.floor(zoom);\n this.getClusterMarker(this.bbox, this.zoom);\n }\n }\n\n private generateElement(feature: any) {\n const el = DOM.create('div', 'l7-marker-cluster');\n const label = DOM.create('div', '', el);\n const span = DOM.create('span', '', label);\n const { field, method } = this.markerLayerOption.clusterOption;\n feature.properties.point_count = feature.properties.point_count || 1;\n\n const text =\n field && method\n ? feature.properties['point_' + method] || feature.properties[field]\n : feature.properties.point_count;\n span.textContent = text;\n return el;\n }\n}\n"],"file":"markerlayer.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@antv/l7-component",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.31",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "es/index.js",
|
|
@@ -25,15 +25,15 @@
|
|
|
25
25
|
"author": "lzxue",
|
|
26
26
|
"license": "ISC",
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@antv/l7-core": "^2.8.
|
|
29
|
-
"@antv/l7-utils": "^2.8.
|
|
28
|
+
"@antv/l7-core": "^2.8.31",
|
|
29
|
+
"@antv/l7-utils": "^2.8.31",
|
|
30
30
|
"@babel/runtime": "^7.7.7",
|
|
31
31
|
"eventemitter3": "^4.0.0",
|
|
32
32
|
"inversify": "^5.0.1",
|
|
33
33
|
"reflect-metadata": "^0.1.13",
|
|
34
34
|
"supercluster": "^7.0.0"
|
|
35
35
|
},
|
|
36
|
-
"gitHead": "
|
|
36
|
+
"gitHead": "c08e7c79a25ea94b63b0c6b142addb07f0920717",
|
|
37
37
|
"publishConfig": {
|
|
38
38
|
"access": "public"
|
|
39
39
|
}
|