feat(map): add seamless five-band grid LOD

This commit is contained in:
Codex
2026-08-05 19:36:01 +03:00
parent 2cd3b33141
commit 80e948c018
10 changed files with 638 additions and 62 deletions
+50 -3
View File
@@ -519,9 +519,16 @@ const MAP_PAGE_SETTING_KEYS = new Set([
"sunHour", "sunIntensity", "shadowsEnabled", "buildingsVisible", "buildingsColor",
"buildingsOpacity", "buildingsDetail", "imageryBrightness", "imageryContrast",
"imagerySaturation", "gridVisible", "gridLodEnabled", "gridHeightMeters",
"grid3dEnabled", "gridGraticuleEnabled", "gridCenterMode", "gridCenterLatitude",
"gridCenterLongitude", "gridTileSizeKm", "gridAutoDisableHeightKm", "gridRebuildOnMoveEnd",
"gridMax3dViewAngleDegrees",
"gridLod1MaxHeightKm", "gridLod1StepKm", "gridLod2MaxHeightKm", "gridLod2StepKm",
"gridLod3StepKm", "gridRadiusKm", "gridLineWidth", "gridColor", "gridOpacity",
"gridDotsEnabled", "gridDotsSize", "gridDotsColor", "gridDotsOpacity",
"gridLod3MaxHeightKm", "gridLod3StepKm", "gridLod4MaxHeightKm", "gridLod4StepKm",
"gridLod5StepKm", "gridLod1Mode", "gridLod2Mode", "gridLod3Mode", "gridLod4Mode",
"gridLod5Mode", "gridRadiusKm", "gridLineWidth", "gridLineDiameterMeters", "gridColor", "gridOpacity",
"gridDotsEnabled", "gridDotsSize", "gridDotsDiameterMeters", "gridDotsColor", "gridDotsOpacity",
"gridCrossesEnabled", "gridCrossesLengthMeters", "gridCrossesWidthMeters",
"gridCrossesColor", "gridCrossesOpacity",
]);
function validateMapPageSettingsPatch(value) {
@@ -558,6 +565,9 @@ function validateMapPageLayout(value) {
// Layouts written before this field existed are safely upgraded to the
// no-overwrite default during read/save; they are not rejected as damaged.
if (settings.cacheNoOverwrite !== undefined) requireBoolean(settings.cacheNoOverwrite, "invalid_map_page_setting_cacheNoOverwrite");
for (const key of ["grid3dEnabled", "gridGraticuleEnabled", "gridRebuildOnMoveEnd", "gridCrossesEnabled"]) {
if (settings[key] !== undefined) requireBoolean(settings[key], `invalid_map_page_setting_${key}`);
}
requireString(settings.imagerySource, "invalid_map_page_imagery_source", 64);
for (const key of ["terrainExaggeration", "imageryGamma", "imageryHue", "imageryAlpha", "atmosphereHue", "atmosphereSaturation", "atmosphereBrightness", "fogDensity", "sunHour", "sunIntensity", "buildingsOpacity", "buildingsDetail", "imageryBrightness", "imageryContrast", "imagerySaturation", "gridHeightMeters", "gridLod1MaxHeightKm", "gridLod1StepKm", "gridLod2MaxHeightKm", "gridLod2StepKm", "gridLod3StepKm", "gridRadiusKm", "gridLineWidth", "gridOpacity", "gridDotsSize", "gridDotsOpacity"]) {
requireNumber(settings[key], -100000, 100000, `invalid_map_page_setting_${key}`);
@@ -565,6 +575,18 @@ function validateMapPageLayout(value) {
for (const key of ["monochromeColor", "globeColor", "backgroundColor", "buildingsColor", "gridColor", "gridDotsColor"]) {
requireHex(settings[key], `invalid_map_page_setting_${key}`);
}
for (const key of ["gridCenterLatitude", "gridCenterLongitude", "gridTileSizeKm", "gridAutoDisableHeightKm", "gridMax3dViewAngleDegrees", "gridLod3MaxHeightKm", "gridLod4MaxHeightKm", "gridLod4StepKm", "gridLod5StepKm", "gridLineDiameterMeters", "gridDotsDiameterMeters", "gridCrossesLengthMeters", "gridCrossesWidthMeters", "gridCrossesOpacity"]) {
if (settings[key] !== undefined) requireNumber(settings[key], -100000, 100000, `invalid_map_page_setting_${key}`);
}
if (settings.gridCrossesColor !== undefined) requireHex(settings.gridCrossesColor, "invalid_map_page_setting_gridCrossesColor");
if (settings.gridCenterMode !== undefined && !["camera", "fixed"].includes(settings.gridCenterMode)) {
throw applicationError("invalid_map_page_setting_gridCenterMode");
}
for (const key of ["gridLod1Mode", "gridLod2Mode", "gridLod3Mode", "gridLod4Mode", "gridLod5Mode"]) {
if (settings[key] !== undefined && !["3d", "graticule"].includes(settings[key])) {
throw applicationError(`invalid_map_page_setting_${key}`);
}
}
const camera = value.camera;
for (const key of ["longitude", "latitude", "height", "heading", "pitch", "roll"]) {
requireNumber(camera[key], -1_000_000_000, 1_000_000_000, `invalid_map_page_camera_${key}`);
@@ -712,20 +734,45 @@ function defaultMapPageLayout() {
imagerySaturation: 0,
gridVisible: true,
gridLodEnabled: true,
grid3dEnabled: true,
gridGraticuleEnabled: true,
gridCenterMode: "camera",
gridCenterLatitude: 55.7558,
gridCenterLongitude: 37.6173,
gridTileSizeKm: 10,
gridAutoDisableHeightKm: 10000,
gridRebuildOnMoveEnd: true,
gridMax3dViewAngleDegrees: 30,
gridHeightMeters: 500,
gridLod1MaxHeightKm: 10,
gridLod1StepKm: 1,
gridLod1Mode: "3d",
gridLod2MaxHeightKm: 50,
gridLod2StepKm: 5,
gridLod2Mode: "3d",
gridLod3MaxHeightKm: 180,
gridLod3StepKm: 25,
gridRadiusKm: 40,
gridLod3Mode: "3d",
gridLod4MaxHeightKm: 700,
gridLod4StepKm: 100,
gridLod4Mode: "graticule",
gridLod5StepKm: 500,
gridLod5Mode: "graticule",
gridRadiusKm: 1000,
gridLineWidth: 4,
gridLineDiameterMeters: 10,
gridColor: "#f5f5f5",
gridOpacity: 12,
gridDotsEnabled: true,
gridDotsSize: 7,
gridDotsDiameterMeters: 80,
gridDotsColor: "#ffffff",
gridDotsOpacity: 58,
gridCrossesEnabled: false,
gridCrossesLengthMeters: 200,
gridCrossesWidthMeters: 10,
gridCrossesColor: "#35cfff",
gridCrossesOpacity: 50,
},
mapHeight: 470,
camera: {
+25
View File
@@ -412,20 +412,45 @@ const mapPageSettingsPatchInputSchema = {
imagerySaturation: { type: "number" },
gridVisible: { type: "boolean" },
gridLodEnabled: { type: "boolean" },
grid3dEnabled: { type: "boolean" },
gridGraticuleEnabled: { type: "boolean" },
gridCenterMode: { type: "string", enum: ["camera", "fixed"] },
gridCenterLatitude: { type: "number" },
gridCenterLongitude: { type: "number" },
gridTileSizeKm: { type: "number" },
gridAutoDisableHeightKm: { type: "number" },
gridRebuildOnMoveEnd: { type: "boolean" },
gridMax3dViewAngleDegrees: { type: "number" },
gridHeightMeters: { type: "number" },
gridLod1MaxHeightKm: { type: "number" },
gridLod1StepKm: { type: "number" },
gridLod1Mode: { type: "string", enum: ["3d", "graticule"] },
gridLod2MaxHeightKm: { type: "number" },
gridLod2StepKm: { type: "number" },
gridLod2Mode: { type: "string", enum: ["3d", "graticule"] },
gridLod3MaxHeightKm: { type: "number" },
gridLod3StepKm: { type: "number" },
gridLod3Mode: { type: "string", enum: ["3d", "graticule"] },
gridLod4MaxHeightKm: { type: "number" },
gridLod4StepKm: { type: "number" },
gridLod4Mode: { type: "string", enum: ["3d", "graticule"] },
gridLod5StepKm: { type: "number" },
gridLod5Mode: { type: "string", enum: ["3d", "graticule"] },
gridRadiusKm: { type: "number" },
gridLineWidth: { type: "number" },
gridLineDiameterMeters: { type: "number" },
gridColor: { type: "string", pattern: "^#[0-9A-Fa-f]{6}$" },
gridOpacity: { type: "number" },
gridDotsEnabled: { type: "boolean" },
gridDotsSize: { type: "number" },
gridDotsDiameterMeters: { type: "number" },
gridDotsColor: { type: "string", pattern: "^#[0-9A-Fa-f]{6}$" },
gridDotsOpacity: { type: "number" },
gridCrossesEnabled: { type: "boolean" },
gridCrossesLengthMeters: { type: "number" },
gridCrossesWidthMeters: { type: "number" },
gridCrossesColor: { type: "string", pattern: "^#[0-9A-Fa-f]{6}$" },
gridCrossesOpacity: { type: "number" },
},
};