xtorcga
Version:
Xtor Compute Geometry Algorithm Libary 计算几何算法库
65 lines (54 loc) • 2.02 kB
text/typescript
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
)
);
}