feat(map): add reference layers and stabilize workspace controls
This commit is contained in:
@@ -0,0 +1,117 @@
|
||||
import type { MapPresentationProfile } from "./mapPresentationProfile.js";
|
||||
|
||||
export const TRANSPORT_STATION_REFERENCE_PROFILE_ID = "transport-stations.v1";
|
||||
|
||||
export type MapReferenceStationCategory = "metro" | "railway_terminal" | "railway_station";
|
||||
|
||||
export type MapReferenceLayer = {
|
||||
id: string;
|
||||
referenceProfileId: typeof TRANSPORT_STATION_REFERENCE_PROFILE_ID;
|
||||
category: MapReferenceStationCategory;
|
||||
presentationProfileId: string;
|
||||
visible: boolean;
|
||||
};
|
||||
|
||||
const profileDefinitions = [
|
||||
{
|
||||
id: "map.reference.transport.metro.v1",
|
||||
title: "Метро",
|
||||
category: "metro",
|
||||
semanticTypes: ["map.station"],
|
||||
hideCameraHeightMeters: 10_000,
|
||||
},
|
||||
{
|
||||
id: "map.reference.transport.terminal.v1",
|
||||
title: "Вокзалы",
|
||||
category: "railway_terminal",
|
||||
semanticTypes: ["map.terminal"],
|
||||
hideCameraHeightMeters: 35_000,
|
||||
},
|
||||
{
|
||||
id: "map.reference.transport.railway-station.v1",
|
||||
title: "Станции РЖД",
|
||||
category: "railway_station",
|
||||
semanticTypes: ["map.station"],
|
||||
hideCameraHeightMeters: 15_000,
|
||||
},
|
||||
] as const;
|
||||
|
||||
export const defaultMapReferenceLayers: readonly MapReferenceLayer[] = profileDefinitions.map((definition) => ({
|
||||
id: `reference.transport.${definition.category}`,
|
||||
referenceProfileId: TRANSPORT_STATION_REFERENCE_PROFILE_ID,
|
||||
category: definition.category,
|
||||
presentationProfileId: definition.id,
|
||||
visible: true,
|
||||
}));
|
||||
|
||||
export const defaultMapReferencePresentationProfiles: readonly MapPresentationProfile[] = profileDefinitions.map((definition) => ({
|
||||
id: definition.id,
|
||||
version: "1.2.0",
|
||||
title: definition.title,
|
||||
semanticTypes: [...definition.semanticTypes],
|
||||
label: {
|
||||
mode: "attributes",
|
||||
fields: ["name", "official_name", "local_name"],
|
||||
fontWeight: 600,
|
||||
sizePx: 20,
|
||||
color: "#cccccc",
|
||||
outlineColor: "#0c0d12",
|
||||
outlineWidthPx: 1,
|
||||
backgroundColor: "#000000",
|
||||
backgroundOpacity: 1,
|
||||
paddingX: 6,
|
||||
paddingY: 3,
|
||||
maxLength: 80,
|
||||
offsetX: 15,
|
||||
offsetY: 0,
|
||||
hideCameraHeightMeters: definition.hideCameraHeightMeters,
|
||||
},
|
||||
target: {
|
||||
variant: "elevated-spike",
|
||||
stemHeightMeters: 500,
|
||||
headSizePx: 20,
|
||||
stemWidthPx: 2,
|
||||
outlineColor: "#ff00c8",
|
||||
outlineOpacity: 1,
|
||||
outlineWidthPx: 2,
|
||||
hideCameraHeightMeters: definition.hideCameraHeightMeters,
|
||||
},
|
||||
facets: [{
|
||||
id: "category",
|
||||
field: "category",
|
||||
label: "Категория",
|
||||
filterable: false,
|
||||
counter: false,
|
||||
values: [{ value: definition.category, label: definition.title, order: 0 }],
|
||||
}],
|
||||
styles: [{ id: "reference", color: "#ffffff", opacity: 1 }],
|
||||
classes: [{
|
||||
id: definition.category,
|
||||
label: definition.title,
|
||||
priority: 100,
|
||||
match: [{ field: "category", equals: definition.category }],
|
||||
styleId: "reference",
|
||||
renderable: true,
|
||||
}],
|
||||
defaultClassId: definition.category,
|
||||
sort: [{ field: "category", order: [definition.category] }],
|
||||
}));
|
||||
|
||||
export function ensureMapReferencePresentationProfiles(profiles: MapPresentationProfile[]) {
|
||||
const ids = new Set(profiles.map((profile) => profile.id));
|
||||
return [
|
||||
...profiles,
|
||||
...defaultMapReferencePresentationProfiles
|
||||
.filter((profile) => !ids.has(profile.id))
|
||||
.map((profile) => structuredClone(profile) as MapPresentationProfile),
|
||||
];
|
||||
}
|
||||
|
||||
export function initialMapReferenceLayers(value?: MapReferenceLayer[]) {
|
||||
const byId = new Map((value ?? []).map((layer) => [layer.id, layer]));
|
||||
return defaultMapReferenceLayers.map((layer) => structuredClone(byId.get(layer.id) ?? layer));
|
||||
}
|
||||
|
||||
export function isMapReferencePresentationProfile(profile: MapPresentationProfile) {
|
||||
return defaultMapReferencePresentationProfiles.some((candidate) => candidate.id === profile.id);
|
||||
}
|
||||
Reference in New Issue
Block a user