diff --git a/src/circle/MapKitCircleOverlayRenderer.ts b/src/circle/MapKitCircleOverlayRenderer.ts index a1d5950..25211b9 100644 --- a/src/circle/MapKitCircleOverlayRenderer.ts +++ b/src/circle/MapKitCircleOverlayRenderer.ts @@ -8,7 +8,7 @@ import { type CircleOverlayRenderer, } from '@mapconductor/js-sdk-core'; import { MapKitViewHolder } from '../MapKitViewHolder'; -import { toCoordinates, toMapKitStyleColor } from '../helpers'; +import { toCoordinates, toMapKitStyleColor, addStackedOverlay } from '../helpers'; import type { MapKitActualCircle } from '../MapKitTypeAlias'; /** @@ -41,7 +41,7 @@ export class MapKitCircleOverlayRenderer implements CircleOverlayRenderer(); +let overlayStackSequence = 0; + +/** + * Adds a polygon / circle / polyline overlay at its place in the shared stack + * (js-sdk-core OVERLAY_STACK_ORDER: polygon < circle < polyline, zIndex within the band, equal + * zIndexes in the order they were handed over). + * + * MapKit JS has no z-order for overlays: it draws them in the order of `map.overlays`. Overlays + * that belong above the new one are taken off and put back after it. Adding them in whatever + * order they arrived used to decide which kind was on top. + */ +export function addStackedOverlay( + map: mapkit.Map, + overlay: mapkit.Overlay, + kind: OverlayKind, + zIndex: number | null | undefined = 0, +): void { + const key: OverlayStackKey = { kind, zIndex: zIndex ?? 0, sequence: ++overlayStackSequence }; + overlayStackKeys.set(overlay, key); + const above = map.overlays.filter((other) => { + const otherKey = overlayStackKeys.get(other); + return otherKey != null && compareOverlayStackKeys(otherKey, key) > 0; + }); + if (above.length > 0) map.removeOverlays(above); + map.addOverlay(overlay); + if (above.length > 0) map.addOverlays(above); +} diff --git a/src/polygon/MapKitPolygonOverlayRenderer.ts b/src/polygon/MapKitPolygonOverlayRenderer.ts index c136154..bbadb05 100644 --- a/src/polygon/MapKitPolygonOverlayRenderer.ts +++ b/src/polygon/MapKitPolygonOverlayRenderer.ts @@ -8,7 +8,7 @@ import { type PolygonOverlayRenderer, } from '@mapconductor/js-sdk-core'; import { MapKitViewHolder } from '../MapKitViewHolder'; -import { toCoordinates, toMapKitStyleColor } from '../helpers'; +import { toCoordinates, toMapKitStyleColor, addStackedOverlay } from '../helpers'; import type { MapKitActualPolygon } from '../MapKitTypeAlias'; // Match the ArcGIS/native geodesic densification cap so world-mask rings stay a @@ -41,7 +41,7 @@ export class MapKitPolygonOverlayRenderer implements PolygonOverlayRenderer