180 lines
5.1 KiB
JavaScript
180 lines
5.1 KiB
JavaScript
import Geo3D from './geo3D/Geo3D';
|
|
import * as echarts from 'echarts/lib/echarts';
|
|
import { getLayoutRect } from 'echarts/lib/util/layout';
|
|
import ViewGL from '../core/ViewGL';
|
|
import retrieve from '../util/retrieve';
|
|
|
|
function resizeGeo3D(geo3DModel, api) {
|
|
// Use left/top/width/height
|
|
var boxLayoutOption = geo3DModel.getBoxLayoutParams();
|
|
var viewport = getLayoutRect(boxLayoutOption, {
|
|
width: api.getWidth(),
|
|
height: api.getHeight()
|
|
}); // Flip Y
|
|
|
|
viewport.y = api.getHeight() - viewport.y - viewport.height;
|
|
this.viewGL.setViewport(viewport.x, viewport.y, viewport.width, viewport.height, api.getDevicePixelRatio());
|
|
var geoRect = this.getGeoBoundingRect();
|
|
var aspect = geoRect.width / geoRect.height * (geo3DModel.get('aspectScale') || 0.75);
|
|
var width = geo3DModel.get('boxWidth');
|
|
var depth = geo3DModel.get('boxDepth');
|
|
var height = geo3DModel.get('boxHeight');
|
|
|
|
if (height == null) {
|
|
height = 5;
|
|
}
|
|
|
|
if (isNaN(width) && isNaN(depth)) {
|
|
// Default to have 100 width
|
|
width = 100;
|
|
}
|
|
|
|
if (isNaN(depth)) {
|
|
depth = width / aspect;
|
|
} else if (isNaN(width)) {
|
|
width = depth / aspect;
|
|
}
|
|
|
|
this.setSize(width, height, depth);
|
|
this.regionHeight = geo3DModel.get('regionHeight');
|
|
|
|
if (this.altitudeAxis) {
|
|
this.altitudeAxis.setExtent(0, Math.max(height - this.regionHeight, 0));
|
|
}
|
|
}
|
|
|
|
function updateGeo3D(ecModel, api) {
|
|
var altitudeDataExtent = [Infinity, -Infinity];
|
|
ecModel.eachSeries(function (seriesModel) {
|
|
if (seriesModel.coordinateSystem !== this) {
|
|
return;
|
|
}
|
|
|
|
if (seriesModel.type === 'series.map3D') {
|
|
return;
|
|
} // Get altitude data extent.
|
|
|
|
|
|
var data = seriesModel.getData();
|
|
var altDims = seriesModel.coordDimToDataDim('alt');
|
|
var altDim = altDims && altDims[0];
|
|
|
|
if (altDim) {
|
|
// TODO altitiude is in coords of lines.
|
|
var dataExtent = data.getDataExtent(altDim, true);
|
|
altitudeDataExtent[0] = Math.min(altitudeDataExtent[0], dataExtent[0]);
|
|
altitudeDataExtent[1] = Math.max(altitudeDataExtent[1], dataExtent[1]);
|
|
}
|
|
}, this); // Create altitude axis
|
|
|
|
if (altitudeDataExtent && isFinite(altitudeDataExtent[1] - altitudeDataExtent[0])) {
|
|
var scale = echarts.helper.createScale(altitudeDataExtent, {
|
|
type: 'value',
|
|
// PENDING
|
|
min: 'dataMin',
|
|
max: 'dataMax'
|
|
});
|
|
this.altitudeAxis = new echarts.Axis('altitude', scale); // Resize again
|
|
|
|
this.resize(this.model, api);
|
|
}
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
var mapNotExistsError = function (name) {
|
|
console.error('Map ' + name + ' not exists. You can download map file on http://echarts.baidu.com/download-map.html');
|
|
};
|
|
}
|
|
|
|
var idStart = 0;
|
|
var geo3DCreator = {
|
|
dimensions: Geo3D.prototype.dimensions,
|
|
create: function (ecModel, api) {
|
|
var geo3DList = [];
|
|
|
|
if (!echarts.getMap) {
|
|
throw new Error('geo3D component depends on geo component');
|
|
}
|
|
|
|
function createGeo3D(componentModel, idx) {
|
|
var geo3D = geo3DCreator.createGeo3D(componentModel); // FIXME
|
|
|
|
componentModel.__viewGL = componentModel.__viewGL || new ViewGL();
|
|
geo3D.viewGL = componentModel.__viewGL;
|
|
componentModel.coordinateSystem = geo3D;
|
|
geo3D.model = componentModel;
|
|
geo3DList.push(geo3D); // Inject resize
|
|
|
|
geo3D.resize = resizeGeo3D;
|
|
geo3D.resize(componentModel, api);
|
|
geo3D.update = updateGeo3D;
|
|
}
|
|
|
|
ecModel.eachComponent('geo3D', function (geo3DModel, idx) {
|
|
createGeo3D(geo3DModel, idx);
|
|
});
|
|
ecModel.eachSeriesByType('map3D', function (map3DModel, idx) {
|
|
var coordSys = map3DModel.get('coordinateSystem');
|
|
|
|
if (coordSys == null) {
|
|
coordSys = 'geo3D';
|
|
}
|
|
|
|
if (coordSys === 'geo3D') {
|
|
createGeo3D(map3DModel, idx);
|
|
}
|
|
});
|
|
ecModel.eachSeries(function (seriesModel) {
|
|
if (seriesModel.get('coordinateSystem') === 'geo3D') {
|
|
if (seriesModel.type === 'series.map3D') {
|
|
return;
|
|
}
|
|
|
|
var geo3DModel = seriesModel.getReferringComponents('geo3D').models[0];
|
|
|
|
if (!geo3DModel) {
|
|
geo3DModel = ecModel.getComponent('geo3D');
|
|
}
|
|
|
|
if (!geo3DModel) {
|
|
throw new Error('geo "' + retrieve.firstNotNull(seriesModel.get('geo3DIndex'), seriesModel.get('geo3DId'), 0) + '" not found');
|
|
}
|
|
|
|
seriesModel.coordinateSystem = geo3DModel.coordinateSystem;
|
|
}
|
|
});
|
|
return geo3DList;
|
|
},
|
|
createGeo3D: function (componentModel) {
|
|
var mapData = componentModel.get('map');
|
|
var name;
|
|
|
|
if (typeof mapData === 'string') {
|
|
name = mapData;
|
|
mapData = echarts.getMap(mapData);
|
|
} else {
|
|
if (mapData && mapData.features) {
|
|
mapData = {
|
|
geoJson: mapData
|
|
};
|
|
}
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (!mapData) {
|
|
mapNotExistsError(mapData);
|
|
}
|
|
|
|
if (!mapData.geoJson.features) {
|
|
throw new Error('Invalid GeoJSON for map3D');
|
|
}
|
|
}
|
|
|
|
if (name == null) {
|
|
name = 'GEO_ANONYMOUS_' + idStart++;
|
|
}
|
|
|
|
return new Geo3D(name + idStart++, name, mapData && mapData.geoJson, mapData && mapData.specialAreas, componentModel.get('nameMap'));
|
|
}
|
|
};
|
|
export default geo3DCreator; |