diff --git a/@here/harp-mapview/lib/PickListener.ts b/@here/harp-mapview/lib/PickListener.ts index 750652040f..8ab21285d4 100644 --- a/@here/harp-mapview/lib/PickListener.ts +++ b/@here/harp-mapview/lib/PickListener.ts @@ -11,9 +11,12 @@ import { PickResult } from "./PickHandler"; // Default sorting by distance first and then by reversed render order. function defaultSort(lhs: PickResult, rhs: PickResult) { + // HARP-14553: Set a distance tolerance to ignore small distance differences between 2D objects + // that are supposed to lie on the same plane. + const eps = 1e-4; const distanceDiff = lhs.distance - rhs.distance; const haveRenderOrder = lhs.renderOrder !== undefined && rhs.renderOrder !== undefined; - if (distanceDiff !== 0 || !haveRenderOrder) { + if (Math.abs(distanceDiff) > eps || !haveRenderOrder) { return distanceDiff; } diff --git a/@here/harp-mapview/test/PickListenerTest.ts b/@here/harp-mapview/test/PickListenerTest.ts index 25a18699d0..6beb0b9361 100644 --- a/@here/harp-mapview/test/PickListenerTest.ts +++ b/@here/harp-mapview/test/PickListenerTest.ts @@ -207,6 +207,32 @@ describe("PickListener", function () { expect(listener.results).to.have.ordered.members(expectedResults); }); + it("ignores small distance differences for sorting", function () { + const listener = new PickListener(); + const eps = 1e-6; + const expectedResults: PickResult[] = [ + { + type: PickObjectType.Point, + point, + distance: eps, + renderOrder: 2, + dataSourceName + }, + { + type: PickObjectType.Point, + point, + distance: 0, + renderOrder: 1, + dataSourceName + } + ]; + listener.addResult(expectedResults[1]); + listener.addResult(expectedResults[0]); + listener.finish(); + + expect(listener.results).to.have.ordered.members(expectedResults); + }); + it("keeps only the closest maximum result count if specified", function () { const maxResultCount = 1; const listener = new PickListener({ maxResultCount });