123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- /*
- * 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 };
|