From 234c5b9013f01151cc175235e7bcd4a22415afe3 Mon Sep 17 00:00:00 2001 From: thinkinggis Date: Mon, 11 Nov 2019 13:52:00 +0800 Subject: [PATCH] fix(layers): heatmap 3d effect --- ...tore-2b8cd1df4f8a6941bff4108301b5d6a9.json | 2 +- ...tore-308215140d91d466921fde8b44e96c70.json | 2 +- ...tore-3cf9cbd2e002119e2f428dfed8eb94da.json | 2 +- ...tore-57199a69f7efd5decc9f72929e6eaab6.json | 2 +- ...tore-8a657829abac5ed5e9e205e519d6ded0.json | 2 +- ...tore-9cf731425f928d78c08a41fa53dbea26.json | 2 +- ...tore-b196fbb424293a9c110515c8e22586c7.json | 2 +- ...tore-bed602677090371493b02b2541d3b187.json | 2 +- ...tore-bfa695e84c9fbd040b43c6cebb35a0a8.json | 2 +- ...tore-dc1901f7f1baf243df1556f52717b2ba.json | 2 +- ...tore-fbddf0de549e59cfa8bf242898a85984.json | 2 +- .cache/redux.state | Bin 424445 -> 404727 bytes examples/heatmap/heatmap/demo/grid.js | 55 ------------------ examples/heatmap/heatmap/demo/meta.json | 2 +- examples/heatmap/heatmap/demo/world.js | 4 +- examples/heatmap/heatmap/demo/world3d.js | 41 +++++++++++++ examples/point/basic/demo/meta.json | 5 ++ examples/point/basic/demo/text.js | 41 +++++++++++++ examples/point/image/demo/size.js | 2 +- .../core/src/services/layer/ILayerService.ts | 1 + packages/layers/src/core/BaseLayer.ts | 40 +++++++++++-- packages/layers/src/heatmap/heatmap.ts | 21 ++++--- .../src/heatmap/shaders/heatmap_3d_frag.glsl | 7 +-- .../src/heatmap/shaders/heatmap_3d_vert.glsl | 2 +- .../src/heatmap/shaders/heatmap_frag.glsl | 5 +- .../src/heatmap/shaders/heatmap_vert.glsl | 5 +- .../layers/src/plugins/FeatureScalePlugin.ts | 17 ++++-- packages/layers/src/point/text.ts | 8 +-- packages/renderer/src/regl/index.ts | 2 +- 29 files changed, 177 insertions(+), 103 deletions(-) delete mode 100644 examples/heatmap/heatmap/demo/grid.js create mode 100644 examples/heatmap/heatmap/demo/world3d.js create mode 100644 examples/point/basic/demo/text.js diff --git a/.cache/caches/gatsby-transformer-remark/diskstore-2b8cd1df4f8a6941bff4108301b5d6a9.json b/.cache/caches/gatsby-transformer-remark/diskstore-2b8cd1df4f8a6941bff4108301b5d6a9.json index 747026c81f..92f7b2e967 100644 --- a/.cache/caches/gatsby-transformer-remark/diskstore-2b8cd1df4f8a6941bff4108301b5d6a9.json +++ b/.cache/caches/gatsby-transformer-remark/diskstore-2b8cd1df4f8a6941bff4108301b5d6a9.json @@ -1 +1 @@ -{"expireTime":9007200828128391000,"key":"transformer-remark-markdown-html-99b5b2f90b0432fb92044e231041ffca-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-","val":""} \ No newline at end of file +{"expireTime":9007200828184475000,"key":"transformer-remark-markdown-html-99b5b2f90b0432fb92044e231041ffca-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-","val":""} \ No newline at end of file diff --git a/.cache/caches/gatsby-transformer-remark/diskstore-308215140d91d466921fde8b44e96c70.json b/.cache/caches/gatsby-transformer-remark/diskstore-308215140d91d466921fde8b44e96c70.json index b07a9d57a7..425fdae701 100644 --- a/.cache/caches/gatsby-transformer-remark/diskstore-308215140d91d466921fde8b44e96c70.json +++ b/.cache/caches/gatsby-transformer-remark/diskstore-308215140d91d466921fde8b44e96c70.json @@ -1 +1 @@ -{"expireTime":9007200828128391000,"key":"transformer-remark-markdown-html-b627c832a1f77c6bd67b3f67116e04eb-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-","val":""} \ No newline at end of file +{"expireTime":9007200828184475000,"key":"transformer-remark-markdown-html-b627c832a1f77c6bd67b3f67116e04eb-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-","val":""} \ No newline at end of file diff --git a/.cache/caches/gatsby-transformer-remark/diskstore-3cf9cbd2e002119e2f428dfed8eb94da.json b/.cache/caches/gatsby-transformer-remark/diskstore-3cf9cbd2e002119e2f428dfed8eb94da.json index ed3260b29f..7210b21785 100644 --- a/.cache/caches/gatsby-transformer-remark/diskstore-3cf9cbd2e002119e2f428dfed8eb94da.json +++ b/.cache/caches/gatsby-transformer-remark/diskstore-3cf9cbd2e002119e2f428dfed8eb94da.json @@ -1 +1 @@ -{"expireTime":9007200828128391000,"key":"transformer-remark-markdown-html-30a51869612bca077eda87f35f662bad-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-","val":""} \ No newline at end of file +{"expireTime":9007200828184475000,"key":"transformer-remark-markdown-html-30a51869612bca077eda87f35f662bad-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-","val":""} \ No newline at end of file diff --git a/.cache/caches/gatsby-transformer-remark/diskstore-57199a69f7efd5decc9f72929e6eaab6.json b/.cache/caches/gatsby-transformer-remark/diskstore-57199a69f7efd5decc9f72929e6eaab6.json index 1d05382ee6..0af459750c 100644 --- a/.cache/caches/gatsby-transformer-remark/diskstore-57199a69f7efd5decc9f72929e6eaab6.json +++ b/.cache/caches/gatsby-transformer-remark/diskstore-57199a69f7efd5decc9f72929e6eaab6.json @@ -1 +1 @@ -{"expireTime":9007200828128384000,"key":"transformer-remark-markdown-html-0b8b19ff19f6a64f7b2cae67200ccd88-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-","val":""} \ No newline at end of file +{"expireTime":9007200828184475000,"key":"transformer-remark-markdown-html-0b8b19ff19f6a64f7b2cae67200ccd88-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-","val":""} \ No newline at end of file diff --git a/.cache/caches/gatsby-transformer-remark/diskstore-8a657829abac5ed5e9e205e519d6ded0.json b/.cache/caches/gatsby-transformer-remark/diskstore-8a657829abac5ed5e9e205e519d6ded0.json index 271f4506f0..0e0495ff9c 100644 --- a/.cache/caches/gatsby-transformer-remark/diskstore-8a657829abac5ed5e9e205e519d6ded0.json +++ b/.cache/caches/gatsby-transformer-remark/diskstore-8a657829abac5ed5e9e205e519d6ded0.json @@ -1 +1 @@ -{"expireTime":9007200828128385000,"key":"transformer-remark-markdown-toc-99b5b2f90b0432fb92044e231041ffca-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-{\"heading\":null,\"maxDepth\":6,\"pathToSlugField\":\"fields.slug\"}-","val":""} \ No newline at end of file +{"expireTime":9007200828139761000,"key":"transformer-remark-markdown-toc-99b5b2f90b0432fb92044e231041ffca-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-{\"heading\":null,\"maxDepth\":6,\"pathToSlugField\":\"fields.slug\"}-","val":""} \ No newline at end of file diff --git a/.cache/caches/gatsby-transformer-remark/diskstore-9cf731425f928d78c08a41fa53dbea26.json b/.cache/caches/gatsby-transformer-remark/diskstore-9cf731425f928d78c08a41fa53dbea26.json index a2f0676c66..8448e9c615 100644 --- a/.cache/caches/gatsby-transformer-remark/diskstore-9cf731425f928d78c08a41fa53dbea26.json +++ b/.cache/caches/gatsby-transformer-remark/diskstore-9cf731425f928d78c08a41fa53dbea26.json @@ -1 +1 @@ -{"expireTime":9007200828128384000,"key":"transformer-remark-markdown-html-6e9c5aea4f7ea7c85d806fb35a09a394-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-","val":""} \ No newline at end of file +{"expireTime":9007200828184475000,"key":"transformer-remark-markdown-html-6e9c5aea4f7ea7c85d806fb35a09a394-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-","val":""} \ No newline at end of file diff --git a/.cache/caches/gatsby-transformer-remark/diskstore-b196fbb424293a9c110515c8e22586c7.json b/.cache/caches/gatsby-transformer-remark/diskstore-b196fbb424293a9c110515c8e22586c7.json index b2f5f677a9..97fbc8a16e 100644 --- a/.cache/caches/gatsby-transformer-remark/diskstore-b196fbb424293a9c110515c8e22586c7.json +++ b/.cache/caches/gatsby-transformer-remark/diskstore-b196fbb424293a9c110515c8e22586c7.json @@ -1 +1 @@ -{"expireTime":9007200828128384000,"key":"transformer-remark-markdown-html-e0eda26454f7aaeda47989e111060318-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-","val":""} \ No newline at end of file +{"expireTime":9007200828184475000,"key":"transformer-remark-markdown-html-e0eda26454f7aaeda47989e111060318-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-","val":""} \ No newline at end of file diff --git a/.cache/caches/gatsby-transformer-remark/diskstore-bed602677090371493b02b2541d3b187.json b/.cache/caches/gatsby-transformer-remark/diskstore-bed602677090371493b02b2541d3b187.json index a151ae916f..9e03c97f0b 100644 --- a/.cache/caches/gatsby-transformer-remark/diskstore-bed602677090371493b02b2541d3b187.json +++ b/.cache/caches/gatsby-transformer-remark/diskstore-bed602677090371493b02b2541d3b187.json @@ -1 +1 @@ -{"expireTime":9007200828128391000,"key":"transformer-remark-markdown-html-51cffb57f20c685f94203902c79f04c6-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-","val":""} \ No newline at end of file +{"expireTime":9007200828184475000,"key":"transformer-remark-markdown-html-51cffb57f20c685f94203902c79f04c6-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-","val":""} \ No newline at end of file diff --git a/.cache/caches/gatsby-transformer-remark/diskstore-bfa695e84c9fbd040b43c6cebb35a0a8.json b/.cache/caches/gatsby-transformer-remark/diskstore-bfa695e84c9fbd040b43c6cebb35a0a8.json index 85e22c9c4f..00090fcbce 100644 --- a/.cache/caches/gatsby-transformer-remark/diskstore-bfa695e84c9fbd040b43c6cebb35a0a8.json +++ b/.cache/caches/gatsby-transformer-remark/diskstore-bfa695e84c9fbd040b43c6cebb35a0a8.json @@ -1 +1 @@ -{"expireTime":9007200828128391000,"key":"transformer-remark-markdown-html-94a83b1b7402a40717e5c1b92c85015a-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-","val":""} \ No newline at end of file +{"expireTime":9007200828184475000,"key":"transformer-remark-markdown-html-94a83b1b7402a40717e5c1b92c85015a-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-","val":""} \ No newline at end of file diff --git a/.cache/caches/gatsby-transformer-remark/diskstore-dc1901f7f1baf243df1556f52717b2ba.json b/.cache/caches/gatsby-transformer-remark/diskstore-dc1901f7f1baf243df1556f52717b2ba.json index 8d3ddf7016..4c28076b3b 100644 --- a/.cache/caches/gatsby-transformer-remark/diskstore-dc1901f7f1baf243df1556f52717b2ba.json +++ b/.cache/caches/gatsby-transformer-remark/diskstore-dc1901f7f1baf243df1556f52717b2ba.json @@ -1 +1 @@ -{"expireTime":9007200828128384000,"key":"transformer-remark-markdown-toc-57531815410aa78dc10e42270cb201dd-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-{\"heading\":null,\"maxDepth\":6,\"pathToSlugField\":\"fields.slug\"}-","val":""} \ No newline at end of file +{"expireTime":9007200828139769000,"key":"transformer-remark-markdown-toc-57531815410aa78dc10e42270cb201dd-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-{\"heading\":null,\"maxDepth\":6,\"pathToSlugField\":\"fields.slug\"}-","val":""} \ No newline at end of file diff --git a/.cache/caches/gatsby-transformer-remark/diskstore-fbddf0de549e59cfa8bf242898a85984.json b/.cache/caches/gatsby-transformer-remark/diskstore-fbddf0de549e59cfa8bf242898a85984.json index bcf07317d4..0ef099a477 100644 --- a/.cache/caches/gatsby-transformer-remark/diskstore-fbddf0de549e59cfa8bf242898a85984.json +++ b/.cache/caches/gatsby-transformer-remark/diskstore-fbddf0de549e59cfa8bf242898a85984.json @@ -1 +1 @@ -{"expireTime":9007200828128385000,"key":"transformer-remark-markdown-toc-51dbb367647851670b43ae45a9e937df-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-{\"heading\":null,\"maxDepth\":6,\"pathToSlugField\":\"fields.slug\"}-","val":""} \ No newline at end of file +{"expireTime":9007200828139770000,"key":"transformer-remark-markdown-toc-51dbb367647851670b43ae45a9e937df-gatsby-remark-prettiergatsby-remark-prismjsgatsby-remark-external-linksgatsby-remark-autolink-headersgatsby-remark-reading-time-{\"heading\":null,\"maxDepth\":6,\"pathToSlugField\":\"fields.slug\"}-","val":""} \ No newline at end of file diff --git a/.cache/redux.state b/.cache/redux.state index ab421b97e98017c22d8d407e754df26575fee14a..d7263dcb6e407cc4b58d685997af389595241c7b 100644 GIT binary patch delta 49605 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 NGiJu92)t1D{{T6lw449{ delta 48807 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 res.json()) - .then((data) => { - const layer = - new HeatMapGridLayer({ - }) - .source(data, { - parser: { - type: 'json', - x: 'lng', - y: 'lat', - }, - transforms: [ - { - type: 'grid', - size: 50, - field: 'count', - method: 'sum', - }, - ], - }) - .size('sum', (value) => { - return value; - }) - .shape('square') - .style({ - coverage: 0.8, - angle: 0, - opacity: 0.6, - }) - .color('count', [ - '#002466', - '#105CB3', - '#2894E0', - '#CFF6FF', - '#FFF5B8', - '#FFAB5C', - '#F27049', - '#730D1C', - ]); - scene.addLayer(layer); - - - }); diff --git a/examples/heatmap/heatmap/demo/meta.json b/examples/heatmap/heatmap/demo/meta.json index 5c63ae78a9..c36eb6b0b9 100644 --- a/examples/heatmap/heatmap/demo/meta.json +++ b/examples/heatmap/heatmap/demo/meta.json @@ -5,7 +5,7 @@ }, "demos": [ { - "filename": "grid.js", + "filename": "world3d.js", "title": "网格热力图" }, { diff --git a/examples/heatmap/heatmap/demo/world.js b/examples/heatmap/heatmap/demo/world.js index 91a0f2c2f1..ad130f8638 100644 --- a/examples/heatmap/heatmap/demo/world.js +++ b/examples/heatmap/heatmap/demo/world.js @@ -16,7 +16,9 @@ fetch('https://gw.alipayobjects.com/os/basement_prod/337ddbb7-aa3f-4679-ab60-d64 new HeatMapLayer({ }) .source(data) - .size('capacity', [0, 1]) // weight映射通道 + .size('capacity', [0, 1]) + .shape('heatmap') + // weight映射通道 .style({ intensity: 10, radius: 5, diff --git a/examples/heatmap/heatmap/demo/world3d.js b/examples/heatmap/heatmap/demo/world3d.js new file mode 100644 index 0000000000..cf4b4abf82 --- /dev/null +++ b/examples/heatmap/heatmap/demo/world3d.js @@ -0,0 +1,41 @@ +import { Scene } from '@l7/scene'; +import { HeatMapLayer } from '@l7/layers'; +const scene = new Scene({ + id: 'map', + style: 'dark', + pitch: 0, + center: [116.49434030056, 39.868073421167621], + type: 'mapbox', + zoom: 3, +}); + +fetch('https://gw.alipayobjects.com/os/basement_prod/337ddbb7-aa3f-4679-ab60-d64359241955.json') + .then((res) => res.json()) + .then((data) => { + const layer = + new HeatMapLayer({ + }) + .source(data) + .size('capacity', [0, 1]) + .shape('heatmap3D') + // weight映射通道 + .style({ + intensity: 10, + radius: 5, + opacity: 1.0, + rampColors: { + colors: [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ], + positions: [0,0.2, 0.4, 0.6, 0.8, 1.0], + }, + }); + scene.addLayer(layer); + + + }); diff --git a/examples/point/basic/demo/meta.json b/examples/point/basic/demo/meta.json index d435544d66..f9c6517f99 100644 --- a/examples/point/basic/demo/meta.json +++ b/examples/point/basic/demo/meta.json @@ -13,6 +13,11 @@ "filename": "world.js", "title": "气泡图 - 电厂装机量" + }, + { + "filename": "text.js", + "title": "文本" + } ] } diff --git a/examples/point/basic/demo/text.js b/examples/point/basic/demo/text.js new file mode 100644 index 0000000000..1d10a9b144 --- /dev/null +++ b/examples/point/basic/demo/text.js @@ -0,0 +1,41 @@ +import { Scene } from '@l7/scene'; +import { PointLayer, PointImageLayer } from '@l7/layers' +const scene = new Scene({ + id: 'map', + pitch: 0, + type: 'amap', + style: 'light', + center: [121.40, 31.258134], + zoom: 15, + minZoom: 10 +}); + +fetch('https://gw.alipayobjects.com/os/basement_prod/893d1d5f-11d9-45f3-8322-ee9140d288ae.json') + .then((res) => res.json()) + .then((data) => { + const pointLayer = + new PointLayer({ + }) + .source(data, { + parser: { + type: 'json', + x: 'longitude', + y: 'latitude' + } + }).shape('circle') + .size('unit_price', [5, 25]) + .color('#5B8FF9') + .label('name') + .style({ + opacity: 0.3, + strokeWidth: 1, + strokeColor: "#5B8FF9", + + }) + + scene.addLayer(pointLayer); + console.log(pointLayer); + + }); + + diff --git a/examples/point/image/demo/size.js b/examples/point/image/demo/size.js index e1932a3a46..44f0d66871 100644 --- a/examples/point/image/demo/size.js +++ b/examples/point/image/demo/size.js @@ -34,7 +34,7 @@ fetch('https://gw.alipayobjects.com/os/basement_prod/893d1d5f-11d9-45f3-8322-ee9 } }) .shape('name', ['00', '01','02']) - .size('unit_price', [30, 100]) + .size('unit_price', [5, 15]) scene.addLayer(imageLayer); }); diff --git a/packages/core/src/services/layer/ILayerService.ts b/packages/core/src/services/layer/ILayerService.ts index 40da3c56fc..d88002ea0d 100644 --- a/packages/core/src/services/layer/ILayerService.ts +++ b/packages/core/src/services/layer/ILayerService.ts @@ -61,6 +61,7 @@ export interface ILayer { size(field: StyleAttrField, value?: StyleAttributeOption): ILayer; color(field: StyleAttrField, value?: StyleAttributeOption): ILayer; shape(field: StyleAttrField, value?: StyleAttributeOption): ILayer; + label(field: StyleAttrField, value?: StyleAttributeOption): ILayer; // pattern(field: string, value: StyleAttributeOption): ILayer; // filter(field: string, value: StyleAttributeOption): ILayer; // active(option: ActiveOption): ILayer; diff --git a/packages/layers/src/core/BaseLayer.ts b/packages/layers/src/core/BaseLayer.ts index c46e5cbf8e..ab340f8da0 100644 --- a/packages/layers/src/core/BaseLayer.ts +++ b/packages/layers/src/core/BaseLayer.ts @@ -130,6 +130,13 @@ export default class BaseLayer extends EventEmitter @lazyInject(TYPES.ILayerService) protected readonly layerService: ILayerService; + protected enodeOptions: { + [type: string]: { + field: StyleAttributeField; + values?: StyleAttributeOption; + }; + } = {}; + private encodedData: IEncodeFeature[]; private configSchema: object; @@ -142,12 +149,6 @@ export default class BaseLayer extends EventEmitter >; private scaleOptions: IScaleOptions = {}; - private enodeOptions: { - [type: string]: { - field: string; - }; - }; - @lazyInject(TYPES.IInteractionService) private readonly interactionService: IInteractionService; @@ -236,6 +237,10 @@ export default class BaseLayer extends EventEmitter values?: StyleAttributeOption, updateOptions?: Partial, ) { + this.enodeOptions.shape = { + field, + values, + }; this.styleAttributeService.updateStyleAttribute( 'shape', { @@ -254,6 +259,29 @@ export default class BaseLayer extends EventEmitter ); return this; } + public label( + field: StyleAttributeField, + values?: StyleAttributeOption, + updateOptions?: Partial, + ) { + this.styleAttributeService.updateStyleAttribute( + 'label', + { + // @ts-ignore + scale: { + field, + ...this.splitValuesAndCallbackInAttribute( + // @ts-ignore + values, + null, + ), + }, + }, + // @ts-ignore + updateOptions, + ); + return this; + } public source(data: any, options?: ISourceCFG): ILayer { this.sourceOption = { diff --git a/packages/layers/src/heatmap/heatmap.ts b/packages/layers/src/heatmap/heatmap.ts index 747da07589..d03f2dd434 100644 --- a/packages/layers/src/heatmap/heatmap.ts +++ b/packages/layers/src/heatmap/heatmap.ts @@ -56,7 +56,8 @@ export default class HeatMapLayer extends BaseLayer { protected renderModels() { const { clear, useFramebuffer } = this.rendererService; - + const shapeAttr = this.styleAttributeService.getLayerStyleAttribute('shape'); + const shapeType = shapeAttr?.scale?.field || 'heatmap'; useFramebuffer(this.heatmapFramerBuffer, () => { clear({ color: [0, 0, 0, 0], @@ -66,17 +67,19 @@ export default class HeatMapLayer extends BaseLayer { }); this.drawIntensityMode(); }); - this.draw3DHeatMap(); + // this.draw3DHeatMap(); + shapeType === 'heatmap' ? this.drawColorMode(): this.draw3DHeatMap(); // this.drawIntensityMode(); return this; } protected buildModels() { + const shapeAttr = this.styleAttributeService.getLayerStyleAttribute('shape'); + const shapeType = shapeAttr?.scale?.field || 'heatmap'; this.registerBuiltinAttributes(this); this.intensityModel = this.buildHeatMapIntensity(); this.models = [this.intensityModel]; - // this.colorModel = this.buildHeatmapColor(); - this.colorModel = this.build3dHeatMap(); + this.colorModel = shapeType === 'heatmap' ? this.buildHeatmapColor(): this.build3dHeatMap(); this.models.push(this.colorModel); const { rampColors } = this.getStyleOptions(); const imageData = generateColorRamp(rampColors as IColorRamp); @@ -95,8 +98,8 @@ export default class HeatMapLayer extends BaseLayer { height, wrapS: gl.CLAMP_TO_EDGE, wrapT: gl.CLAMP_TO_EDGE, - min: gl.NEAREST, - mag: gl.NEAREST, + min: gl.LINEAR, + mag: gl.LINEAR, }), }); @@ -175,9 +178,9 @@ export default class HeatMapLayer extends BaseLayer { enable: true, func: { srcRGB: gl.ONE, - srcAlpha: 1, + srcAlpha: gl.ONE_MINUS_SRC_ALPHA, dstRGB: gl.ONE, - dstAlpha: 1, + dstAlpha: gl.ONE_MINUS_SRC_ALPHA, }, }, }); @@ -280,7 +283,7 @@ export default class HeatMapLayer extends BaseLayer { private build3dHeatMap() { const { getViewportSize } = this.rendererService; const { width, height } = getViewportSize(); - const triangulation = heatMap3DTriangulation(width / 4.0, height / 4.0); + const triangulation = heatMap3DTriangulation(width / 2.0, height / 2.0); this.shaderModuleService.registerModule('heatmap3dColor', { vs: heatmap3DVert, fs: heatmap3DFrag, diff --git a/packages/layers/src/heatmap/shaders/heatmap_3d_frag.glsl b/packages/layers/src/heatmap/shaders/heatmap_3d_frag.glsl index f3b00b62b1..48b48907ea 100644 --- a/packages/layers/src/heatmap/shaders/heatmap_3d_frag.glsl +++ b/packages/layers/src/heatmap/shaders/heatmap_3d_frag.glsl @@ -5,14 +5,13 @@ varying vec2 v_texCoord; varying float v_intensity; void main(){ - float intensity = texture2D(u_texture, v_texCoord).r; + + float intensity = texture2D(u_texture, v_texCoord).r; vec2 ramp_pos = vec2( fract(16.0 * (1.0 - v_intensity)), floor(16.0 * (1.0 - v_intensity)) / 16.0); // vec4 color = texture2D(u_colorTexture,vec2(0.5,1.0-intensity)); vec4 color = texture2D(u_colorTexture,ramp_pos); gl_FragColor = color; - // gl_FragColor.a = color.a * smoothstep(0.0, 0.01, v_intensity) * u_opacity; - // gl_FragColor.a = 0.2; - + gl_FragColor.a = color.a * smoothstep(0.1,0.2,intensity)* u_opacity; } diff --git a/packages/layers/src/heatmap/shaders/heatmap_3d_vert.glsl b/packages/layers/src/heatmap/shaders/heatmap_3d_vert.glsl index e00eec61a5..972323b636 100644 --- a/packages/layers/src/heatmap/shaders/heatmap_3d_vert.glsl +++ b/packages/layers/src/heatmap/shaders/heatmap_3d_vert.glsl @@ -40,6 +40,6 @@ void main() { v_intensity = texture2D(u_texture, v_texCoord).r; fh = toBezier(v_intensity, b).y; - gl_Position = project_common_position_to_clipspace(vec4(position.xy, v_intensity * 50., 1.0)); + gl_Position = project_common_position_to_clipspace(vec4(position.xy, fh * 50., 1.0)); } diff --git a/packages/layers/src/heatmap/shaders/heatmap_frag.glsl b/packages/layers/src/heatmap/shaders/heatmap_frag.glsl index 8e817872e3..a20d904c3b 100644 --- a/packages/layers/src/heatmap/shaders/heatmap_frag.glsl +++ b/packages/layers/src/heatmap/shaders/heatmap_frag.glsl @@ -2,15 +2,16 @@ uniform sampler2D u_texture; uniform sampler2D u_colorTexture; uniform float u_opacity; varying vec2 v_texCoord; +varying float v_intensity; void main(){ - float intensity = texture2D(u_texture, v_texCoord).r; + float intensity = texture2D(u_texture, v_texCoord).r; vec2 ramp_pos = vec2( fract(16.0 * (1.0 - intensity)), floor(16.0 * (1.0 - intensity)) / 16.0); // vec4 color = texture2D(u_colorTexture,vec2(0.5,1.0-intensity)); vec4 color = texture2D(u_colorTexture,ramp_pos); gl_FragColor = color; - gl_FragColor.a = color.a * smoothstep(0.,0.01,intensity) * u_opacity; + gl_FragColor.a = color.a * smoothstep(0.,0.05,intensity) * u_opacity; } diff --git a/packages/layers/src/heatmap/shaders/heatmap_vert.glsl b/packages/layers/src/heatmap/shaders/heatmap_vert.glsl index 177ab3049c..cfa03fe386 100644 --- a/packages/layers/src/heatmap/shaders/heatmap_vert.glsl +++ b/packages/layers/src/heatmap/shaders/heatmap_vert.glsl @@ -3,8 +3,9 @@ attribute vec3 a_Position; attribute vec2 a_Uv; uniform sampler2D u_texture; varying vec2 v_texCoord; +varying float v_intensity; void main() { v_texCoord = a_Uv; - float intensity = texture2D(u_texture, v_texCoord).r; - gl_Position = vec4(a_Position.xy,intensity -0.5, 1.); + v_intensity = texture2D(u_texture, v_texCoord).r; + gl_Position = vec4(a_Position.xy, 0, 1.); } diff --git a/packages/layers/src/plugins/FeatureScalePlugin.ts b/packages/layers/src/plugins/FeatureScalePlugin.ts index 8147ca885b..e1f77ba177 100644 --- a/packages/layers/src/plugins/FeatureScalePlugin.ts +++ b/packages/layers/src/plugins/FeatureScalePlugin.ts @@ -93,14 +93,21 @@ export default class FeatureScalePlugin implements ILayerPlugin { if (scales.some((scale) => scale.type === StyleScaleType.VARIABLE)) { attributeScale.type = StyleScaleType.VARIABLE; scales.forEach((scale) => { - // 如果设置了回调干啥这不需要设置让range - if (!attributeScale.callback && attributeScale.values.length > 0) { - scale.scale.range(attributeScale.values); + // 如果设置了回调, 这不需要设置让range + if (!attributeScale.callback) { + if(attributeScale.values) { + scale.scale.range(attributeScale.values); + } else if(scale.option?.type==='cat') { + + // 如果没有设置初值且 类型为cat,range ==domain; + scale.scale.range(scale.option.domain); + } + } }); } else { // 设置attribute 常量值 常量直接在value取值 - + attributeScale.type = StyleScaleType.CONSTANT; attributeScale.values = scales.map((scale, index) => { return scale.scale(attributeScale.names[index]); }); @@ -166,7 +173,7 @@ export default class FeatureScalePlugin implements ILayerPlugin { type: StyleScaleType.VARIABLE, option: scaleOption, }; - if (!data || !data.length) { + if (!data || !data.length) { if (scaleOption && scaleOption.type) { styleScale.scale = this.createDefaultScale(scaleOption); diff --git a/packages/layers/src/point/text.ts b/packages/layers/src/point/text.ts index d31753e987..9ee0a9c28d 100644 --- a/packages/layers/src/point/text.ts +++ b/packages/layers/src/point/text.ts @@ -164,14 +164,14 @@ export default class TextLayer extends BaseLayer { }); } - private iniTextFont() { + private initTextFont() { const { fontWeight = 'normal', fontFamily } = this.getStyleOptions(); const data = this.getEncodedData(); const characterSet: string[] = []; data.forEach((item: IEncodeFeature) => { - let { text = '' } = item; - text = text.toString(); - for (const char of text) { + let { shape = '' } = item; + shape = shape.toString(); + for (const char of shape) { // 去重 if (characterSet.indexOf(char) === -1) { characterSet.push(char); diff --git a/packages/renderer/src/regl/index.ts b/packages/renderer/src/regl/index.ts index 0683d816e0..d5ab2ec49d 100644 --- a/packages/renderer/src/regl/index.ts +++ b/packages/renderer/src/regl/index.ts @@ -46,7 +46,7 @@ export default class ReglRendererService implements IRendererService { alpha: true, // use TAA instead of MSAA // @see https://www.khronos.org/registry/webgl/specs/1.0/#5.2.1 - antialias: false, + antialias: true, premultipliedAlpha: true, }, // TODO: use extensions