Skip to content

Commit

Permalink
Support epsg 4326 map layer projections + ESRI tilemap fixes (#2473)
Browse files Browse the repository at this point in the history
* Allow image provider to spedify tiling scheme

* Rework and correct child availability

* Fix _testChildAvailability when arcgis server has a minimum zoom level.

* Handle arcgis testmap errors

* Restored ESRI tilemap caching. (#2452)

* WIP - restored tilemap cache

* Added calls queue.

* Created a call queue for each LOD.
 Check cache before queuing a call.
When error 422 is returned, mark all corresponding tiles to non-available.
Added tests.

* Now make a second request if first tilemap got clipped by server.
Improved tests and documentation.
code cleanup

* Code clean up.

* Rework tiling scheme to have uniform levels for all tiling schemes

* Request workaround and removed unused baseLevel

* Remove force4326 from WTMS

* Code clean up

* Fixed lint in error.

* Added change logs.

* WmtsMapLayerFormat.validateSource was not checking for WGS84 tile matrixsets

* Removed void async method in ArcGISMapLayerImageryProvider._generateChildIds, disable ellint/no-floating-promises instead.

* Removed .only in ArcGISTileMap test suite.

* Removed no longer needed eslint rule disabling instructions.

* Reverted testing code for EPSG:4326.

* GeographicTiling

* rowZeroAtNorth for map layer imagery providers

* Base imagery draping on width to handle 4326 drape on width

* Correct fix for fraction at root tile.

* Fixed issue where style identifier for layer was missing, removed the style= param from the request in that case.

* install-run-rushx.js

* Correct approximate terrain calculation.

* Add tests for approximate heights

* Remove .only from test

* Merge

* extract-api

Co-authored-by: Ray.Bentley <[email protected]>
Co-authored-by: Paul Connelly <[email protected]>
  • Loading branch information
3 people authored Nov 1, 2021
1 parent 1a8826e commit ec78ce4
Show file tree
Hide file tree
Showing 20 changed files with 2,723 additions and 2,023 deletions.
78 changes: 67 additions & 11 deletions common/api/core-frontend.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -1110,6 +1110,8 @@ export class ArcGISMapLayerImageryProvider extends MapLayerImageryProvider {
// (undocumented)
protected get _filterByCartoRange(): boolean;
// (undocumented)
protected _generateChildIds(tile: ImageryMapTile, resolveChildren: (childIds: QuadId[]) => void): void;
// (undocumented)
protected getLayerString(prefix?: string): string;
// (undocumented)
getLogo(_vp: ScreenViewport): HTMLTableRowElement;
Expand All @@ -1126,14 +1128,34 @@ export class ArcGISMapLayerImageryProvider extends MapLayerImageryProvider {
// (undocumented)
serviceJson: any;
// (undocumented)
protected _testChildAvailability(tile: ImageryMapTile, resolveChildren: () => void): void;
// (undocumented)
uintToString(uintArray: any): {
type: "Buffer";
data: number[];
};
}

// @internal (undocumented)
export class ArcGISTileMap {
constructor(restBaseUrl: string, nbLods?: number);
// (undocumented)
fallbackTileMapRequestSize: number;
// (undocumented)
protected fetchAndReadTilemap(queryTiles: QuadId[], reqWidth: number, reqHeight: number): Promise<boolean[]>;
// (undocumented)
protected fetchTileMapFromServer(level: number, row: number, column: number, width: number, height: number): Promise<any>;
// (undocumented)
protected getAvailableTilesFromCache(tiles: QuadId[]): {
allTilesFound: boolean;
available: boolean[];
};
// (undocumented)
getChildrenAvailability(childIds: QuadId[]): Promise<boolean[]>;
// (undocumented)
protected getChildrenAvailabilityFromServer(childIds: QuadId[]): Promise<boolean[]>;
// (undocumented)
tileMapRequestSize: number;
}

// @internal (undocumented)
export interface ArcGisToken {
// (undocumented)
Expand Down Expand Up @@ -4245,7 +4267,7 @@ export class ImageryMapTile extends RealityTile {
// (undocumented)
get texture(): RenderTexture | undefined;
// (undocumented)
get tilingScheme(): WebMercatorTilingScheme;
get tilingScheme(): MapTilingScheme;
}

// @internal (undocumented)
Expand All @@ -4270,7 +4292,7 @@ export class ImageryMapTileTree extends RealityTileTree {
// (undocumented)
protected _selectTiles(_args: TileDrawArgs): Tile[];
// (undocumented)
tilingScheme: WebMercatorTilingScheme;
get tilingScheme(): MapTilingScheme;
// (undocumented)
get viewFlagOverrides(): ViewFlagOverrides;
}
Expand Down Expand Up @@ -5238,6 +5260,10 @@ export abstract class MapLayerImageryProvider {
// (undocumented)
protected get _filterByCartoRange(): boolean;
// (undocumented)
generateChildIds(tile: ImageryMapTile, resolveChildren: (childIds: QuadId[]) => void): void;
// (undocumented)
protected _generateChildIds(tile: ImageryMapTile, resolveChildren: (childIds: QuadId[]) => void): void;
// (undocumented)
getEPSG3857Extent(row: number, column: number, zoomLevel: number): {
left: number;
right: number;
Expand All @@ -5255,9 +5281,11 @@ export abstract class MapLayerImageryProvider {
// (undocumented)
getLogo(_viewport: ScreenViewport): HTMLTableRowElement | undefined;
// (undocumented)
getPotentialChildIds(tile: ImageryMapTile): QuadId[];
// (undocumented)
protected getRequestAuthorization(): RequestBasicCredentials | undefined;
// (undocumented)
getToolTip(_strings: string[], _quadId: QuadId, _carto: Cartographic, _tree: ImageryMapTileTree): Promise<void>;
getToolTip(strings: string[], quadId: QuadId, _carto: Cartographic, tree: ImageryMapTileTree): Promise<void>;
// (undocumented)
protected _hasSuccessfullyFetchedTile: boolean;
// (undocumented)
Expand Down Expand Up @@ -5287,18 +5315,18 @@ export abstract class MapLayerImageryProvider {
// (undocumented)
status: MapLayerImageryProviderStatus;
// (undocumented)
testChildAvailability(tile: ImageryMapTile, resolveChildren: () => void): void;
// (undocumented)
protected _testChildAvailability(_tile: ImageryMapTile, resolveChildren: () => void): void;
// (undocumented)
get tileSize(): number;
// (undocumented)
get tilingScheme(): MapTilingScheme;
// (undocumented)
protected toolTipFromJsonUrl(_strings: string[], url: string): Promise<void>;
// (undocumented)
protected toolTipFromUrl(strings: string[], url: string): Promise<void>;
// (undocumented)
get transparentBackgroundString(): string;
// (undocumented)
get useGeographicTilingScheme(): boolean;
// (undocumented)
get usesCachedTiles(): boolean;
// (undocumented)
protected _usesCachedTiles: boolean;
Expand Down Expand Up @@ -5776,14 +5804,18 @@ export class MapTileTreeReference extends TileTreeReference {

// @internal (undocumented)
export abstract class MapTilingScheme {
protected constructor(numberOfLevelZeroTilesX: number, numberOfLevelZeroTilesY: number, rowZeroAtNorthPole: boolean);
protected constructor(numberOfLevelZeroTilesX: number, numberOfLevelZeroTilesY: number, rowZeroAtNorthPole: boolean, _rectangle?: Range2d);
// (undocumented)
cartographicToFraction(latitudeRadians: number, longitudeRadians: number, result: Point2d): Point2d;
cartographicToTileXY(carto: Cartographic, level: number, result?: Point2d): Point2d;
// (undocumented)
computeMercatorFractionToDb(ecefToDb: Transform, bimElevationOffset: number, iModel: IModelConnection, applyTerrain: boolean): Transform;
fractionToCartographic(xFraction: number, yFraction: number, result: Cartographic, height?: number): Cartographic;
// (undocumented)
getNumberOfXChildrenAtLevel(level: number): number;
getNumberOfXTilesAtLevel(level: number): number;
// (undocumented)
getNumberOfYChildrenAtLevel(level: number): number;
getNumberOfYTilesAtLevel(level: number): number;
// (undocumented)
abstract latitudeToYFraction(latitude: number): number;
Expand All @@ -5794,6 +5826,8 @@ export abstract class MapTilingScheme {
// (undocumented)
readonly numberOfLevelZeroTilesY: number;
// (undocumented)
get rootLevel(): 0 | -1;
// (undocumented)
rowZeroAtNorthPole: boolean;
// (undocumented)
tileBordersNorthPole(row: number, level: number): boolean;
Expand All @@ -5815,6 +5849,8 @@ export abstract class MapTilingScheme {
// (undocumented)
xFractionToTileX(xFraction: number, level: number): number;
// (undocumented)
protected yFractionFlip(fraction: number): number;
// (undocumented)
abstract yFractionToLatitude(yFraction: number): number;
// (undocumented)
yFractionToTileY(yFraction: number, level: number): number;
Expand Down Expand Up @@ -7268,6 +7304,8 @@ export class QuadId {
// (undocumented)
getLatLongRange(mapTilingScheme: MapTilingScheme): Range2d;
// (undocumented)
static getTileContentId(level: number, column: number, row: number): string;
// (undocumented)
get isValid(): boolean;
// (undocumented)
level: number;
Expand Down Expand Up @@ -13283,6 +13321,8 @@ export namespace WmtsCapability {
export class Contents {
constructor(_json: any);
// (undocumented)
getEpsg4326CompatibleTileMatrixSet(): WmtsCapability.TileMatrixSet[];
// (undocumented)
getGoogleMapsCompatibleTileMatrixSet(): WmtsCapability.TileMatrixSet[];
// (undocumented)
readonly layers: WmtsCapability.Layer[];
Expand Down Expand Up @@ -13457,10 +13497,20 @@ export namespace WmtsCapability {
readonly wellKnownScaleSet: string;
}
// (undocumented)
export class TileMatrixSetLimits {
constructor(_json: any);
// (undocumented)
limits?: Range2d;
// (undocumented)
tileMatrix?: string;
}
// (undocumented)
export class TileMatrixSetLink {
constructor(_json: any);
// (undocumented)
readonly tileMatrixSet: string;
// (undocumented)
readonly tileMatrixSetLimits: TileMatrixSetLimits[];
}
// (undocumented)
export abstract class XmlConstants {
Expand Down Expand Up @@ -13503,10 +13553,16 @@ export class WmtsMapLayerImageryProvider extends MapLayerImageryProvider {
// (undocumented)
constructUrl(row: number, column: number, zoomLevel: number): Promise<string>;
// (undocumented)
displayedLayerName: string;
// (undocumented)
protected _generateChildIds(tile: ImageryMapTile, resolveChildren: (childIds: QuadId[]) => void): void;
// (undocumented)
initialize(): Promise<void>;
// (undocumented)
get mutualExclusiveSubLayer(): boolean;
}
// (undocumented)
get useGeographicTilingScheme(): boolean;
}

// @public
export interface ZoomToOptions {
Expand Down
1 change: 1 addition & 0 deletions common/api/summary/core-frontend.exports.csv
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public;Animator
internal;ArcGisErrorCode
internal;ArcGisGenerateTokenOptions
internal;ArcGISMapLayerImageryProvider
internal;ArcGISTileMap
internal;ArcGisToken
internal;ArcGisTokenClientType
internal;ArcGisTokenGenerator
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"changes": [
{
"packageName": "@itwin/core-frontend",
"comment": "Rework and correct child availability of tiled imagery formats. Added EPSG:4326 support for WMTS.",
"type": "none"
}
],
"packageName": "@itwin/core-frontend"
}
6 changes: 3 additions & 3 deletions core/frontend/src/ApproximateTerrainHeights.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ export class ApproximateTerrainHeights {
if (undefined === this._terrainHeights)
return result; // Not initialized.

let level = quadId.level - 1, column = quadId.column, row = quadId.row;
if (quadId.level > 6) {
let level = quadId.level, column = quadId.column, row = quadId.row;
if (level > 6) {
column = column >> (level - 6);
row = row >> quadId.row >> ((level - 6));
level = 6;
Expand Down Expand Up @@ -99,7 +99,7 @@ export class ApproximateTerrainHeights {
let failed = false;
for (let j = 0; j < 4; ++j) {
const corner = this._scratchCorners[j];
this._tilingScheme.cartographicToTileXY(corner, i + 1, this._scratchTileXY); // Note level for iModelJS is Cesium+1 (our root is zero).
this._tilingScheme.cartographicToTileXY(corner, i, this._scratchTileXY);
if (j === 0) {
currentX = this._scratchTileXY.x;
currentY = this._scratchTileXY.y;
Expand Down
30 changes: 30 additions & 0 deletions core/frontend/src/test/tile/map/ApproximateTerrainHeights.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
import { Range1d } from "@itwin/core-geometry";
import { expect } from "chai";
import { ApproximateTerrainHeights } from "../../../ApproximateTerrainHeights";
import { GeographicTilingScheme, QuadId } from "../../../core-frontend";

describe("ApproximateTerrainHeights", () => {
it("test correct heights", async () => {
const tilingScheme = new GeographicTilingScheme();
const testPairs = [
{ id: new QuadId(3, 2, 1), range: Range1d.createXX(-102.31, 3682.63) },
{ id: new QuadId(5, 4, 4), range: Range1d.createXX(-132.79, 3970.41) },
{ id: new QuadId(6, 32, 31), range: Range1d.createXX(-20.88, 716.38) },
{ id: new QuadId(8, 21, 11), range: Range1d.createXX(-98.4, -43.74) },
{ id: new QuadId(0, 0, 0), range: Range1d.createXX(-400, 90000) },
];
const terrainHeights = ApproximateTerrainHeights.instance;
await terrainHeights.initialize();

testPairs.forEach((pair) => {
const quadId = pair.id;
const rectangle = tilingScheme.tileXYToRectangle(quadId.column, quadId.row, quadId.level);
const heightRange = terrainHeights.getMinimumMaximumHeights(rectangle);
expect(heightRange.isAlmostEqual(pair.range)).to.be.true;
});
});
});
Loading

0 comments on commit ec78ce4

Please sign in to comment.