cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
121 lines (120 loc) • 4.07 kB
JavaScript
import "../../../../echarts/lib/echarts.mjs";
import glmatrix from "../../../../claygl/src/glmatrix/index.mjs";
import fixTextCoords from "../../../../echarts/lib/coord/geo/fix/textCoord.mjs";
import fixGeoCoords from "../../../../echarts/lib/coord/geo/fix/geoCoord.mjs";
import BoundingRect from "../../../../zrender/lib/core/BoundingRect.mjs";
import parseGeoJSON from "../../../../echarts/lib/coord/geo/parseGeoJson.mjs";
var vec3 = glmatrix.vec3;
var mat4 = glmatrix.mat4;
var geoFixFuncs = [fixTextCoords, fixGeoCoords];
function Geo3D(name, map, geoJson, specialAreas, nameMap) {
this.name = name;
this.map = map;
this.regionHeight = 0;
this.regions = [];
this._nameCoordMap = {};
this.loadGeoJson(geoJson, specialAreas, nameMap);
this.transform = mat4.identity(new Float64Array(16));
this.invTransform = mat4.identity(new Float64Array(16));
this.extrudeY = true;
this.altitudeAxis;
}
Geo3D.prototype = {
constructor: Geo3D,
type: "geo3D",
dimensions: ["lng", "lat", "alt"],
containPoint: function() {
},
loadGeoJson: function(geoJson, specialAreas, nameMap) {
var parseGeoJSON$1 = parseGeoJSON || parseGeoJSON;
try {
this.regions = geoJson ? parseGeoJSON$1(geoJson) : [];
} catch (e) {
throw "Invalid geoJson format\n" + e;
}
specialAreas = specialAreas || {};
nameMap = nameMap || {};
var regions = this.regions;
var regionsMap = {};
for (var i = 0; i < regions.length; i++) {
var regionName = regions[i].name;
regionName = nameMap[regionName] || regionName;
regions[i].name = regionName;
regionsMap[regionName] = regions[i];
this.addGeoCoord(regionName, regions[i].getCenter());
var specialArea = specialAreas[regionName];
if (specialArea) {
regions[i].transformTo(specialArea.left, specialArea.top, specialArea.width, specialArea.height);
}
}
this._regionsMap = regionsMap;
this._geoRect = null;
geoFixFuncs.forEach(function(fixFunc) {
fixFunc(this);
}, this);
},
getGeoBoundingRect: function() {
if (this._geoRect) {
return this._geoRect;
}
var rect;
var regions = this.regions;
for (var i = 0; i < regions.length; i++) {
var regionRect = regions[i].getBoundingRect();
rect = rect || regionRect.clone();
rect.union(regionRect);
}
return this._geoRect = rect || new BoundingRect(0, 0, 0, 0);
},
addGeoCoord: function(name, geoCoord) {
this._nameCoordMap[name] = geoCoord;
},
getRegion: function(name) {
return this._regionsMap[name];
},
getRegionByCoord: function(coord) {
var regions = this.regions;
for (var i = 0; i < regions.length; i++) {
if (regions[i].contain(coord)) {
return regions[i];
}
}
},
setSize: function(width, height, depth) {
this.size = [width, height, depth];
var rect = this.getGeoBoundingRect();
var scaleX = width / rect.width;
var scaleZ = -depth / rect.height;
var translateX = -width / 2 - rect.x * scaleX;
var translateZ = depth / 2 - rect.y * scaleZ;
var position = this.extrudeY ? [translateX, 0, translateZ] : [translateX, translateZ, 0];
var scale = this.extrudeY ? [scaleX, 1, scaleZ] : [scaleX, scaleZ, 1];
var m = this.transform;
mat4.identity(m);
mat4.translate(m, m, position);
mat4.scale(m, m, scale);
mat4.invert(this.invTransform, m);
},
dataToPoint: function(data, out) {
out = out || [];
var extrudeCoordIndex = this.extrudeY ? 1 : 2;
var sideCoordIndex = this.extrudeY ? 2 : 1;
var altitudeVal = data[2];
if (isNaN(altitudeVal)) {
altitudeVal = 0;
}
out[0] = data[0];
out[sideCoordIndex] = data[1];
if (this.altitudeAxis) {
out[extrudeCoordIndex] = this.altitudeAxis.dataToCoord(altitudeVal);
} else {
out[extrudeCoordIndex] = 0;
}
out[extrudeCoordIndex] += this.regionHeight;
vec3.transformMat4(out, out, this.transform);
return out;
},
pointToData: function(point, out) {
}
};
export { Geo3D as default };