Skip to content

Commit

Permalink
feat(config): Add resizeKernel into the config tileset then disable f…
Browse files Browse the repository at this point in the history
…astShrinkOnLoad. BM-1146 (#3377)

### Motivation
As raster Topo map got edge effects on low zoom levels usually below
zoom 6, like following.

![image](https://github.com/user-attachments/assets/44a0e388-a00b-4d70-bfda-62414930dab8)

We have tests that with output resize kernel of `mitchell` and disable
the fastShrinkOnLoad for lower scales levels will fix this problem.

![image](https://github.com/user-attachments/assets/dcf1af02-16b8-4738-81b7-dc4c5ef255ab)

### Modifications

- Add the resiseKernel setting in the config bundle, so that we can
bundle it into server.
- disable `fastShrinkOnLoad` for the `resize.scale`less than 0.125.

- Not fix yet: The virtual tileset for `topo-raster-50k` and
`topo-raster-250k` won't fix as we can't propagate the resize kernel
from combined tileset -> imagery config -> virtual tileset. Unless we
add optional resizeKernal property for imagery config.

### Verification
Local test.

![image](https://github.com/user-attachments/assets/4a15d740-46c7-4592-a238-35864b701b77)
  • Loading branch information
Wentao-Kuang authored Dec 5, 2024
1 parent c3c795b commit bd3357e
Show file tree
Hide file tree
Showing 5 changed files with 13 additions and 4 deletions.
1 change: 1 addition & 0 deletions packages/config-loader/src/json/json.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,7 @@ export class ConfigJson {
if (tileSet.type === TileSetType.Raster) {
if (ts.outputs) tileSet.outputs = ts.outputs;
if (ts.background) tileSet.background = ts.background;
if (ts.resizeKernel) tileSet.resizeKernel = ts.resizeKernel;
}

if (ts.format) {
Expand Down
5 changes: 4 additions & 1 deletion packages/config-loader/src/json/parse.tile.set.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ConfigTileSetOutputParser, parseRgba, TileSetType } from '@basemaps/config';
import { ConfigTileSetOutputParser, parseRgba, TileResizeKernel, TileSetType } from '@basemaps/config';
import { z } from 'zod';

export function validateColor(str: string): boolean {
Expand Down Expand Up @@ -57,6 +57,8 @@ const zLayerConfig = z
},
);

const TileResizeKernel = z.enum(['nearest', 'mitchell', 'lanczos3', 'lanczos2']);

export const zTileSetConfig = z.object({
type: z.nativeEnum(TileSetType),
id: z.string(),
Expand All @@ -68,6 +70,7 @@ export const zTileSetConfig = z.object({
minZoom: zZoom.optional(),
maxZoom: zZoom.optional(),
format: z.string().optional(),
resizeKernel: z.object({ in: TileResizeKernel, out: TileResizeKernel }).optional(),
outputs: z.array(ConfigTileSetOutputParser).optional(),
});

Expand Down
2 changes: 1 addition & 1 deletion packages/config/src/config/tile.set.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ export interface ConfigLayer extends Partial<Record<EpsgCode, string>> {
maxZoom?: number;
}

export type TileResizeKernel = 'nearest' | 'lanczos3' | 'lanczos2';
export type TileResizeKernel = 'nearest' | 'mitchell' | 'lanczos3' | 'lanczos2';

export interface ConfigTileSetBase extends ConfigBase {
/** Human friendly display name for the tileset */
Expand Down
7 changes: 6 additions & 1 deletion packages/tiler-sharp/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,12 @@ export class TileMakerSharp implements TileMaker {

if (resize) {
const resizeOptions = { fit: Sharp.fit.cover, kernel: resize.scaleX > 1 ? resizeKernel.in : resizeKernel.out };
sharp.resize(resize.width, resize.height, resizeOptions);
if (resize.scale <= 0.1251) {
// If the scale is less than 0.125, we need to disable fastShrinkOnLoad to prevent edge artifacts for topo raster map
sharp.resize(resize.width, resize.height, { ...resizeOptions, fastShrinkOnLoad: false });
} else {
sharp.resize(resize.width, resize.height, resizeOptions);
}
}

if (crop) sharp.extract({ top: crop.y, left: crop.x, width: crop.width, height: crop.height });
Expand Down
2 changes: 1 addition & 1 deletion packages/tiler/src/raster.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export interface TileMaker {
compose(ctx: TileMakerContext): Promise<{ buffer: Buffer; metrics: Metrics }>;
}

export type ResizeKernelType = 'nearest' | 'lanczos3' | 'lanczos2';
export type ResizeKernelType = 'nearest' | 'mitchell' | 'lanczos3' | 'lanczos2';
export type TileMakerResizeKernel = { in: ResizeKernelType; out: ResizeKernelType };

export interface TileMakerContext {
Expand Down

0 comments on commit bd3357e

Please sign in to comment.