cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
73 lines (72 loc) • 3.15 kB
JavaScript
import retrieve from "../../util/retrieve.mjs";
import graphicGL from "../../util/graphicGL.mjs";
import ViewGL from "../../core/ViewGL.mjs";
function createMapService3DCreator(serviceComponentType, ServiceCtor, afterCreate) {
function resizeMapService3D(mapService3DModel, api) {
var width = api.getWidth();
var height = api.getHeight();
var dpr = api.getDevicePixelRatio();
this.viewGL.setViewport(0, 0, width, height, dpr);
this.width = width;
this.height = height;
this.altitudeScale = mapService3DModel.get("altitudeScale");
this.boxHeight = mapService3DModel.get("boxHeight");
}
function updateService3D(ecModel, api) {
if (this.model.get("boxHeight") === "auto") {
return;
}
var altitudeDataExtent = [Infinity, -Infinity];
ecModel.eachSeries(function(seriesModel) {
if (seriesModel.coordinateSystem !== this) {
return;
}
var data = seriesModel.getData();
var altDim = seriesModel.coordDimToDataDim("alt")[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])) {
this.altitudeExtent = altitudeDataExtent;
}
}
return {
dimensions: ServiceCtor.prototype.dimensions,
create: function(ecModel, api) {
var mapService3DList = [];
ecModel.eachComponent(serviceComponentType, function(mapService3DModel) {
var viewGL = mapService3DModel.__viewGL;
if (!viewGL) {
viewGL = mapService3DModel.__viewGL = new ViewGL();
viewGL.setRootNode(new graphicGL.Node());
}
var mapService3DCoordSys = new ServiceCtor();
mapService3DCoordSys.viewGL = mapService3DModel.__viewGL;
mapService3DCoordSys.resize = resizeMapService3D;
mapService3DCoordSys.resize(mapService3DModel, api);
mapService3DList.push(mapService3DCoordSys);
mapService3DModel.coordinateSystem = mapService3DCoordSys;
mapService3DCoordSys.model = mapService3DModel;
mapService3DCoordSys.update = updateService3D;
});
ecModel.eachSeries(function(seriesModel) {
if (seriesModel.get("coordinateSystem") === serviceComponentType) {
var mapService3DModel = seriesModel.getReferringComponents(serviceComponentType).models[0];
if (!mapService3DModel) {
mapService3DModel = ecModel.getComponent(serviceComponentType);
}
if (!mapService3DModel) {
throw new Error(serviceComponentType + ' "' + retrieve.firstNotNull(seriesModel.get(serviceComponentType + "Index"), seriesModel.get(serviceComponentType + "Id"), 0) + '" not found');
}
seriesModel.coordinateSystem = mapService3DModel.coordinateSystem;
}
});
afterCreate && afterCreate(mapService3DList, ecModel, api);
return mapService3DList;
}
};
}
export { createMapService3DCreator as default };