import { PI_TWO } from "../../src/math/Math"; import { Rectangle } from "../core/Rectangle"; import { Ellipsoid } from "../math/ellipsoid"; export interface IGeographicTilingScheme { ellipsoid?: Ellipsoid, _tilingScheme?: any; numberOfLevelZeroTilesX?: number numberOfLevelZeroTilesY?: number } /** * 地理学块 */ export class GeographicTilingScheme { private _numberOfLevelZeroTilesY: number; private _numberOfLevelZeroTilesX: number; private _rectangle: Rectangle = GeographicTilingScheme.MAX_VALUE; constructor(options: IGeographicTilingScheme = {}) { this._numberOfLevelZeroTilesX = options.numberOfLevelZeroTilesX || 2; this._numberOfLevelZeroTilesY = options.numberOfLevelZeroTilesY || 2; } tileXYToRectangle(x: number, y: number, level: number, result?: Rectangle) { var rectangle = this._rectangle; var xTiles = this.getNumberOfXTilesAtLevel(level); var yTiles = this.getNumberOfYTilesAtLevel(level); var xTileWidth = rectangle.width / xTiles; var west = x * xTileWidth + rectangle.west; var east = (x + 1) * xTileWidth + rectangle.west; var yTileHeight = rectangle.height / yTiles; var north = rectangle.north - y * yTileHeight; var south = rectangle.north - (y + 1) * yTileHeight; if (!result) { result = new Rectangle(west, south, east, north); } result.west = west; result.south = south; result.east = east; result.north = north; return result; } getNumberOfXTilesAtLevel(level: number) { return this._numberOfLevelZeroTilesX << level; }; getNumberOfYTilesAtLevel(level: number) { return this._numberOfLevelZeroTilesY << level; }; static MAX_VALUE = Object.freeze( new Rectangle( -Math.PI, -PI_TWO, Math.PI, PI_TWO ) ); }