@basemaps/lambda-tiler 7.11.0 → 7.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,6 +9,7 @@ import { Etag } from '../util/etag.js';
9
9
  import { convertStyleToNztmStyle } from '../util/nztm.style.js';
10
10
  import { NotFound, NotModified } from '../util/response.js';
11
11
  import { Validate } from '../util/validate.js';
12
+ import { createTileSetAttribution } from './attribution.js';
12
13
  /**
13
14
  * Convert relative URL into a full hostname URL, converting {tileMatrix} into the provided tileMatrix
14
15
  *
@@ -128,7 +129,7 @@ async function ensureTerrain(req, tileMatrix, apiKey, style) {
128
129
  * Generate a StyleJSON from a tileset
129
130
  * @returns
130
131
  */
131
- export function tileSetToStyle(req, tileSet, tileMatrix, apiKey) {
132
+ export async function tileSetToStyle(req, config, tileSet, tileMatrix, apiKey) {
132
133
  // If the style has outputs defined it has a different process for generating the stylejson
133
134
  if (tileSet.outputs)
134
135
  return tileSetOutputToStyle(req, tileSet, tileMatrix, apiKey);
@@ -141,12 +142,20 @@ export function tileSetToStyle(req, tileSet, tileMatrix, apiKey) {
141
142
  const query = toQueryString({ config: configLocation, api: apiKey, pipeline: pipelineName });
142
143
  const tileUrl = (Env.get(Env.PublicUrlBase) ?? '') +
143
144
  `/v1/tiles/${tileSet.name}/${tileMatrix.identifier}/{z}/{x}/{y}.${tileFormat}${query}`;
145
+ const attribution = await createTileSetAttribution(config, tileSet, tileMatrix.projection);
144
146
  const styleId = `basemaps-${tileSet.name}`;
145
147
  return {
146
148
  id: ConfigId.prefix(ConfigPrefix.Style, tileSet.name),
147
149
  name: tileSet.name,
148
150
  version: 8,
149
- sources: { [styleId]: { type: 'raster', tiles: [tileUrl], tileSize: 256 } },
151
+ sources: {
152
+ [styleId]: {
153
+ type: 'raster',
154
+ tiles: [tileUrl],
155
+ tileSize: 256,
156
+ attribution,
157
+ },
158
+ },
150
159
  layers: [{ id: styleId, type: 'raster', source: styleId }],
151
160
  };
152
161
  }
@@ -199,8 +208,7 @@ async function generateStyleFromTileSet(req, config, tileSetName, tileMatrix, ap
199
208
  }
200
209
  if (tileSet.outputs)
201
210
  return tileSetOutputToStyle(req, tileSet, tileMatrix, apiKey);
202
- else
203
- return tileSetToStyle(req, tileSet, tileMatrix, apiKey);
211
+ return tileSetToStyle(req, config, tileSet, tileMatrix, apiKey);
204
212
  }
205
213
  export async function styleJsonGet(req) {
206
214
  const apiKey = Validate.apiKey(req);
@@ -1 +1 @@
1
- {"version":3,"file":"tile.style.json.js","sourceRoot":"","sources":["../../src/routes/tile.style.json.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,QAAQ,EACR,YAAY,EAKZ,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,+CAA+C,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,eAAe,EAAiB,cAAc,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAqB,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,kBAAkB,CAChC,GAAY,EACZ,UAA0B,EAC1B,MAAe,EACf,MAAsB;IAEtB,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IAC3B,IAAI,UAAU;QAAE,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IACzE,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAC9C,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,CAAC,sBAAsB;IAC5D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnC,IAAI,MAAM;QAAE,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACpD,IAAI,MAAM;QAAE,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvD,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACtE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,KAAgB,EAAE,UAAyB,EAAE,MAAc,EAAE,MAAqB;IAC7G,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/D,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,KAAK,CAAC,GAAG,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACxE,CAAC;aAAM,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAClG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED,IAAI,KAAK,CAAC,MAAM;QAAE,KAAK,CAAC,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAChG,IAAI,KAAK,CAAC,MAAM;QAAE,KAAK,CAAC,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAClG,CAAC;AASD;;GAEG;AACH,SAAS,eAAe,CAAC,KAAgB,EAAE,OAAe,EAAE,UAAyB;IACnF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC;IACrE,IAAI,MAAM,IAAI,IAAI;QAAE,MAAM,IAAI,kBAAkB,CAAC,GAAG,EAAE,YAAY,OAAO,uCAAuC,CAAC,CAAC;IAClH,KAAK,CAAC,OAAO,GAAG;QACd,MAAM;QACN,YAAY,EAAE,mBAAmB,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,mBAAmB,CAAC,SAAS,CAAC,UAAU,CAAC;KACtG,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAAC,GAAgC,EAAE,KAAgB;IAC9E,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEhD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEhD,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5C,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,kBAAkB,CAAC,GAAG,EAAE,+CAA+C,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QACpG,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI;QAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;IAC7D,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI;QAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;IAC7D,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI;QAAE,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;IAEpD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnD,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAC1B,GAAgC,EAChC,UAAyB,EACzB,MAAc,EACd,KAAgB;IAEhB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACtD,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO;IAC5B,MAAM,cAAc,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjD,MAAM,cAAc,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;IACvG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG;QAC9B,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE,GAAG;QACb,OAAO,EAAE,EAAE,EAAE,iEAAiE;QAC9E,KAAK,EAAE,CAAC,kBAAkB,CAAC,uBAAuB,UAAU,CAAC,UAAU,mBAAmB,cAAc,EAAE,CAAC,CAAC;KAC7G,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,GAAgC,EAChC,OAA4B,EAC5B,UAAyB,EACzB,MAAc;IAEd,2FAA2F;IAC3F,IAAI,OAAO,CAAC,OAAO;QAAE,OAAO,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAEnF,MAAM,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnE,IAAI,UAAU,IAAI,IAAI;QAAE,MAAM,IAAI,kBAAkB,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;IAElF,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IACnF,MAAM,YAAY,GAAG,QAAQ,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC;IAE5E,MAAM,cAAc,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;IAE7F,MAAM,OAAO,GACX,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QAClC,aAAa,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC,UAAU,gBAAgB,UAAU,GAAG,KAAK,EAAE,CAAC;IAEzF,MAAM,OAAO,GAAG,YAAY,OAAO,CAAC,IAAI,EAAE,CAAC;IAC3C,OAAO;QACL,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC;QACrD,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE;QAC3E,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;KAC3D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAgC,EAChC,OAA4B,EAC5B,UAAyB,EACzB,MAAc;IAEd,IAAI,OAAO,CAAC,OAAO,IAAI,IAAI;QAAE,MAAM,IAAI,kBAAkB,CAAC,GAAG,EAAE,+CAA+C,CAAC,CAAC;IAChH,MAAM,cAAc,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEjD,MAAM,OAAO,GAAG,YAAY,OAAO,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAY,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAY,EAAE,CAAC;IAE3B,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;QAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAE5F,MAAM,OAAO,GAAG,GAAG,OAAO,aAAa,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC,UAAU,gBAAgB,MAAM,GAAG,KAAK,EAAE,CAAC;QAE7G,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YAClC,sEAAsE;YACtE,OAAO,CAAC,GAAG,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;YAC3F,OAAO,CAAC,GAAG,OAAO,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QACrG,CAAC;aAAM,CAAC;YACN,kCAAkC;YAClC,OAAO,CAAC,GAAG,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QAC7F,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YACrD,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO;QACL,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC;QACrD,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,CAAC;QACV,OAAO;QACP,MAAM;KACP,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,GAAgC,EAChC,MAA8B,EAC9B,WAAmB,EACnB,UAAyB,EACzB,MAAc;IAEd,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACtD,IAAI,OAAO,IAAI,IAAI;QAAE,MAAM,QAAQ,EAAE,CAAC;IACtC,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;QACxC,MAAM,IAAI,kBAAkB,CAAC,GAAG,EAAE,+CAA+C,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,OAAO,CAAC,OAAO;QAAE,OAAO,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;;QAC9E,OAAO,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;AAC/D,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAgC;IACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;IAEvC,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC;IAC5F,IAAI,UAAU,IAAI,IAAI;QAAE,OAAO,IAAI,kBAAkB,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;IAElF,2CAA2C;IAC3C,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACpE,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC;QAAE,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAEhE;;;;;;OAMG;IACH,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;IACtD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,CAAC;IACzD,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAE5C,2BAA2B;IAC3B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtD,MAAM,WAAW,GACf,WAAW,EAAE,KAAK,IAAI,CAAC,MAAM,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAErG,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IACjD,yCAAyC;IACzC,qFAAqF;IACrF,MAAM,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAE1D,uBAAuB;IACvB,IAAI,OAAO;QAAE,eAAe,CAAC,WAAW,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAC/D,IAAI,MAAM;QAAE,MAAM,cAAc,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAEnD,qEAAqE;IACrE,YAAY,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAEzE,IAAI,UAAU,CAAC,UAAU,KAAK,eAAe,CAAC,UAAU;QAAE,uBAAuB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAEtG,iCAAiC;IACjC,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC;QAAE,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAEhH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IAEtD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC;QAAE,OAAO,WAAW,EAAE,CAAC;IAE5D,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnD,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC3C,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACrD,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAC1C,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"tile.style.json.js","sourceRoot":"","sources":["../../src/routes/tile.style.json.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@basemaps/lambda-tiler",
3
- "version": "7.11.0",
3
+ "version": "7.12.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/linz/basemaps.git",
@@ -22,12 +22,12 @@
22
22
  "types": "./build/index.d.ts",
23
23
  "license": "MIT",
24
24
  "dependencies": {
25
- "@basemaps/config": "^7.11.0",
26
- "@basemaps/config-loader": "^7.11.0",
27
- "@basemaps/geo": "^7.11.0",
28
- "@basemaps/shared": "^7.11.0",
29
- "@basemaps/tiler": "^7.11.0",
30
- "@basemaps/tiler-sharp": "^7.11.0",
25
+ "@basemaps/config": "^7.12.0",
26
+ "@basemaps/config-loader": "^7.12.0",
27
+ "@basemaps/geo": "^7.12.0",
28
+ "@basemaps/shared": "^7.12.0",
29
+ "@basemaps/tiler": "^7.12.0",
30
+ "@basemaps/tiler-sharp": "^7.12.0",
31
31
  "@linzjs/geojson": "^7.10.0",
32
32
  "@linzjs/lambda": "^4.0.0",
33
33
  "@mapbox/vector-tile": "^2.0.3",
@@ -50,11 +50,11 @@
50
50
  "bundle": "./bundle.sh"
51
51
  },
52
52
  "devDependencies": {
53
- "@basemaps/attribution": "^7.11.0",
53
+ "@basemaps/attribution": "^7.12.0",
54
54
  "@chunkd/fs": "^11.2.0",
55
55
  "@types/aws-lambda": "^8.10.75",
56
56
  "@types/pixelmatch": "^5.0.0",
57
57
  "pretty-json-log": "^1.0.0"
58
58
  },
59
- "gitHead": "99c1a7568dca77b55e44f2d446c00f092e14870d"
59
+ "gitHead": "ae07a9588aa620801b6d1578c4e32f884882b53a"
60
60
  }
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { FsaCache, FsaLog, LogConfig } from '@basemaps/shared';
1
+ import { FsaCache, FsaLog, LogConfig, LogStorage } from '@basemaps/shared';
2
2
  import { LambdaHttpRequest, LambdaHttpResponse, lf } from '@linzjs/lambda';
3
3
 
4
4
  import { tileAttributionGet } from './routes/attribution.js';
@@ -6,6 +6,7 @@ import { configImageryGet, configTileSetGet } from './routes/config.js';
6
6
  import { fontGet, fontList } from './routes/fonts.js';
7
7
  import { healthGet } from './routes/health.js';
8
8
  import { imageryGet } from './routes/imagery.js';
9
+ import { linkGet } from './routes/link.js';
9
10
  import { pingGet } from './routes/ping.js';
10
11
  import { previewIndexGet } from './routes/preview.index.js';
11
12
  import { tilePreviewGet } from './routes/preview.js';
@@ -33,13 +34,14 @@ function randomTrace(req: LambdaHttpRequest): void {
33
34
  const rand = Math.random();
34
35
  // 1% trace
35
36
  if (rand < 0.01) req.log.level = 'trace';
36
- // 5% debug
37
- else if (rand < 0.04) req.log.level = 'debug';
37
+ // 25% debug
38
+ else if (rand < 0.25) req.log.level = 'debug';
38
39
  // everything else info
39
40
  else req.log.level = 'info';
40
41
  }
41
42
 
42
43
  handler.router.hook('request', (req) => {
44
+ LogStorage.enterWith({ log: req.log });
43
45
  FsaLog.reset();
44
46
 
45
47
  randomTrace(req);
@@ -48,7 +50,8 @@ handler.router.hook('request', (req) => {
48
50
  });
49
51
 
50
52
  handler.router.hook('response', (req, res) => {
51
- req.set('requestCount', FsaLog.requests.length);
53
+ req.set('fetchCount', FsaLog.count);
54
+ req.set('fetches', FsaLog.requests);
52
55
  req.set('cacheSize', FsaCache.size);
53
56
  // Force access-control-allow-origin to everything
54
57
  res.header('access-control-allow-origin', '*');
@@ -102,6 +105,9 @@ handler.router.get('/v1/preview/:tileSet/:tileMatrix/:z/:lon/:lat/:outputType',
102
105
  handler.router.get('/v1/@:location', previewIndexGet);
103
106
  handler.router.get('/@:location', previewIndexGet);
104
107
 
108
+ // Link
109
+ handler.router.get('/v1/link/:tileSet', linkGet);
110
+
105
111
  // Attribution
106
112
  handler.router.get('/v1/tiles/:tileSet/:tileMatrix/attribution.json', tileAttributionGet);
107
113
  handler.router.get('/v1/attribution/:tileSet/:tileMatrix/summary.json', tileAttributionGet);
@@ -0,0 +1,114 @@
1
+ import { strictEqual } from 'node:assert';
2
+ import { afterEach, describe, it } from 'node:test';
3
+
4
+ import { ConfigProviderMemory } from '@basemaps/config';
5
+ import { Epsg } from '@basemaps/geo';
6
+
7
+ import { FakeData, Imagery3857 } from '../../__tests__/config.data.js';
8
+ import { mockRequest } from '../../__tests__/xyz.util.js';
9
+ import { handler } from '../../index.js';
10
+ import { ConfigLoader } from '../../util/config.loader.js';
11
+
12
+ describe('/v1/link/:tileSet', () => {
13
+ const FakeTileSetName = 'tileset';
14
+ const config = new ConfigProviderMemory();
15
+
16
+ afterEach(() => {
17
+ config.objects.clear();
18
+ });
19
+
20
+ /**
21
+ * 3xx status responses
22
+ */
23
+
24
+ // tileset found, is raster type, has one layer, has '3857' entry, imagery found > 302 response
25
+ it('success: redirect to pre-zoomed imagery', async (t) => {
26
+ t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
27
+
28
+ config.put(FakeData.tileSetRaster(FakeTileSetName));
29
+ config.put(Imagery3857);
30
+
31
+ const req = mockRequest(`/v1/link/${FakeTileSetName}`);
32
+ const res = await handler.router.handle(req);
33
+
34
+ strictEqual(res.status, 302);
35
+ strictEqual(res.statusDescription, 'Redirect to pre-zoomed imagery');
36
+ });
37
+
38
+ /**
39
+ * 4xx status responses
40
+ */
41
+
42
+ // tileset not found > 404 response
43
+ it('failure: tileset not found', async (t) => {
44
+ t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
45
+
46
+ const req = mockRequest(`/v1/link/${FakeTileSetName}`);
47
+ const res = await handler.router.handle(req);
48
+
49
+ strictEqual(res.status, 404);
50
+ strictEqual(res.statusDescription, 'Tileset not found');
51
+ });
52
+
53
+ // tileset found, not raster type > 400 response
54
+ it('failure: tileset must be raster type', async (t) => {
55
+ t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
56
+
57
+ config.put(FakeData.tileSetVector(FakeTileSetName));
58
+
59
+ const req = mockRequest(`/v1/link/${FakeTileSetName}`);
60
+ const res = await handler.router.handle(req);
61
+
62
+ strictEqual(res.status, 400);
63
+ strictEqual(res.statusDescription, 'Tileset must be raster type');
64
+ });
65
+
66
+ // tileset found, is raster type, has more than one layer > 400 response
67
+ it('failure: too many layers', async (t) => {
68
+ t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
69
+
70
+ const tileSet = FakeData.tileSetRaster(FakeTileSetName);
71
+
72
+ // add another layer
73
+ tileSet.layers.push(tileSet.layers[0]);
74
+
75
+ config.put(tileSet);
76
+
77
+ const req = mockRequest(`/v1/link/${FakeTileSetName}`);
78
+ const res = await handler.router.handle(req);
79
+
80
+ strictEqual(res.status, 400);
81
+ strictEqual(res.statusDescription, 'Too many layers');
82
+ });
83
+
84
+ // tileset found, is raster type, has one layer, no '3857' entry > 400 response
85
+ it("failure: no imagery for '3857' projection", async (t) => {
86
+ t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
87
+
88
+ const tileSet = FakeData.tileSetRaster(FakeTileSetName);
89
+
90
+ // delete '3857' entry
91
+ delete tileSet.layers[0][Epsg.Google.code];
92
+
93
+ config.put(tileSet);
94
+
95
+ const req = mockRequest(`/v1/link/${FakeTileSetName}`);
96
+ const res = await handler.router.handle(req);
97
+
98
+ strictEqual(res.status, 400);
99
+ strictEqual(res.statusDescription, "No imagery for '3857' projection");
100
+ });
101
+
102
+ // tileset found, is raster type, has one layer, has '3857' entry, imagery not found > 400 response
103
+ it('failure: imagery not found', async (t) => {
104
+ t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
105
+
106
+ config.put(FakeData.tileSetRaster(FakeTileSetName));
107
+
108
+ const req = mockRequest(`/v1/link/${FakeTileSetName}`);
109
+ const res = await handler.router.handle(req);
110
+
111
+ strictEqual(res.status, 400);
112
+ strictEqual(res.statusDescription, 'Imagery not found');
113
+ });
114
+ });
@@ -0,0 +1,224 @@
1
+ import assert, { strictEqual } from 'node:assert';
2
+ import { afterEach, before, describe, it } from 'node:test';
3
+
4
+ import { copyright, createLicensorAttribution } from '@basemaps/attribution/build/utils.js';
5
+ import { ConfigProviderMemory, StyleJson } from '@basemaps/config';
6
+ import { StacProvider } from '@basemaps/geo';
7
+ import { Env } from '@basemaps/shared';
8
+
9
+ import { FakeData, Imagery3857 } from '../../__tests__/config.data.js';
10
+ import { Api, mockRequest } from '../../__tests__/xyz.util.js';
11
+ import { handler } from '../../index.js';
12
+ import { ConfigLoader } from '../../util/config.loader.js';
13
+
14
+ const defaultAttribution = `${copyright} LINZ`;
15
+
16
+ describe('/v1/styles', () => {
17
+ const host = 'https://tiles.test';
18
+ const config = new ConfigProviderMemory();
19
+
20
+ const FakeTileSetName = 'tileset';
21
+ const FakeLicensor1: StacProvider = {
22
+ name: 'L1',
23
+ roles: ['licensor'],
24
+ };
25
+ const FakeLicensor2: StacProvider = {
26
+ name: 'L2',
27
+ roles: ['licensor'],
28
+ };
29
+
30
+ before(() => {
31
+ process.env[Env.PublicUrlBase] = host;
32
+ });
33
+ afterEach(() => {
34
+ config.objects.clear();
35
+ });
36
+
37
+ // tileset exists, imagery not found
38
+ it('default: imagery not found', async (t) => {
39
+ t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
40
+
41
+ // insert
42
+ config.put(FakeData.tileSetRaster(FakeTileSetName));
43
+
44
+ // request
45
+ const req = mockRequest(`/v1/styles/${FakeTileSetName}.json`, 'get', Api.header);
46
+ const res = await handler.router.handle(req);
47
+ strictEqual(res.status, 200);
48
+
49
+ // extract
50
+ const body = Buffer.from(res.body, 'base64').toString();
51
+ const json = JSON.parse(body) as StyleJson;
52
+
53
+ const source = Object.values(json.sources)[0];
54
+ assert(source != null);
55
+ assert(source.attribution != null);
56
+
57
+ // verify
58
+ strictEqual(source.attribution, defaultAttribution);
59
+ });
60
+
61
+ // tileset exists, imagery found, more than one layer
62
+ it('default: too many layers', async (t) => {
63
+ t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
64
+
65
+ // insert
66
+ const tileset = FakeData.tileSetRaster(FakeTileSetName);
67
+ assert(tileset.layers[0] != null);
68
+
69
+ tileset.layers.push(tileset.layers[0]);
70
+ assert(tileset.layers.length > 1);
71
+
72
+ config.put(tileset);
73
+ config.put(Imagery3857);
74
+
75
+ // request
76
+ const req = mockRequest(`/v1/styles/${FakeTileSetName}.json`, 'get', Api.header);
77
+ const res = await handler.router.handle(req);
78
+ strictEqual(res.status, 200);
79
+
80
+ // extract
81
+ const body = Buffer.from(res.body, 'base64').toString();
82
+ const json = JSON.parse(body) as StyleJson;
83
+
84
+ const source = Object.values(json.sources)[0];
85
+ assert(source != null);
86
+ assert(source.attribution != null);
87
+
88
+ // verify
89
+ strictEqual(source.attribution, defaultAttribution);
90
+ });
91
+
92
+ // tileset exists, imagery found, one layer, no providers
93
+ it('default: no providers', async (t) => {
94
+ t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
95
+
96
+ // insert
97
+ const tileset = FakeData.tileSetRaster(FakeTileSetName);
98
+ assert(tileset.layers[0] != null);
99
+ assert(tileset.layers.length === 1);
100
+
101
+ const imagery = Imagery3857;
102
+ assert(imagery.providers == null);
103
+
104
+ config.put(tileset);
105
+ config.put(imagery);
106
+
107
+ // request
108
+ const req = mockRequest(`/v1/styles/${FakeTileSetName}.json`, 'get', Api.header);
109
+ const res = await handler.router.handle(req);
110
+ strictEqual(res.status, 200);
111
+
112
+ // extract
113
+ const body = Buffer.from(res.body, 'base64').toString();
114
+ const json = JSON.parse(body) as StyleJson;
115
+
116
+ const source = Object.values(json.sources)[0];
117
+ assert(source != null);
118
+ assert(source.attribution != null);
119
+
120
+ // verify
121
+ strictEqual(source.attribution, defaultAttribution);
122
+ });
123
+
124
+ // tileset exists, imagery found, one layer, has providers, no licensors
125
+ it('default: no licensors', async (t) => {
126
+ t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
127
+
128
+ // insert
129
+ const tileset = FakeData.tileSetRaster(FakeTileSetName);
130
+ assert(tileset.layers[0] != null);
131
+ assert(tileset.layers.length === 1);
132
+
133
+ const imagery = Imagery3857;
134
+ imagery.providers = [];
135
+ assert(imagery.providers != null);
136
+
137
+ config.put(tileset);
138
+ config.put(imagery);
139
+
140
+ // request
141
+ const req = mockRequest(`/v1/styles/${FakeTileSetName}.json`, 'get', Api.header);
142
+ const res = await handler.router.handle(req);
143
+ strictEqual(res.status, 200);
144
+
145
+ // extract
146
+ const body = Buffer.from(res.body, 'base64').toString();
147
+ const json = JSON.parse(body) as StyleJson;
148
+
149
+ const source = Object.values(json.sources)[0];
150
+ assert(source != null);
151
+ assert(source.attribution != null);
152
+
153
+ // verify
154
+ strictEqual(source.attribution, defaultAttribution);
155
+ });
156
+
157
+ // tileset exists, imagery found, one layer, has providers, one licensor
158
+ it('custom: one licensor', async (t) => {
159
+ t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
160
+
161
+ // insert
162
+ const tileset = FakeData.tileSetRaster(FakeTileSetName);
163
+ assert(tileset.layers[0] != null);
164
+ assert(tileset.layers.length === 1);
165
+
166
+ const imagery = Imagery3857;
167
+ imagery.providers = [FakeLicensor1];
168
+ assert(imagery.providers != null);
169
+
170
+ config.put(tileset);
171
+ config.put(imagery);
172
+
173
+ // request
174
+ const req = mockRequest(`/v1/styles/${FakeTileSetName}.json`, 'get', Api.header);
175
+ const res = await handler.router.handle(req);
176
+ strictEqual(res.status, 200);
177
+
178
+ // extract
179
+ const body = Buffer.from(res.body, 'base64').toString();
180
+ const json = JSON.parse(body) as StyleJson;
181
+
182
+ const source = Object.values(json.sources)[0];
183
+ assert(source != null);
184
+ assert(source.attribution != null);
185
+
186
+ // verify
187
+ strictEqual(source.attribution, `${copyright} ${FakeLicensor1.name}`);
188
+ strictEqual(source.attribution, createLicensorAttribution([FakeLicensor1]));
189
+ });
190
+
191
+ // tileset exists, imagery found, one layer, has providers, two licensors
192
+ it('custom: two licensors', async (t) => {
193
+ t.mock.method(ConfigLoader, 'getDefaultConfig', () => Promise.resolve(config));
194
+
195
+ // insert
196
+ const tileset = FakeData.tileSetRaster(FakeTileSetName);
197
+ assert(tileset.layers[0] != null);
198
+ assert(tileset.layers.length === 1);
199
+
200
+ const imagery = Imagery3857;
201
+ imagery.providers = [FakeLicensor1, FakeLicensor2];
202
+ assert(imagery.providers != null);
203
+
204
+ config.put(tileset);
205
+ config.put(imagery);
206
+
207
+ // request
208
+ const req = mockRequest(`/v1/styles/${FakeTileSetName}.json`, 'get', Api.header);
209
+ const res = await handler.router.handle(req);
210
+ strictEqual(res.status, 200);
211
+
212
+ // extract
213
+ const body = Buffer.from(res.body, 'base64').toString();
214
+ const json = JSON.parse(body) as StyleJson;
215
+
216
+ const source = Object.values(json.sources)[0];
217
+ assert(source != null);
218
+ assert(source.attribution != null);
219
+
220
+ // verify
221
+ strictEqual(source.attribution, `${copyright} ${FakeLicensor1.name}, ${FakeLicensor2.name}`);
222
+ strictEqual(source.attribution, createLicensorAttribution([FakeLicensor1, FakeLicensor2]));
223
+ });
224
+ });
@@ -1,9 +1,11 @@
1
- import { ConfigProvider, ConfigTileSet, getAllImagery, TileSetType } from '@basemaps/config';
1
+ import { createLicensorAttribution } from '@basemaps/attribution/build/utils.js';
2
+ import { BasemapsConfigProvider, ConfigProvider, ConfigTileSet, getAllImagery, TileSetType } from '@basemaps/config';
2
3
  import {
3
4
  AttributionCollection,
4
5
  AttributionItem,
5
6
  AttributionStac,
6
7
  Bounds,
8
+ Epsg,
7
9
  GoogleTms,
8
10
  NamedBounds,
9
11
  Projection,
@@ -93,10 +95,11 @@ async function tileSetAttribution(
93
95
 
94
96
  const config = await ConfigLoader.load(req);
95
97
  const imagery = await getAllImagery(config, tileSet.layers, [tileMatrix.projection]);
96
-
97
98
  const host = await config.Provider.get(config.Provider.id('linz'));
98
99
 
99
- for (const layer of tileSet.layers) {
100
+ for (let i = 0; i < tileSet.layers.length; i++) {
101
+ const layer = tileSet.layers[i];
102
+
100
103
  const imgId = layer[proj.epsg.code];
101
104
  if (imgId == null) continue;
102
105
 
@@ -138,11 +141,12 @@ async function tileSetAttribution(
138
141
 
139
142
  const zoomMin = TileMatrixSet.convertZoomLevel(layer.minZoom ? layer.minZoom : 0, GoogleTms, tileMatrix, true);
140
143
  const zoomMax = TileMatrixSet.convertZoomLevel(layer.maxZoom ? layer.maxZoom : 32, GoogleTms, tileMatrix, true);
144
+
141
145
  cols.push({
142
146
  stac_version: Stac.Version,
143
147
  license: Stac.License,
144
148
  id: im.id,
145
- providers: getHost(host),
149
+ providers: im.providers ?? getHost(host),
146
150
  title,
147
151
  description: 'No description',
148
152
  extent,
@@ -150,10 +154,11 @@ async function tileSetAttribution(
150
154
  summaries: {
151
155
  'linz:category': im.category,
152
156
  'linz:zoom': { min: zoomMin, max: zoomMax },
153
- 'linz:priority': [1000 + tileSet.layers.indexOf(layer)],
157
+ 'linz:priority': [1000 + i],
154
158
  },
155
159
  });
156
160
  }
161
+
157
162
  return {
158
163
  id: tileSet.id,
159
164
  type: 'FeatureCollection',
@@ -205,3 +210,43 @@ export async function tileAttributionGet(req: LambdaHttpRequest<TileAttributionG
205
210
  response.json(attributions);
206
211
  return response;
207
212
  }
213
+
214
+ /**
215
+ * Construct a licensor attribution for a given tileSet.
216
+ *
217
+ * @param provider The BasemapsConfigProvider object.
218
+ * @param tileSet The tileset from which to build the attribution.
219
+ * @param projection The projection to consider.
220
+ *
221
+ * @returns A default attribution, if the tileset has more than one layer or no such imagery for the given projection exists.
222
+ * Otherwise, a copyright string comprising the names of the tileset's licensors.
223
+ *
224
+ * @example
225
+ * "CC BY 4.0 LINZ"
226
+ *
227
+ * @example
228
+ * "CC BY 4.0 Nelson City Council, Tasman District Council, Waka Kotahi"
229
+ */
230
+ export async function createTileSetAttribution(
231
+ provider: BasemapsConfigProvider,
232
+ tileSet: ConfigTileSet,
233
+ projection: Epsg,
234
+ ): Promise<string> {
235
+ // ensure the tileset has exactly one layer
236
+ if (tileSet.layers.length > 1 || tileSet.layers[0] == null) {
237
+ return createLicensorAttribution();
238
+ }
239
+
240
+ // ensure imagery exist for the given projection
241
+ const imgId = tileSet.layers[0][projection.code];
242
+ if (imgId == null) return '';
243
+
244
+ // attempt to load the imagery
245
+ const imagery = await provider.Imagery.get(imgId);
246
+ if (imagery?.providers == null) {
247
+ return createLicensorAttribution();
248
+ }
249
+
250
+ // return a licensor attribution string
251
+ return createLicensorAttribution(imagery.providers);
252
+ }
@@ -0,0 +1,55 @@
1
+ import { TileSetType } from '@basemaps/config';
2
+ import { Epsg } from '@basemaps/geo';
3
+ import { getPreviewUrl } from '@basemaps/shared';
4
+ import { LambdaHttpRequest, LambdaHttpResponse } from '@linzjs/lambda';
5
+
6
+ import { ConfigLoader } from '../util/config.loader.js';
7
+
8
+ export interface LinkGet {
9
+ Params: {
10
+ tileSet: string;
11
+ };
12
+ }
13
+
14
+ /**
15
+ * Redirect the client to a Basemaps URL that is already zoomed to the extent of the tileset's imagery.
16
+ *
17
+ * /v1/link/:tileSet
18
+ *
19
+ * @example
20
+ * '/v1/link/ashburton-2023-0.1m'
21
+ *
22
+ * @returns on success, 302 redirect response. on failure, 4xx status code response.
23
+ */
24
+ export async function linkGet(req: LambdaHttpRequest<LinkGet>): Promise<LambdaHttpResponse> {
25
+ const config = await ConfigLoader.load(req);
26
+
27
+ // get tileset
28
+
29
+ req.timer.start('tileset:load');
30
+ const tileSet = await config.TileSet.get(req.params.tileSet);
31
+ req.timer.end('tileset:load');
32
+
33
+ if (tileSet == null) return new LambdaHttpResponse(404, 'Tileset not found');
34
+
35
+ if (tileSet.type !== TileSetType.Raster) return new LambdaHttpResponse(400, 'Tileset must be raster type');
36
+
37
+ // TODO: add support for 'aerial' and 'elevation' multi-layer tilesets
38
+ if (tileSet.layers.length !== 1) return new LambdaHttpResponse(400, 'Too many layers');
39
+
40
+ // get imagery
41
+
42
+ const imageryId = tileSet.layers[0][Epsg.Google.code];
43
+ if (imageryId === undefined) return new LambdaHttpResponse(400, "No imagery for '3857' projection");
44
+
45
+ const imagery = await config.Imagery.get(imageryId);
46
+ if (imagery == null) return new LambdaHttpResponse(400, 'Imagery not found');
47
+
48
+ // do redirect
49
+
50
+ const url = getPreviewUrl({ imagery });
51
+
52
+ return new LambdaHttpResponse(302, 'Redirect to pre-zoomed imagery', {
53
+ location: `/${url.slug}?i=${url.name}`,
54
+ });
55
+ }