project/node_modules/echarts/lib/coord/geo/Region.js

286 lines
9.1 KiB
JavaScript
Raw Permalink Normal View History

2024-07-14 15:48:34 +08:00
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* AUTO-GENERATED FILE. DO NOT MODIFY.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import { __extends } from "tslib";
import BoundingRect from 'zrender/lib/core/BoundingRect.js';
import * as vec2 from 'zrender/lib/core/vector.js';
import * as polygonContain from 'zrender/lib/contain/polygon.js';
import * as matrix from 'zrender/lib/core/matrix.js';
import { each } from 'zrender/lib/core/util.js';
var TMP_TRANSFORM = [];
function transformPoints(points, transform) {
for (var p = 0; p < points.length; p++) {
vec2.applyTransform(points[p], points[p], transform);
}
}
function updateBBoxFromPoints(points, min, max, projection) {
for (var i = 0; i < points.length; i++) {
var p = points[i];
if (projection) {
// projection may return null point.
p = projection.project(p);
}
if (p && isFinite(p[0]) && isFinite(p[1])) {
vec2.min(min, min, p);
vec2.max(max, max, p);
}
}
}
function centroid(points) {
var signedArea = 0;
var cx = 0;
var cy = 0;
var len = points.length;
var x0 = points[len - 1][0];
var y0 = points[len - 1][1];
// Polygon should been closed.
for (var i = 0; i < len; i++) {
var x1 = points[i][0];
var y1 = points[i][1];
var a = x0 * y1 - x1 * y0;
signedArea += a;
cx += (x0 + x1) * a;
cy += (y0 + y1) * a;
x0 = x1;
y0 = y1;
}
return signedArea ? [cx / signedArea / 3, cy / signedArea / 3, signedArea] : [points[0][0] || 0, points[0][1] || 0];
}
var Region = /** @class */function () {
function Region(name) {
this.name = name;
}
Region.prototype.setCenter = function (center) {
this._center = center;
};
/**
* Get center point in data unit. That is,
* for GeoJSONRegion, the unit is lat/lng,
* for GeoSVGRegion, the unit is SVG local coord.
*/
Region.prototype.getCenter = function () {
var center = this._center;
if (!center) {
// In most cases there are no need to calculate this center.
// So calculate only when called.
center = this._center = this.calcCenter();
}
return center;
};
return Region;
}();
export { Region };
var GeoJSONPolygonGeometry = /** @class */function () {
function GeoJSONPolygonGeometry(exterior, interiors) {
this.type = 'polygon';
this.exterior = exterior;
this.interiors = interiors;
}
return GeoJSONPolygonGeometry;
}();
export { GeoJSONPolygonGeometry };
var GeoJSONLineStringGeometry = /** @class */function () {
function GeoJSONLineStringGeometry(points) {
this.type = 'linestring';
this.points = points;
}
return GeoJSONLineStringGeometry;
}();
export { GeoJSONLineStringGeometry };
var GeoJSONRegion = /** @class */function (_super) {
__extends(GeoJSONRegion, _super);
function GeoJSONRegion(name, geometries, cp) {
var _this = _super.call(this, name) || this;
_this.type = 'geoJSON';
_this.geometries = geometries;
_this._center = cp && [cp[0], cp[1]];
return _this;
}
GeoJSONRegion.prototype.calcCenter = function () {
var geometries = this.geometries;
var largestGeo;
var largestGeoSize = 0;
for (var i = 0; i < geometries.length; i++) {
var geo = geometries[i];
var exterior = geo.exterior;
// Simple trick to use points count instead of polygon area as region size.
// Ignore linestring
var size = exterior && exterior.length;
if (size > largestGeoSize) {
largestGeo = geo;
largestGeoSize = size;
}
}
if (largestGeo) {
return centroid(largestGeo.exterior);
}
// from bounding rect by default.
var rect = this.getBoundingRect();
return [rect.x + rect.width / 2, rect.y + rect.height / 2];
};
GeoJSONRegion.prototype.getBoundingRect = function (projection) {
var rect = this._rect;
// Always recalculate if using projection.
if (rect && !projection) {
return rect;
}
var min = [Infinity, Infinity];
var max = [-Infinity, -Infinity];
var geometries = this.geometries;
each(geometries, function (geo) {
if (geo.type === 'polygon') {
// Doesn't consider hole
updateBBoxFromPoints(geo.exterior, min, max, projection);
} else {
each(geo.points, function (points) {
updateBBoxFromPoints(points, min, max, projection);
});
}
});
// Normalie invalid bounding.
if (!(isFinite(min[0]) && isFinite(min[1]) && isFinite(max[0]) && isFinite(max[1]))) {
min[0] = min[1] = max[0] = max[1] = 0;
}
rect = new BoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]);
if (!projection) {
this._rect = rect;
}
return rect;
};
GeoJSONRegion.prototype.contain = function (coord) {
var rect = this.getBoundingRect();
var geometries = this.geometries;
if (!rect.contain(coord[0], coord[1])) {
return false;
}
loopGeo: for (var i = 0, len = geometries.length; i < len; i++) {
var geo = geometries[i];
// Only support polygon.
if (geo.type !== 'polygon') {
continue;
}
var exterior = geo.exterior;
var interiors = geo.interiors;
if (polygonContain.contain(exterior, coord[0], coord[1])) {
// Not in the region if point is in the hole.
for (var k = 0; k < (interiors ? interiors.length : 0); k++) {
if (polygonContain.contain(interiors[k], coord[0], coord[1])) {
continue loopGeo;
}
}
return true;
}
}
return false;
};
/**
* Transform the raw coords to target bounding.
* @param x
* @param y
* @param width
* @param height
*/
GeoJSONRegion.prototype.transformTo = function (x, y, width, height) {
var rect = this.getBoundingRect();
var aspect = rect.width / rect.height;
if (!width) {
width = aspect * height;
} else if (!height) {
height = width / aspect;
}
var target = new BoundingRect(x, y, width, height);
var transform = rect.calculateTransform(target);
var geometries = this.geometries;
for (var i = 0; i < geometries.length; i++) {
var geo = geometries[i];
if (geo.type === 'polygon') {
transformPoints(geo.exterior, transform);
each(geo.interiors, function (interior) {
transformPoints(interior, transform);
});
} else {
each(geo.points, function (points) {
transformPoints(points, transform);
});
}
}
rect = this._rect;
rect.copy(target);
// Update center
this._center = [rect.x + rect.width / 2, rect.y + rect.height / 2];
};
GeoJSONRegion.prototype.cloneShallow = function (name) {
name == null && (name = this.name);
var newRegion = new GeoJSONRegion(name, this.geometries, this._center);
newRegion._rect = this._rect;
newRegion.transformTo = null; // Simply avoid to be called.
return newRegion;
};
return GeoJSONRegion;
}(Region);
export { GeoJSONRegion };
var GeoSVGRegion = /** @class */function (_super) {
__extends(GeoSVGRegion, _super);
function GeoSVGRegion(name, elOnlyForCalculate) {
var _this = _super.call(this, name) || this;
_this.type = 'geoSVG';
_this._elOnlyForCalculate = elOnlyForCalculate;
return _this;
}
GeoSVGRegion.prototype.calcCenter = function () {
var el = this._elOnlyForCalculate;
var rect = el.getBoundingRect();
var center = [rect.x + rect.width / 2, rect.y + rect.height / 2];
var mat = matrix.identity(TMP_TRANSFORM);
var target = el;
while (target && !target.isGeoSVGGraphicRoot) {
matrix.mul(mat, target.getLocalTransform(), mat);
target = target.parent;
}
matrix.invert(mat, mat);
vec2.applyTransform(center, center, mat);
return center;
};
return GeoSVGRegion;
}(Region);
export { GeoSVGRegion };