From 05d969b9e37db3d55cef2040767181be2eac835d Mon Sep 17 00:00:00 2001 From: ronenk1 Date: Mon, 27 Feb 2023 09:54:21 +0200 Subject: [PATCH] feat: zoomToResDeg and zoomToResMeter --- src/geo/tiles.ts | 70 ++++++++++++++++++++++++++++++++++++ tests/unit/geo/tiles.spec.ts | 47 +++++++++++++++++++++++- 2 files changed, 116 insertions(+), 1 deletion(-) diff --git a/src/geo/tiles.ts b/src/geo/tiles.ts index 0e1329a..961c07f 100644 --- a/src/geo/tiles.ts +++ b/src/geo/tiles.ts @@ -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 = { + 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 = { + 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 @@ -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 diff --git a/tests/unit/geo/tiles.spec.ts b/tests/unit/geo/tiles.spec.ts index 7b3d326..f5cb7a2 100644 --- a/tests/unit/geo/tiles.spec.ts +++ b/tests/unit/geo/tiles.spec.ts @@ -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', () => { @@ -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); + }); + }); });