Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions src/geo/tiles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,58 @@ import { BBox2d } from '@turf/helpers/dist/js/lib/geojson';
import { ITile } from '../models/interfaces/geo/iTile';
import { tileToDegrees } from './geoConvertor';

const zoomToResolutionDegMapper: Record<number, number> = {
0: 0.703125,
1: 0.3515625,
2: 0.17578125,
3: 0.087890625,
4: 0.0439453125,
5: 0.02197265625,
6: 0.010986328125,
7: 0.0054931640625,
8: 0.00274658203125,
9: 0.001373291015625,
10: 0.0006866455078125,
11: 0.00034332275390625,
12: 0.000171661376953125,
13: 0.0000858306884765625,
14: 0.0000429153442382812,
15: 0.0000214576721191406,
16: 0.0000107288360595703,
17: 0.00000536441802978516,
18: 0.00000268220901489258,
19: 0.00000134110450744629,
20: 0.000000670552253723145,
21: 0.000000335276126861572,
22: 0.000000167638063430786,
};

const zoomToResolutionMeterMapper: Record<number, number> = {
0: 78271.52,
1: 39135.76,
2: 19567.88,
3: 9783.94,
4: 4891.97,
5: 2445.98,
6: 1222.99,
7: 611.5,
8: 305.75,
9: 152.87,
10: 76.44,
11: 38.22,
12: 19.11,
13: 9.55,
14: 4.78,
15: 2.39,
16: 1.19,
17: 0.6,
18: 0.3,
19: 0.15,
20: 0.075,
21: 0.037,
22: 0.0185,
};

/**
* calculates tile size (resolution) in degrees
* @param zoomLevel zoom level of returned tile size
Expand Down Expand Up @@ -37,6 +89,24 @@ export function flipYAxis(tile: ITile): ITile {
};
}

/**
* converts zoom level (integer) to matching resolution degree value
* @param zoom zoom level in range of 0-22
* @returns resolution represented in degrees, or undefined if zoom level is out of range
*/
export function zoomLevelToResolutionDeg(zoom: number): number | undefined {
return zoomToResolutionDegMapper[zoom];
}

/**
* converts zoom level (integer) to matching resolution meter value
* @param zoom zoom level in range of 0-22
* @returns resolution represented in Meters, or undefined if zoom level is out of range
*/
export function zoomLevelToResolutionMeter(zoom: number): number | undefined {
return zoomToResolutionMeterMapper[zoom];
}

/**
* converts pixel size (resolution) in degrees to matching zoom level (rounded down)
* @param resolution pixel size (resolution) in degrees
Expand Down
47 changes: 46 additions & 1 deletion tests/unit/geo/tiles.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
import { degreesPerPixel, degreesPerPixelToZoomLevel, degreesPerTile, flipYAxis } from '../../../src/geo/tiles';
import {
degreesPerPixel,
degreesPerPixelToZoomLevel,
degreesPerTile,
flipYAxis,
zoomLevelToResolutionDeg,
zoomLevelToResolutionMeter,
} from '../../../src/geo/tiles';

describe('tiles', () => {
describe('degreesPerTile', () => {
Expand Down Expand Up @@ -59,4 +66,42 @@ describe('tiles', () => {
expect(zoomLevelResult).toEqual(22);
});
});

describe('zoomLevelToResolutionDeg', () => {
it('Check calculation for min zoom level 0', function () {
const resolutionDegResult = zoomLevelToResolutionDeg(0);
const expectedResult = 0.703125;
expect(resolutionDegResult).toEqual(expectedResult);
});

it('Check calculation for max zoom level 22', function () {
const resolutionDegResult = zoomLevelToResolutionDeg(22);
const expectedResult = 0.000000167638063430786;
expect(resolutionDegResult).toEqual(expectedResult);
});

it('Check for return undefined value for out of range value', function () {
const resolutionDegResult = zoomLevelToResolutionDeg(50);
expect(resolutionDegResult === undefined).toEqual(true);
});
});

describe('zoomLevelToResolutionMeter', () => {
it('Check calculation for min zoom level 0', function () {
const resolutionDegResult = zoomLevelToResolutionMeter(0);
const expectedResult = 78271.52;
expect(resolutionDegResult).toEqual(expectedResult);
});

it('Check calculation for max zoom level 22', function () {
const resolutionDegResult = zoomLevelToResolutionMeter(22);
const expectedResult = 0.0185;
expect(resolutionDegResult).toEqual(expectedResult);
});

it('Check for return undefined value for out of range value', function () {
const resolutionDegResult = zoomLevelToResolutionMeter(50);
expect(resolutionDegResult === undefined).toEqual(true);
});
});
});