Skip to content

Commit ef95027

Browse files
authoredFeb 18, 2020
Merge pull request #8616 from AnalyticalGraphicsInc/web-mercator-terrain-tiling-scheme
In-repo version of jtfell's #8563
2 parents e71d5b9 + 4dd1b5d commit ef95027

File tree

4 files changed

+60
-20
lines changed

4 files changed

+60
-20
lines changed
 

‎CHANGES.md

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ Change Log
88
* Added `Entity.tileset` for loading a 3D Tiles tileset via the Entity API using the new `Cesium3DTilesetGraphics` class.
99
* Added `tileset.uri`, `tileset.show`, and `tileset.maximumScreenSpaceError` properties to CZML processing for loading 3D Tiles.
1010
* Added `Color.lerp` for linearly interpolating between two RGB colors. [#8607](https://github.com/AnalyticalGraphicsInc/cesium/pull/8607)
11+
* `CesiumTerrainProvider` now supports terrain tiles using a `WebMercatorTilingScheme` by specifying `"projection": "EPSG:3857"` in `layer.json`. It also now supports numbering tiles from the North instead of the South by specifying `"scheme": "slippyMap"` in `layer.json`. [#8563](https://github.com/AnalyticalGraphicsInc/cesium/pull/8563)
1112

1213
##### Fixes :wrench:
1314

‎CONTRIBUTORS.md

+1
Original file line numberDiff line numberDiff line change
@@ -245,3 +245,4 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to contribute to Cesiu
245245
* [André Borud](https://github.com/andreborud)
246246
* [Nathan Schulte](https://github.com/nmschulte)
247247
* [Jan Wąsak](https://github.com/jhnwsk)
248+
* [Julian Fell](https://github.com/jtfell)

‎Source/Core/CesiumTerrainProvider.js

+49-17
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import defineProperties from './defineProperties.js';
99
import DeveloperError from './DeveloperError.js';
1010
import Event from './Event.js';
1111
import GeographicTilingScheme from './GeographicTilingScheme.js';
12+
import WebMercatorTilingScheme from './WebMercatorTilingScheme.js';
1213
import getStringFromTypedArray from './getStringFromTypedArray.js';
1314
import HeightmapTerrainData from './HeightmapTerrainData.js';
1415
import IndexDatatype from './IndexDatatype.js';
@@ -72,18 +73,11 @@ import TileProviderError from './TileProviderError.js';
7273
}
7374
//>>includeEnd('debug');
7475

75-
this._tilingScheme = new GeographicTilingScheme({
76-
numberOfLevelZeroTilesX : 2,
77-
numberOfLevelZeroTilesY : 1,
78-
ellipsoid : options.ellipsoid
79-
});
80-
8176
this._heightmapWidth = 65;
82-
this._levelZeroMaximumGeometricError = TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap(this._tilingScheme.ellipsoid, this._heightmapWidth, this._tilingScheme.getNumberOfXTilesAtLevel(0));
83-
8477
this._heightmapStructure = undefined;
8578
this._hasWaterMask = false;
8679
this._hasVertexNormals = false;
80+
this._ellipsoid = options.ellipsoid;
8781

8882
/**
8983
* Boolean flag that indicates if the client should request vertex normals from the server.
@@ -198,6 +192,38 @@ import TileProviderError from './TileProviderError.js';
198192
var maxZoom = data.maxzoom;
199193
overallMaxZoom = Math.max(overallMaxZoom, maxZoom);
200194
// Keeps track of which of the availablity containing tiles have been loaded
195+
196+
if (!data.projection || data.projection === 'EPSG:4326') {
197+
that._tilingScheme = new GeographicTilingScheme({
198+
numberOfLevelZeroTilesX : 2,
199+
numberOfLevelZeroTilesY : 1,
200+
ellipsoid : that._ellipsoid
201+
});
202+
} else if (data.projection === 'EPSG:3857') {
203+
that._tilingScheme = new WebMercatorTilingScheme({
204+
numberOfLevelZeroTilesX : 1,
205+
numberOfLevelZeroTilesY : 1,
206+
ellipsoid : that._ellipsoid
207+
});
208+
} else {
209+
message = 'The projection "' + data.projection + '" is invalid or not supported.';
210+
metadataError = TileProviderError.handleError(metadataError, that, that._errorEvent, message, undefined, undefined, undefined, requestLayerJson);
211+
return;
212+
}
213+
214+
that._levelZeroMaximumGeometricError = TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap(
215+
that._tilingScheme.ellipsoid,
216+
that._heightmapWidth,
217+
that._tilingScheme.getNumberOfXTilesAtLevel(0)
218+
);
219+
if (!data.scheme || data.scheme === 'tms' || data.scheme === 'slippyMap') {
220+
that._scheme = data.scheme;
221+
} else {
222+
message = 'The scheme "' + data.scheme + '" is invalid or not supported.';
223+
metadataError = TileProviderError.handleError(metadataError, that, that._errorEvent, message, undefined, undefined, undefined, requestLayerJson);
224+
return;
225+
}
226+
201227
var availabilityTilesLoaded;
202228

203229
// The vertex normals defined in the 'octvertexnormals' extension is identical to the original
@@ -402,7 +428,7 @@ import TileProviderError from './TileProviderError.js';
402428
};
403429
}
404430

405-
function createHeightmapTerrainData(provider, buffer, level, x, y, tmsY) {
431+
function createHeightmapTerrainData(provider, buffer, level, x, y) {
406432
var heightBuffer = new Uint16Array(buffer, 0, provider._heightmapWidth * provider._heightmapWidth);
407433
return new HeightmapTerrainData({
408434
buffer : heightBuffer,
@@ -415,7 +441,7 @@ import TileProviderError from './TileProviderError.js';
415441
});
416442
}
417443

418-
function createQuantizedMeshTerrainData(provider, buffer, level, x, y, tmsY, layer) {
444+
function createQuantizedMeshTerrainData(provider, buffer, level, x, y, layer) {
419445
var littleEndianExtensionSize = layer.littleEndianExtensionSize;
420446
var pos = 0;
421447
var cartesian3Elements = 3;
@@ -633,9 +659,14 @@ import TileProviderError from './TileProviderError.js';
633659
return undefined;
634660
}
635661

636-
var yTiles = provider._tilingScheme.getNumberOfYTilesAtLevel(level);
637-
638-
var tmsY = (yTiles - y - 1);
662+
// The TileMapService scheme counts from the bottom left
663+
var terrainY;
664+
if (!provider._scheme || provider._scheme === 'tms') {
665+
var yTiles = provider._tilingScheme.getNumberOfYTilesAtLevel(level);
666+
terrainY = (yTiles - y - 1);
667+
} else {
668+
terrainY = y;
669+
}
639670

640671
var extensionList = [];
641672
if (provider._requestVertexNormals && layerToUse.hasVertexNormals) {
@@ -650,7 +681,8 @@ import TileProviderError from './TileProviderError.js';
650681

651682
var headers;
652683
var query;
653-
var url = urlTemplates[(x + tmsY + level) % urlTemplates.length];
684+
var url = urlTemplates[(x + terrainY + level) % urlTemplates.length];
685+
654686
var resource = layerToUse.resource;
655687
if (defined(resource._ionEndpoint) && !defined(resource._ionEndpoint.externalType)) {
656688
// ion uses query paremeters to request extensions
@@ -669,7 +701,7 @@ import TileProviderError from './TileProviderError.js';
669701
version: layerToUse.version,
670702
z: level,
671703
x: x,
672-
y: tmsY
704+
y: terrainY
673705
},
674706
queryParameters: query,
675707
headers: headers,
@@ -682,9 +714,9 @@ import TileProviderError from './TileProviderError.js';
682714

683715
return promise.then(function (buffer) {
684716
if (defined(provider._heightmapStructure)) {
685-
return createHeightmapTerrainData(provider, buffer, level, x, y, tmsY);
717+
return createHeightmapTerrainData(provider, buffer, level, x, y);
686718
}
687-
return createQuantizedMeshTerrainData(provider, buffer, level, x, y, tmsY, layerToUse);
719+
return createQuantizedMeshTerrainData(provider, buffer, level, x, y, layerToUse);
688720
});
689721
}
690722

‎Specs/Core/CesiumTerrainProviderSpec.js

+9-3
Original file line numberDiff line numberDiff line change
@@ -206,13 +206,19 @@ describe('Core/CesiumTerrainProvider', function() {
206206
});
207207

208208
it('returns reasonable geometric error for various levels', function() {
209+
returnQuantizedMeshTileJson();
210+
209211
var provider = new CesiumTerrainProvider({
210212
url : 'made/up/url'
211213
});
212214

213-
expect(provider.getLevelMaximumGeometricError(0)).toBeGreaterThan(0.0);
214-
expect(provider.getLevelMaximumGeometricError(0)).toEqualEpsilon(provider.getLevelMaximumGeometricError(1) * 2.0, CesiumMath.EPSILON10);
215-
expect(provider.getLevelMaximumGeometricError(1)).toEqualEpsilon(provider.getLevelMaximumGeometricError(2) * 2.0, CesiumMath.EPSILON10);
215+
return pollToPromise(function() {
216+
return provider.ready;
217+
}).then(function() {
218+
expect(provider.getLevelMaximumGeometricError(0)).toBeGreaterThan(0.0);
219+
expect(provider.getLevelMaximumGeometricError(0)).toEqualEpsilon(provider.getLevelMaximumGeometricError(1) * 2.0, CesiumMath.EPSILON10);
220+
expect(provider.getLevelMaximumGeometricError(1)).toEqualEpsilon(provider.getLevelMaximumGeometricError(2) * 2.0, CesiumMath.EPSILON10);
221+
});
216222
});
217223

218224
it('logo is undefined if credit is not provided', function() {

0 commit comments

Comments
 (0)
Please sign in to comment.