Skip to content

Commit a08cb53

Browse files
committed
use derived resources for attribution calls
1 parent a908f1d commit a08cb53

File tree

2 files changed

+31
-23
lines changed

2 files changed

+31
-23
lines changed

packages/engine/Source/Scene/Azure2DImageryProvider.js

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,14 @@ function Azure2DImageryProvider(options) {
7171
resource.setQueryParameters({
7272
"api-version": "2024-04-01",
7373
tilesetId: options.tilesetId,
74+
"subscription-key": this._subscriptionKey,
7475
zoom: `{z}`,
7576
x: `{x}`,
7677
y: `{y}`,
77-
"subscription-key": this._subscriptionKey,
7878
});
7979

80+
this._resource = resource;
81+
8082
let credit;
8183
if (defined(options.credit)) {
8284
credit = options.credit;
@@ -98,8 +100,6 @@ function Azure2DImageryProvider(options) {
98100
// This will be defined for ion resources
99101
this._tileCredits = resource.credits;
100102
this._attributionsByLevel = undefined;
101-
// Asynchronously request and populate _attributionsByLevel
102-
this.getViewportCredits();
103103
}
104104

105105
Object.defineProperties(Azure2DImageryProvider.prototype, {
@@ -300,7 +300,21 @@ Azure2DImageryProvider.prototype.requestImage = function (
300300
level,
301301
request,
302302
) {
303-
return this._imageryProvider.requestImage(x, y, level, request);
303+
const promise = this._imageryProvider.requestImage(x, y, level, request);
304+
305+
// If the requestImage call returns undefined, it couldn't be scheduled this frame. Make sure to return undefined so this can be handled upstream.
306+
if (!defined(promise)) {
307+
return undefined;
308+
}
309+
310+
// Asynchronously request and populate _attributionsByLevel if it hasn't been already. We do this here so that the promise can be properly awaited.
311+
if (promise && !defined(this._attributionsByLevel)) {
312+
return Promise.all([promise, this.getViewportCredits()]).then(
313+
(results) => results[0],
314+
);
315+
}
316+
317+
return promise;
304318
};
305319

306320
/**
@@ -336,6 +350,7 @@ Azure2DImageryProvider.prototype.getViewportCredits = async function () {
336350
for (let level = 0; level < maximumLevel + 1; level++) {
337351
promises.push(
338352
fetchViewportAttribution(
353+
this._resource,
339354
this._viewportUrl,
340355
this._subscriptionKey,
341356
this._tilesetId,
@@ -361,19 +376,17 @@ Azure2DImageryProvider.prototype.getViewportCredits = async function () {
361376
return attributionsByLevel;
362377
};
363378

364-
async function fetchViewportAttribution(url, key, tilesetId, level) {
365-
const viewport = await Resource.fetch({
366-
url: url,
379+
async function fetchViewportAttribution(resource, url, key, tilesetId, level) {
380+
const viewportResource = resource.getDerivedResource({
381+
url,
367382
queryParameters: {
368-
tilesetId,
369-
"subscription-key": key,
370-
"api-version": "2024-04-01",
371383
zoom: level,
372384
bounds: "-180,-90,180,90",
373385
},
374386
data: JSON.stringify(Frozen.EMPTY_OBJECT),
375387
});
376-
const viewportJson = JSON.parse(viewport);
388+
389+
const viewportJson = await viewportResource.fetchJson();
377390
return viewportJson.copyrights;
378391
}
379392

packages/engine/Source/Scene/Google2DImageryProvider.js

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ function Google2DImageryProvider(options) {
100100
key: encodeURIComponent(options.key),
101101
});
102102

103+
this._resource = resource.clone();
104+
103105
let credit;
104106
if (defined(options.credit)) {
105107
credit = options.credit;
@@ -532,12 +534,7 @@ Google2DImageryProvider.prototype.getViewportCredits = async function () {
532534
const promises = [];
533535
for (let level = 0; level < maximumLevel + 1; level++) {
534536
promises.push(
535-
fetchViewportAttribution(
536-
this._viewportUrl,
537-
this._key,
538-
this._session,
539-
level,
540-
),
537+
fetchViewportAttribution(this._resource, this._viewportUrl, level),
541538
);
542539
}
543540
const results = await Promise.all(promises);
@@ -558,12 +555,10 @@ Google2DImageryProvider.prototype.getViewportCredits = async function () {
558555
return attributionsByLevel;
559556
};
560557

561-
async function fetchViewportAttribution(url, key, session, level) {
562-
const viewport = await Resource.fetch({
563-
url: url,
558+
async function fetchViewportAttribution(resource, url, level) {
559+
const viewportResource = resource.getDerivedResource({
560+
url,
564561
queryParameters: {
565-
key,
566-
session,
567562
zoom: level,
568563
north: 90,
569564
south: -90,
@@ -572,7 +567,7 @@ async function fetchViewportAttribution(url, key, session, level) {
572567
},
573568
data: JSON.stringify(Frozen.EMPTY_OBJECT),
574569
});
575-
const viewportJson = JSON.parse(viewport);
570+
const viewportJson = await viewportResource.fetchJson();
576571
return viewportJson.copyright;
577572
}
578573

0 commit comments

Comments
 (0)