cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
125 lines (124 loc) • 4.82 kB
JavaScript
import Globe from "./globe/Globe.mjs";
import "../../../echarts/lib/echarts.mjs";
import { getLayoutRect } from "../../../echarts/lib/util/layout.mjs";
import ViewGL from "../core/ViewGL.mjs";
import retrieve from "../util/retrieve.mjs";
import graphicGL from "../util/graphicGL.mjs";
import { createScale } from "../../../echarts/lib/export/api/helper.mjs";
import Axis from "../../../echarts/lib/coord/Axis.mjs";
function getDisplacementData(img, displacementScale) {
var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
var width = img.width;
var height = img.height;
canvas.width = width;
canvas.height = height;
ctx.drawImage(img, 0, 0, width, height);
var rgbaArr = ctx.getImageData(0, 0, width, height).data;
var displacementArr = new Float32Array(rgbaArr.length / 4);
for (var i = 0; i < rgbaArr.length / 4; i++) {
var x = rgbaArr[i * 4];
displacementArr[i] = x / 255 * displacementScale;
}
return {
data: displacementArr,
width,
height
};
}
function resizeGlobe(globeModel, api) {
var boxLayoutOption = globeModel.getBoxLayoutParams();
var viewport = getLayoutRect(boxLayoutOption, {
width: api.getWidth(),
height: api.getHeight()
});
viewport.y = api.getHeight() - viewport.y - viewport.height;
this.viewGL.setViewport(viewport.x, viewport.y, viewport.width, viewport.height, api.getDevicePixelRatio());
this.radius = globeModel.get("globeRadius");
var outerRadius = globeModel.get("globeOuterRadius");
if (this.altitudeAxis) {
this.altitudeAxis.setExtent(0, outerRadius - this.radius);
}
}
function updateGlobe(ecModel, api) {
var altitudeDataExtent = [Infinity, -Infinity];
ecModel.eachSeries(function(seriesModel) {
if (seriesModel.coordinateSystem !== this) {
return;
}
var data = seriesModel.getData();
var altDims = seriesModel.coordDimToDataDim("alt");
var altDim = altDims && altDims[0];
if (altDim) {
var dataExtent = data.getDataExtent(altDim, true);
altitudeDataExtent[0] = Math.min(altitudeDataExtent[0], dataExtent[0]);
altitudeDataExtent[1] = Math.max(altitudeDataExtent[1], dataExtent[1]);
}
}, this);
if (altitudeDataExtent && isFinite(altitudeDataExtent[1] - altitudeDataExtent[0])) {
var scale = createScale(altitudeDataExtent, {
type: "value",
min: "dataMin",
max: "dataMax"
});
this.altitudeAxis = new Axis("altitude", scale);
this.resize(this.model, api);
}
}
var globeCreator = {
dimensions: Globe.prototype.dimensions,
create: function(ecModel, api) {
var globeList = [];
ecModel.eachComponent("globe", function(globeModel) {
globeModel.__viewGL = globeModel.__viewGL || new ViewGL();
var globe = new Globe();
globe.viewGL = globeModel.__viewGL;
globeModel.coordinateSystem = globe;
globe.model = globeModel;
globeList.push(globe);
globe.resize = resizeGlobe;
globe.resize(globeModel, api);
globe.update = updateGlobe;
});
ecModel.eachSeries(function(seriesModel) {
if (seriesModel.get("coordinateSystem") === "globe") {
var globeModel = seriesModel.getReferringComponents("globe").models[0];
if (!globeModel) {
globeModel = ecModel.getComponent("globe");
}
if (!globeModel) {
throw new Error('globe "' + retrieve.firstNotNull(seriesModel.get("globe3DIndex"), seriesModel.get("globe3DId"), 0) + '" not found');
}
var coordSys = globeModel.coordinateSystem;
seriesModel.coordinateSystem = coordSys;
}
});
ecModel.eachComponent("globe", function(globeModel, idx) {
var globe = globeModel.coordinateSystem;
var displacementTextureValue = globeModel.getDisplacementTexture();
var displacementScale = globeModel.getDisplacemenScale();
if (globeModel.isDisplacementChanged()) {
if (globeModel.hasDisplacement()) {
var immediateLoaded = true;
graphicGL.loadTexture(displacementTextureValue, api, function(texture) {
var img = texture.image;
var displacementData = getDisplacementData(img, displacementScale);
globeModel.setDisplacementData(displacementData.data, displacementData.width, displacementData.height);
if (!immediateLoaded) {
api.dispatchAction({
type: "globeUpdateDisplacment"
});
}
});
immediateLoaded = false;
} else {
globe.setDisplacementData(null, 0, 0);
}
globe.setDisplacementData(globeModel.displacementData, globeModel.displacementWidth, globeModel.displacementHeight);
}
});
return globeList;
}
};
var globeCreator$1 = globeCreator;
export { globeCreator$1 as default };