118 lines
3.6 KiB
TypeScript
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);
|
|
}
|