UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

126 lines (125 loc) 5.68 kB
import "../../../../echarts/lib/echarts.mjs"; import Vector3 from "../../../../claygl/src/math/Vector3.mjs"; import glmatrix from "../../../../claygl/src/glmatrix/index.mjs"; import cartesian3DLayout from "./cartesian3DLayout.mjs"; import evaluateBarSparseness from "./evaluateBarSparseness.mjs"; import { dataStack } from "../../../../echarts/lib/export/api/helper.mjs"; import { isArray } from "../../../../zrender/lib/core/util.mjs"; var vec3 = glmatrix.vec3; var isDimensionStacked = dataStack.isDimensionStacked; function globeLayout(seriesModel, coordSys) { var data = seriesModel.getData(); var barMinHeight = seriesModel.get("minHeight") || 0; var barSize = seriesModel.get("barSize"); var dims = ["lng", "lat", "alt"].map(function(coordDimName) { return seriesModel.coordDimToDataDim(coordDimName)[0]; }); if (barSize == null) { var perimeter = coordSys.radius * Math.PI; var fillRatio = evaluateBarSparseness(data, dims[0], dims[1]); barSize = [perimeter / Math.sqrt(data.count() / fillRatio), perimeter / Math.sqrt(data.count() / fillRatio)]; } else if (!isArray(barSize)) { barSize = [barSize, barSize]; } var valueDim = getValueDimension(data, dims); data.each(dims, function(lng, lat, val, idx) { var stackedValue = data.get(valueDim.dimension, idx); var baseValue = valueDim.isStacked ? stackedValue - val : coordSys.altitudeAxis.scale.getExtent()[0]; var height = Math.max(coordSys.altitudeAxis.dataToCoord(val), barMinHeight); var start = coordSys.dataToPoint([lng, lat, baseValue]); var end = coordSys.dataToPoint([lng, lat, stackedValue]); var dir = vec3.sub([], end, start); vec3.normalize(dir, dir); var size = [barSize[0], height, barSize[1]]; data.setItemLayout(idx, [start, dir, size]); }); data.setLayout("orient", Vector3.UP.array); } function geo3DLayout(seriesModel, coordSys) { var data = seriesModel.getData(); var barSize = seriesModel.get("barSize"); var barMinHeight = seriesModel.get("minHeight") || 0; var dims = ["lng", "lat", "alt"].map(function(coordDimName) { return seriesModel.coordDimToDataDim(coordDimName)[0]; }); if (barSize == null) { var size = Math.min(coordSys.size[0], coordSys.size[2]); var fillRatio = evaluateBarSparseness(data, dims[0], dims[1]); barSize = [size / Math.sqrt(data.count() / fillRatio), size / Math.sqrt(data.count() / fillRatio)]; } else if (!isArray(barSize)) { barSize = [barSize, barSize]; } var dir = [0, 1, 0]; var valueDim = getValueDimension(data, dims); data.each(dims, function(lng, lat, val, idx) { var stackedValue = data.get(valueDim.dimension, idx); var baseValue = valueDim.isStacked ? stackedValue - val : coordSys.altitudeAxis.scale.getExtent()[0]; var height = Math.max(coordSys.altitudeAxis.dataToCoord(val), barMinHeight); var start = coordSys.dataToPoint([lng, lat, baseValue]); var size2 = [barSize[0], height, barSize[1]]; data.setItemLayout(idx, [start, dir, size2]); }); data.setLayout("orient", [1, 0, 0]); } function mapService3DLayout(seriesModel, coordSys) { var data = seriesModel.getData(); var dimLng = seriesModel.coordDimToDataDim("lng")[0]; var dimLat = seriesModel.coordDimToDataDim("lat")[0]; var dimAlt = seriesModel.coordDimToDataDim("alt")[0]; var barSize = seriesModel.get("barSize"); var barMinHeight = seriesModel.get("minHeight") || 0; if (barSize == null) { var xExtent = data.getDataExtent(dimLng); var yExtent = data.getDataExtent(dimLat); var corner0 = coordSys.dataToPoint([xExtent[0], yExtent[0]]); var corner1 = coordSys.dataToPoint([xExtent[1], yExtent[1]]); var size = Math.min(Math.abs(corner0[0] - corner1[0]), Math.abs(corner0[1] - corner1[1])) || 1; var fillRatio = evaluateBarSparseness(data, dimLng, dimLat); barSize = [size / Math.sqrt(data.count() / fillRatio), size / Math.sqrt(data.count() / fillRatio)]; } else { if (!isArray(barSize)) { barSize = [barSize, barSize]; } barSize[0] /= coordSys.getScale() / 16; barSize[1] /= coordSys.getScale() / 16; } var dir = [0, 0, 1]; var dims = [dimLng, dimLat, dimAlt]; var valueDim = getValueDimension(data, dims); data.each(dims, function(lng, lat, val, idx) { var stackedValue = data.get(valueDim.dimension, idx); var baseValue = valueDim.isStacked ? stackedValue - val : 0; var start = coordSys.dataToPoint([lng, lat, baseValue]); var end = coordSys.dataToPoint([lng, lat, stackedValue]); var height = Math.max(end[2] - start[2], barMinHeight); var size2 = [barSize[0], height, barSize[1]]; data.setItemLayout(idx, [start, dir, size2]); }); data.setLayout("orient", [1, 0, 0]); } function getValueDimension(data, dataDims) { var isStacked = isDimensionStacked(data, dataDims[2]); return { dimension: isStacked ? data.getCalculationInfo("stackResultDimension") : dataDims[2], isStacked }; } function registerBarLayout(registers) { registers.registerLayout(function(ecModel, api) { ecModel.eachSeriesByType("bar3D", function(seriesModel) { var coordSys = seriesModel.coordinateSystem; var coordSysType = coordSys && coordSys.type; if (coordSysType === "globe") { globeLayout(seriesModel, coordSys); } else if (coordSysType === "cartesian3D") { cartesian3DLayout(seriesModel, coordSys); } else if (coordSysType === "geo3D") { geo3DLayout(seriesModel, coordSys); } else if (coordSysType === "mapbox3D" || coordSysType === "maptalks3D") { mapService3DLayout(seriesModel, coordSys); } else ; }); }); } export { registerBarLayout as default };