UNPKG

@itwin/core-frontend

Version:
162 lines 8.18 kB
"use strict"; /*--------------------------------------------------------------------------------------------- * Copyright (c) Bentley Systems, Incorporated. All rights reserved. * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ /** @packageDocumentation * @module Tiles */ Object.defineProperty(exports, "__esModule", { value: true }); exports.MapCartoRectangle = void 0; const core_geometry_1 = require("@itwin/core-geometry"); const core_common_1 = require("@itwin/core-common"); const scratchMercatorFractionRange = core_geometry_1.Range2d.createNull(); const scratchPoint2d = core_geometry_1.Point2d.createZero(); /** A specialization of [Range2d]($core-geometry) representing a [Cartographic]($common) region on the surface of the Earth, * used by [[MapTile]]s. * The `x` components of the `low` and `high` points refer to the western and eastern longitudes, respectively. * The `y` components of the `low` and `high` points refer to the southern and northern latitudes, respectively. * Longitudes are stored in radians in the range [-pi, pi]. * Latitudes are stored in radians in the range [-pi/2, pi/2]. * @public */ class MapCartoRectangle extends core_geometry_1.Range2d { /** Construct a new rectangle with angles specified in radians. * @param west The western longitude in radians, in [-pi, pi]. * @param south The southern latitude in radians, in [-pi/2, pi/2]. * @param east The eastern latitude in radians, in [-pi, pi]. * @param north The northern latitude in radians, in [-pi/2, pi/2]. * @note If `north` is less than `south`, they will be swapped. * @see [[fromRadians]], [[fromDegrees]], [[createZero]], and [[createMaximum]] to construct a new rectangle. */ constructor(west, south, east, north) { super(west, Math.min(south, north), east, Math.max(south, north)); } /** Create a rectangle with all angles set to zero. */ static createZero() { return new MapCartoRectangle(0, 0, 0, 0); } /** Create a rectangle encompassing all points on the surface of the Earth. */ static createMaximum() { return new MapCartoRectangle(-core_geometry_1.Angle.piRadians, -core_geometry_1.Angle.piOver2Radians, core_geometry_1.Angle.piRadians, core_geometry_1.Angle.piOver2Radians); } /** Create a new rectangle with angles specified in radians. * @param west The western longitude in radians, in [-pi, pi]. * @param south The southern latitude in radians, in [-pi/2, pi/2]. * @param east The eastern latitude in radians, in [-pi, pi]. * @param north The northern latitude in radians, in [-pi/2, pi/2]. * @param result An optional preallocated rectangle to hold the result. * @note If `north` is less than `south`, they will be swapped. */ static fromRadians(west, south, east, north, result) { result = result ?? MapCartoRectangle.createZero(); result.setRadians(west, south, east, north); return result; } /** Create a new rectangle with angles specified in degrees. * @param west The western longitude in degrees, in [-180, 180]. * @param south The southern latitude in degrees, in [-90, 90]. * @param east The eastern latitude in degrees, in [-180, 180]. * @param north The northern latitude in degrees, in [-90, 90]. * @param result An optional preallocated rectangle to hold the result. * @note If `north` is less than `south`, they will be swapped. */ static fromDegrees(west, south, east, north, result) { const mult = core_geometry_1.Angle.radiansPerDegree; return MapCartoRectangle.fromRadians(west * mult, south * mult, east * mult, north * mult, result); } /** The western longitude in radians. */ get west() { return this.low.x; } set west(x) { this.low.x = x; } /** The southern latitude in radians. */ get south() { return this.low.y; } set south(y) { this.low.y = y; } /** The eastern longitude in radians. */ get east() { return this.high.x; } set east(x) { this.high.x = x; } /** The northern latitude in radians. */ get north() { return this.high.y; } set north(y) { this.high.y = y; } /** A non-localized string representation of this rectangle, for debugging purposes. */ get latLongString() { return `Latitude: ${this.low.y * core_geometry_1.Angle.degreesPerRadian} - ${this.high.y * core_geometry_1.Angle.degreesPerRadian} Longitude: ${this.low.x * core_geometry_1.Angle.degreesPerRadian} - ${this.high.x * core_geometry_1.Angle.degreesPerRadian}`; } /** A pair of [[Cartographic]]s representing the same area as this rectangle. */ get globalLocationArea() { return { southwest: core_common_1.Cartographic.fromRadians({ longitude: this.west, latitude: this.south }), northeast: core_common_1.Cartographic.fromRadians({ longitude: this.east, latitude: this.north }), }; } /** The cartographic center of this rectangle. */ get cartoCenter() { return core_common_1.Cartographic.fromRadians({ longitude: (this.low.x + this.high.x) / 2, latitude: (this.low.y + this.high.y) / 2, }); } /** The [[globalLocationArea]] and [[cartoCenter]] of this rectangle. */ get globalLocation() { return { center: this.cartoCenter, area: this.globalLocationArea, }; } /** Reinitialize this rectangle using angles specified in radians. * @param west The western longitude in radians, in [-pi, pi]. * @param south The southern latitude in radians, in [-pi/2, pi/2]. * @param east The eastern latitude in radians, in [-pi, pi]. * @param north The northern latitude in radians, in [-pi/2, pi/2]. * @note If `north` is less than `south`, they will be swapped. */ setRadians(west = 0, south = 0, east = 0, north = 0) { this.west = west; this.south = south; this.east = east; this.north = north; } /** Returns true if the specified cartographic location is contained within this rectangle's area, ignoring elevation. */ containsCartographic(carto) { return this.containsXY(carto.longitude, carto.latitude); } /** Returns the position at the center of this rectangle, at an elevation of zero. * @param result An optional preallocated Cartographic to store the result. * @returns the center of this rectangle. */ getCenter(result) { return core_common_1.Cartographic.fromRadians({ longitude: (this.west + this.east) / 2, latitude: (this.north + this.south) / 2, height: 0, }, result); } /** Computes fractional coordinates of the specified position within this rectangle's area. * @see [Range2d.worldToLocal]($core-geometry) */ fractionFromCartographic(carto) { const pt = core_geometry_1.Point2d.create(carto.longitude, carto.latitude, scratchPoint2d); return this.worldToLocal(pt); } /** @internal */ getTileFractionRange(tilingScheme) { scratchMercatorFractionRange.low.x = tilingScheme.longitudeToXFraction(this.low.x); scratchMercatorFractionRange.high.x = tilingScheme.longitudeToXFraction(this.high.x); scratchMercatorFractionRange.low.y = tilingScheme.latitudeToYFraction(this.low.y); scratchMercatorFractionRange.high.y = tilingScheme.latitudeToYFraction(this.high.y); return scratchMercatorFractionRange; } /** * Compute rectangle with angles specified in degrees. * @beta */ toDegrees() { return { north: core_geometry_1.Angle.radiansToDegrees(this.north), south: core_geometry_1.Angle.radiansToDegrees(this.south), east: core_geometry_1.Angle.radiansToDegrees(this.east), west: core_geometry_1.Angle.radiansToDegrees(this.west), }; } } exports.MapCartoRectangle = MapCartoRectangle; //# sourceMappingURL=MapCartoRectangle.js.map