/** @packageDocumentation
 * @module Tiles
 */
import { Point2d, Transform } from "@itwin/core-geometry";
import { Cartographic } from "@itwin/core-common";
import { IModelConnection } from "../../IModelConnection";
import { MapCartoRectangle } from "../internal";
/** A scheme for converting between two representations of the surface of the Earth: an ellipsoid and a rectangular [tiled map](https://en.wikipedia.org/wiki/Tiled_web_map).
 * Positions on the surface of the ellipsoid are expressed in [Cartographic]($common) coordinates.
 * Rectangular [[MapTile]]s are projected onto this ellipsoid by the tiling scheme. Tile coordinates are represented by [[QuadId]]s.
 *
 * The tiling scheme represents the (x,y) coordinates of its tiles as fractions in [0,1] along the X and Y axes.
 * An X fraction of 0 corresponds to the easternmost longitude and an X fraction of 1 to the westernmost longitude.
 * The scheme can choose to correlate a Y fraction of 0 with either the north or south pole, as specified by [[rowZeroAtNorthPole]].
 * Implementing a tiling scheme only requires implementing the abstract method [[yFractionToLatitude]] and its inverse, [[latitudeToYFraction]].
 * @public
 */
export declare abstract class MapTilingScheme {
    /** If true, the fractional Y coordinate 0 corresponds to the north pole and 1 to the south pole; otherwise,
     * 0 corresponds to the south pole and 1 to the north.
     */
    readonly rowZeroAtNorthPole: boolean;
    /** The number of tiles in the X direction at level 0 of the quad tree. */
    readonly numberOfLevelZeroTilesX: number;
    /** The number of tiles in the Y direction at level 0 of the quad tree. */
    readonly numberOfLevelZeroTilesY: number;
    private readonly _scratchFraction;
    private readonly _scratchPoint2d;
    /** Convert a longitude in [-pi, pi] radisn to a fraction in [0, 1] along the X axis. */
    longitudeToXFraction(longitude: number): number;
    /** Convert a fraction in [0, 1] along the X axis into a longitude in [-pi, pi] radians. */
    xFractionToLongitude(xFraction: number): number;
    /** Convert a fraction in [0, 1] along the Y axis into a latitude in [-pi/2, pi/2] radians. */
    abstract yFractionToLatitude(yFraction: number): number;
    /** Convert a latitude in [-pi/2, pi/2] radians into a fraction in [0, 1] along the Y axis. */
    abstract latitudeToYFraction(latitude: number): number;
    protected constructor(numberOfLevelZeroTilesX: number, numberOfLevelZeroTilesY: number, rowZeroAtNorthPole: boolean);
    /** The total number of tiles in the X direction at the specified level of detail.
     * @param level The level of detail, with 0 corresponding to the root tile.
     */
    getNumberOfXTilesAtLevel(level: number): number;
    /** The total number of tiles in the Y direction at the specified level of detail.
     * @param level The level of detail, with 0 corresponding to the root tile.
     */
    getNumberOfYTilesAtLevel(level: number): number;
    /** @alpha */
    get rootLevel(): 0 | -1;
    /** @alpha */
    getNumberOfXChildrenAtLevel(level: number): number;
    /** @alpha */
    getNumberOfYChildrenAtLevel(level: number): number;
    /** Given the X component and level of a [[QuadId]], convert it to a fractional distance along the X axis. */
    tileXToFraction(x: number, level: number): number;
    /** Given the Y component and level of a [[QuadId]], convert it to a fractional distance along the Y axis. */
    tileYToFraction(y: number, level: number): number;
    /** Given a fractional distance along the X axis and a level of the quad tree, compute the X component of the corresponding [[QuadId]]. */
    xFractionToTileX(xFraction: number, level: number): number;
    /** Given a fractional distance along the Y axis and a level of the quad tree, compute the Y component of the corresponding [[QuadId]]. */
    yFractionToTileY(yFraction: number, level: number): number;
    /** Given the X component and level of a [[QuadId]], compute its longitude in [-pi, pi] radians. */
    tileXToLongitude(x: number, level: number): number;
    /** Given the Y component and level of a [[QuadId]], compute its latitude in [-pi/2, pi/2] radians. */
    tileYToLatitude(y: number, level: number): number;
    /** Given the components of a [[QuadId]], compute its fractional coordinates in the XY plane. */
    tileXYToFraction(x: number, y: number, level: number, result?: Point2d): Point2d;
    /** Given the components of a [[QuadId]] and an elevation, compute the corresponding [Cartographic]($common) position.
     * @param x The X component of the QuadId.
     * @param y The Y component of the QuadId.
     * @param level The level component of the QuadId.
     * @param height The elevation above the ellipsoid.
     * @returns the corresponding cartographic position.
     */
    tileXYToCartographic(x: number, y: number, level: number, result: Cartographic, height?: number): Cartographic;
    /** Given the components of a [[QuadId]], compute the corresponding region of the Earth's surface. */
    tileXYToRectangle(x: number, y: number, level: number, result?: MapCartoRectangle): MapCartoRectangle;
    /** Returns true if the tile at the specified X coordinate and level is adjacent to the north pole. */
    tileBordersNorthPole(row: number, level: number): boolean;
    /** Returns true if the tile at the specified X coordinate and level is adjacent to the south pole. */
    tileBordersSouthPole(row: number, level: number): boolean;
    /** Given a cartographic position, compute the corresponding position on the surface of the Earth as fractional distances along the
     * X and Y axes.
     */
    cartographicToTileXY(carto: Cartographic, level: number, result?: Point2d): Point2d;
    /** Given fractional coordinates in the XY plane and an elevation, compute the corresponding cartographic position. */
    fractionToCartographic(xFraction: number, yFraction: number, result: Cartographic, height?: number): Cartographic;
    /** Given a cartographic location on the surface of the Earth, convert it to fractional coordinates in the XY plane. */
    cartographicToFraction(latitudeRadians: number, longitudeRadians: number, result: Point2d): Point2d;
    /** @alpha */
    private ecefToPixelFraction;
    /** @alpha */
    computeMercatorFractionToDb(ecefToDb: Transform, bimElevationOffset: number, iModel: IModelConnection, applyTerrain: boolean): Transform;
    /** @alpha */
    protected yFractionFlip(fraction: number): number;
}
/** A [[MapTilingScheme]] using a simple geographic projection by which longitude and latitude are mapped directly to X and Y.
 * This projection is commonly known as "geographic", "equirectangular", "equidistant cylindrical", or "plate carrée".
 * @beta
 */
