Skip to content

Commit 5d499c5

Browse files
author
Hannah
authored
Merge pull request #5696 from oterral/time
Allow custom parameters in the template url of an UrlTemplateImageryP…
2 parents 63b7486 + d6abaf1 commit 5d499c5

File tree

3 files changed

+98
-34
lines changed

3 files changed

+98
-34
lines changed

CHANGES.md

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Change Log
66
* Added support for the layer.json `parentUrl` property in `CesiumTerrainProvider` to allow for compositing of tilesets.
77
* Fixed a bug that caused KML ground overlays to appear distorted when rotation was applied. [#5914](https://github.com/AnalyticalGraphicsInc/cesium/issues/5914)
88
* Adds `invertClassification` and `invertClassificationColor` to `Scene`. When `invertClassification` is `true`, any 3D Tiles geometry that is not classified by a `ClassificationPrimitive` or `GroundPrimitive` will have its color multiplied by `invertClassificationColor`. [#5836](https://github.com/AnalyticalGraphicsInc/cesium/pull/5836)
9+
* Added `customTags` property to the UrlTemplateImageryProvider to allow custom keywords in the template URL. [#5696](https://github.com/AnalyticalGraphicsInc/cesium/pull/5696)
910

1011
### 1.38 - 2017-10-02
1112

Source/Scene/UrlTemplateImageryProvider.js

+69-34
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,38 @@ define([
4444
ImageryProvider) {
4545
'use strict';
4646

47+
var tags = {
48+
'{x}': xTag,
49+
'{y}': yTag,
50+
'{z}': zTag,
51+
'{s}': sTag,
52+
'{reverseX}': reverseXTag,
53+
'{reverseY}': reverseYTag,
54+
'{reverseZ}': reverseZTag,
55+
'{westDegrees}': westDegreesTag,
56+
'{southDegrees}': southDegreesTag,
57+
'{eastDegrees}': eastDegreesTag,
58+
'{northDegrees}': northDegreesTag,
59+
'{westProjected}': westProjectedTag,
60+
'{southProjected}': southProjectedTag,
61+
'{eastProjected}': eastProjectedTag,
62+
'{northProjected}': northProjectedTag,
63+
'{width}': widthTag,
64+
'{height}': heightTag
65+
};
66+
67+
var pickFeaturesTags = combine(tags, {
68+
'{i}' : iTag,
69+
'{j}' : jTag,
70+
'{reverseI}' : reverseITag,
71+
'{reverseJ}' : reverseJTag,
72+
'{longitudeDegrees}' : longitudeDegreesTag,
73+
'{latitudeDegrees}' : latitudeDegreesTag,
74+
'{longitudeProjected}' : longitudeProjectedTag,
75+
'{latitudeProjected}' : latitudeProjectedTag,
76+
'{format}' : formatTag
77+
});
78+
4779
/**
4880
* Provides imagery by requesting tiles using a specified URL template.
4981
*
@@ -132,6 +164,7 @@ define([
132164
* source does not support picking features or if you don't want this provider's features to be pickable. Note
133165
* that this can be dynamically overridden by modifying the {@link UriTemplateImageryProvider#enablePickFeatures}
134166
* property.
167+
* @param {Object} [options.customTags] Allow to replace custom keywords in the URL template. The object must have strings as keys and functions as values.
135168
*
136169
*
137170
* @example
@@ -157,6 +190,15 @@ define([
157190
* 'width=256&height=256',
158191
* rectangle : Cesium.Rectangle.fromDegrees(96.799393, -43.598214999057824, 153.63925700000001, -9.2159219997013)
159192
* });
193+
* // Using custom tags in your template url.
194+
* var custom = new Cesium.UrlTemplateImageryProvider({
195+
* url : 'https://yoururl/{Time}/{z}/{y}/{x}.png',
196+
* customTags : {
197+
* Time: function(imageryProvider, x, y , level) {
198+
* return '20171231'
199+
* }
200+
* }
201+
* });
160202
*
161203
* @see ArcGisMapServerImageryProvider
162204
* @see BingMapsImageryProvider
@@ -568,8 +610,33 @@ define([
568610
}
569611
that._credit = credit;
570612

571-
that._urlParts = urlTemplateToParts(that._url, tags); //eslint-disable-line no-use-before-define
572-
that._pickFeaturesUrlParts = urlTemplateToParts(that._pickFeaturesUrl, pickFeaturesTags); //eslint-disable-line no-use-before-define
613+
var tag;
614+
var allTags = {};
615+
var allPickFeaturesTags = {};
616+
for (tag in tags) {
617+
if (tags.hasOwnProperty(tag)) {
618+
allTags[tag] = tags[tag];
619+
}
620+
}
621+
for (tag in pickFeaturesTags) {
622+
if (pickFeaturesTags.hasOwnProperty(tag)) {
623+
allPickFeaturesTags[tag] = pickFeaturesTags[tag];
624+
}
625+
}
626+
627+
var customTags = properties.customTags;
628+
if (defined(customTags)) {
629+
for (tag in customTags) {
630+
if (customTags.hasOwnProperty(tag)) {
631+
var targetTag = '{' + tag + '}';
632+
allTags[targetTag] = customTags[tag];
633+
allPickFeaturesTags[targetTag] = customTags[tag];
634+
}
635+
}
636+
}
637+
638+
that._urlParts = urlTemplateToParts(that._url, allTags);
639+
that._pickFeaturesUrlParts = urlTemplateToParts(that._pickFeaturesUrl, allPickFeaturesTags);
573640
return true;
574641
});
575642
};
@@ -963,37 +1030,5 @@ define([
9631030
return format;
9641031
}
9651032

966-
var tags = {
967-
'{x}': xTag,
968-
'{y}': yTag,
969-
'{z}': zTag,
970-
'{s}': sTag,
971-
'{reverseX}': reverseXTag,
972-
'{reverseY}': reverseYTag,
973-
'{reverseZ}': reverseZTag,
974-
'{westDegrees}': westDegreesTag,
975-
'{southDegrees}': southDegreesTag,
976-
'{eastDegrees}': eastDegreesTag,
977-
'{northDegrees}': northDegreesTag,
978-
'{westProjected}': westProjectedTag,
979-
'{southProjected}': southProjectedTag,
980-
'{eastProjected}': eastProjectedTag,
981-
'{northProjected}': northProjectedTag,
982-
'{width}': widthTag,
983-
'{height}': heightTag
984-
};
985-
986-
var pickFeaturesTags = combine(tags, {
987-
'{i}' : iTag,
988-
'{j}' : jTag,
989-
'{reverseI}' : reverseITag,
990-
'{reverseJ}' : reverseJTag,
991-
'{longitudeDegrees}' : longitudeDegreesTag,
992-
'{latitudeDegrees}' : latitudeDegreesTag,
993-
'{longitudeProjected}' : longitudeProjectedTag,
994-
'{latitudeProjected}' : latitudeProjectedTag,
995-
'{format}' : formatTag
996-
});
997-
9981033
return UrlTemplateImageryProvider;
9991034
});

Specs/Scene/UrlTemplateImageryProviderSpec.js

+28
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,34 @@ defineSuite([
634634
});
635635
});
636636

637+
it('uses custom tags', function() {
638+
var provider = new UrlTemplateImageryProvider({
639+
url: 'made/up/tms/server/{custom1}/{custom2}/{z}/{y}/{x}.PNG',
640+
tilingScheme: new GeographicTilingScheme(),
641+
maximumLevel: 6,
642+
customTags: {
643+
custom1: function() { return 'foo';},
644+
custom2: function() { return 'bar';}
645+
}
646+
});
647+
648+
return pollToPromise(function() {
649+
return provider.ready;
650+
}).then(function() {
651+
spyOn(loadImage, 'createImage').and.callFake(function(url, crossOrigin, deferred) {
652+
expect(url).toEqual('made/up/tms/server/foo/bar/2/1/3.PNG');
653+
654+
// Just return any old image.
655+
loadImage.defaultCreateImage('Data/Images/Red16x16.png', crossOrigin, deferred);
656+
});
657+
658+
return provider.requestImage(3, 1, 2).then(function(image) {
659+
expect(loadImage.createImage).toHaveBeenCalled();
660+
expect(image).toBeInstanceOf(Image);
661+
});
662+
});
663+
});
664+
637665
describe('pickFeatures', function() {
638666
it('returns undefined when enablePickFeatures is false', function() {
639667
var provider = new UrlTemplateImageryProvider({

0 commit comments

Comments
 (0)