Files
NODEDC_DESIGN_GUIDELINE/apps/catalog/src/mapReferenceStations.ts
T

118 lines
3.6 KiB
TypeScript

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);
}