export declare class GeographicTilingScheme extends MapTilingScheme {
    constructor(numberOfLevelZeroTilesX?: number, numberOfLevelZeroTilesY?: number, rowZeroAtNorthPole?: boolean);
    /** Implements [[MapTilingScheme.yFractionToLatitude]]. */
    yFractionToLatitude(yFraction: number): number;
    /** Implements [[MapTilingScheme.latitudeToYFraction]]. */
    latitudeToYFraction(latitude: number): number;
}
/** @alpha */
export declare class WebMercatorProjection {
    /**
     * Converts a Mercator angle, in the range -PI to PI, to a geodetic latitude
     * in the range -PI/2 to PI/2.
     *
     * @param {Number} mercatorAngle The angle to convert.
     * @returns {Number} The geodetic latitude in radians.
     */
    static mercatorAngleToGeodeticLatitude(mercatorAngle: number): number;
    static maximumLatitude: number;
    static geodeticLatitudeToMercatorAngle(latitude: number): number;
}
/** A [[MapTilingScheme]] using the [EPSG:3857](https://en.wikipedia.org/wiki/Web_Mercator_projection) projection.
 * This scheme is used by most [tiled web maps](https://en.wikipedia.org/wiki/Tiled_web_map), including Bing Maps and Google Maps.
 * @beta
 */
export declare class WebMercatorTilingScheme extends MapTilingScheme {
    constructor(numberOfLevelZeroTilesX?: number, numberOfLevelZeroTilesY?: number, rowZeroAtNorthPole?: boolean);
    /** Implements [[MapTilingScheme.yFractionToLatitude]]. */
    yFractionToLatitude(yFraction: number): number;
    /** Implements [[MapTilingScheme.latitudeToYFraction. */
    latitudeToYFraction(latitude: number): number;
}
//# sourceMappingURL=MapTilingScheme.d.ts.map