diff --git a/.changeset/fix-lnglat-distance-units.md b/.changeset/fix-lnglat-distance-units.md new file mode 100644 index 0000000000000000000000000000000000000000..306aca574a93afcfd7131679aca8904f652d3b99 --- /dev/null +++ b/.changeset/fix-lnglat-distance-units.md @@ -0,0 +1,9 @@ +--- +'@antv/l7-utils': patch +--- + +fix(utils): respect the units parameter in lnglatDistance + +`lnglatDistance` 接收 `units` 参数但内部用 `(units = 'meters')` 覆盖了它,导致 +调用方传入的单位被忽略,函数始终返回米。现将 `units` 改为默认值 `'meters'` 并 +直接透传给 `radiansToLength`,使 `kilometers` 等单位正常生效。 diff --git a/packages/utils/__tests__/geo.spec.ts b/packages/utils/__tests__/geo.spec.ts index b70448a88a6f05776fa4dfe98b4d64db11ddf33d..44a3aa9160650635a02b6f52b80563021a36c73f 100644 --- a/packages/utils/__tests__/geo.spec.ts +++ b/packages/utils/__tests__/geo.spec.ts @@ -1,5 +1,5 @@ import type { IBounds } from '../src/geo'; -import { boundsContains, padBounds } from '../src/geo'; +import { boundsContains, lnglatDistance, padBounds } from '../src/geo'; describe('geo', () => { it('padBounds', () => { @@ -30,4 +30,15 @@ describe('geo', () => { expect(boundsContains(bounds, b2)).toEqual(true); expect(boundsContains(bounds, b3)).toEqual(false); }); + + it('lnglatDistance defaults to meters', () => { + const meters = lnglatDistance([116, 39], [117, 39]); + expect(meters).toBeCloseTo(86414.37, 1); + }); + + it('lnglatDistance respects the units parameter', () => { + const meters = lnglatDistance([116, 39], [117, 39], 'meters'); + const kilometers = lnglatDistance([116, 39], [117, 39], 'kilometers'); + expect(kilometers).toBeCloseTo(meters / 1000, 5); + }); }); diff --git a/packages/utils/src/geo.ts b/packages/utils/src/geo.ts index 50d8d000108cd6a4085362410c9e9294b78b71f7..a4a14a90cdfc28e3f6a5077230aec54648d0d6af 100644 --- a/packages/utils/src/geo.ts +++ b/packages/utils/src/geo.ts @@ -213,7 +213,7 @@ export function amap2UnProject(x: number, y: number): [number, number] { export function lnglatDistance( coordinates1: [number, number], coordinates2: [number, number], - units?: Units, + units: Units = 'meters', ): number { const dLat = degreesToRadians(coordinates2[1] - coordinates1[1]); const dLon = degreesToRadians(coordinates2[0] - coordinates1[0]); @@ -223,11 +223,7 @@ export function lnglatDistance( Math.pow(Math.sin(dLat / 2), 2) + Math.pow(Math.sin(dLon / 2), 2) * Math.cos(lat1) * Math.cos(lat2); - return radiansToLength( - 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)), - // eslint-disable-next-line @typescript-eslint/no-unused-vars - (units = 'meters'), - ); + return radiansToLength(2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)), units); } export function project(lnglat: [number, number]) {