You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
hy-screen-2.0/src/config/layers.js

729 lines
24 KiB

export const HONGYUAN_BOUNDS = {
west: 101.852492,
south: 31.851389,
east: 103.347518,
north: 33.319796,
}
export const WMS_IMAGE_SIZE = {
width: 2400,
height: 2400,
}
export const SATELLITE_TEXTURE_ZOOM = 9
export const NATIONAL_PARK_ZONING_COLORS = {
core: {
fillColor: "#FFCB45",
strokeColor: "#FFF4B8",
},
general: {
fillColor: "#35E8FF",
strokeColor: "#C9FBFF",
},
}
function escapeCqlLiteral(value) {
return String(value).replace(/'/g, "''")
}
function createEqualityCql(field, value) {
return `${field} = '${escapeCqlLiteral(value)}'`
}
const grasslandTypeLegends = [
{ name: "低地草甸类", fillColor: "#FFFFFF", strokeColor: "#FFFFFF" },
{ name: "莎草、杂类草型", fillColor: "#F67A7A", strokeColor: "#F67A7A" },
{ name: "山地草甸类", fillColor: "#FFFFFF", strokeColor: "#FFFFFF" },
{ name: "羊茅、杂类草型", fillColor: "#E69800", strokeColor: "#E69800" },
{ name: "早熟禾、杂类草型", fillColor: "#FFD380", strokeColor: "#FFD380" },
{ name: "垂穗披碱草型", fillColor: "#FFAA01", strokeColor: "#FFAA01" },
{ name: "苔草、杂类草型", fillColor: "#FFEBB0", strokeColor: "#FFEBB0" },
{ name: "委陵菜、杂类草型", fillColor: "#F5CA7B", strokeColor: "#F5CA7B" },
{ name: "披碱草型", fillColor: "#A87001", strokeColor: "#A87001" },
{ name: "高寒草甸类", fillColor: "#FFFFFF", strokeColor: "#FFFFFF" },
{ name: "矮生嵩草、杂类草型", fillColor: "#6CB3FF", strokeColor: "#6CB3FF" },
{ name: "矮生嵩草、圆穗蓼型", fillColor: "#00C7FF", strokeColor: "#00C7FF" },
{ name: "西藏嵩草、杂类草型", fillColor: "#8FE5FD", strokeColor: "#8FE5FD" },
{ name: "西藏嵩草、甘肃嵩草型", fillColor: "#7B8FED", strokeColor: "#7B8FED" },
{ name: "高山嵩草、矮生嵩草型", fillColor: "#71DDFE", strokeColor: "#71DDFE" },
{ name: "高山嵩草、苔草型", fillColor: "#7BB5F3", strokeColor: "#7BB5F3" },
{ name: "高山嵩草、杂类草型", fillColor: "#444E87", strokeColor: "#444E87" },
{ name: "具灌木的矮生嵩草型", fillColor: "#6873D1", strokeColor: "#6873D1" },
].map((item, index) => ({
...item,
key: `grassland-type-${index + 1}`,
cqlFilter: createEqualityCql("grass_min_type", item.name),
rankingPropertyName: ["area_code", "acreage"],
rankingTownCodeKeys: ["area_code"],
rankingAreaKeys: ["acreage"],
}))
const productivityLegends = [
{ name: ">4000(kg/hm2)", fillColor: "#39A700", strokeColor: "#39A700" },
{ name: "3000-4000(kg/hm2)", fillColor: "#8CCF00", strokeColor: "#8CCF00" },
{ name: "2000-3000(kg/hm2)", fillColor: "#FEFE02", strokeColor: "#FEFE02" },
{ name: "1500-2000(kg/hm2)", fillColor: "#FE7E01", strokeColor: "#FE7E01" },
{ name: "<1500(kg/hm2)", fillColor: "#FB0100", strokeColor: "#FB0100" },
].map((item) => ({ ...item, selectable: false }))
const grasslandLevelText = {
1: "一级",
2: "二级",
3: "三级",
4: "四级",
5: "五级",
6: "六级",
7: "七级",
8: "八级",
}
const grasslandLevelLegends = [
{ level: "1", name: "1级草原", fillColor: "#81D10B", strokeColor: "#81D10B" },
{ level: "2", name: "2级草原", fillColor: "#8AE611", strokeColor: "#8AE611" },
{ level: "3", name: "3级草原", fillColor: "#79C801", strokeColor: "#79C801" },
{ level: "4", name: "4级草原", fillColor: "#D0EC03", strokeColor: "#D0EC03" },
{ level: "5", name: "5级草原", fillColor: "#FFCC00", strokeColor: "#FFCC00" },
{ level: "6", name: "6级草原", fillColor: "#FF6501", strokeColor: "#FF6501" },
{ level: "7", name: "7级草原", fillColor: "#FB0002", strokeColor: "#FB0002" },
{ level: "8", name: "8级草原", fillColor: "#D71345", strokeColor: "#D71345" },
].map((item) => ({
...item,
key: `grassland-level-${item.level}`,
cqlFilter: `grassland_level IN ('${item.level}','${item.name}','${grasslandLevelText[item.level]}草原','${grasslandLevelText[item.level]}草地')`,
rankingPropertyName: ["area_code", "acreage"],
rankingTownCodeKeys: ["area_code"],
rankingAreaKeys: ["acreage"],
level: undefined,
}))
const wetlandLevelLegends = grasslandLevelLegends.map((item) => {
const level = item.key.replace("grassland-level-", "")
const name = item.name.replace("草原", "湿地")
return {
...item,
key: `wetland-level-${level}`,
name,
cqlFilter: `grassland_level IN ('${level}','${name}','${item.name}','${grasslandLevelText[level]}湿地','${grasslandLevelText[level]}草原','${grasslandLevelText[level]}草地')`,
}
})
const basicGrasslandLegends = [
{
key: "basic-grassland-basic",
name: "基本草原",
fillColor: "#2EEA78",
strokeColor: "#18F8FF",
cqlFilter: "(grassland_category_code = 'BASIC' OR grassland_category_name = '基本草原')",
rankingValueKey: "basicAreaWanMu",
},
{
key: "basic-grassland-general",
name: "一般草原",
fillColor: "#FFD15A",
strokeColor: "#18F8FF",
cqlFilter: "(grassland_category_code = 'GENERAL' OR grassland_category_name = '一般草原')",
rankingValueKey: "generalAreaWanMu",
},
]
export const forestGrassWetTopics = [
{
key: "overview",
name: "资源概览",
color: "#30DCFF",
defaultLayerKey: "",
coreGroups: [],
},
{
key: "grassland",
name: "草地资源",
color: "#8AE611",
defaultLayerKey: "grassland-distribution",
coreGroups: ["grassLand", "grassland"],
},
{
key: "wetland",
name: "湿地资源",
color: "#33A3DC",
defaultLayerKey: "wetland-distribution",
coreGroups: ["wetland"],
},
{
key: "woodland",
name: "林地资源",
color: "#2BD17E",
defaultLayerKey: "woodland-distribution",
coreGroups: ["woodland"],
},
]
export const forestGrassWetOverlayLayers = []
export const ecologicalProtectionTopics = [
{
key: "ecological-redline",
name: "生态保护红线",
color: "#30DCFF",
defaultLayerKey: "ecological-redline-boundary",
},
{
key: "natural-protected-area",
name: "自然保护地",
color: "#19FFC6",
defaultLayerKey: "natural-protected-area-boundary",
},
{
key: "national-park",
name: "若尔盖国家公园",
color: "#46E7FF",
defaultLayerKey: "national-park-zoning",
},
{
key: "restoration",
name: "生态修复工程",
color: "#33A3DC",
defaultLayerKey: "restoration-projects",
},
{
key: "engineering-analysis",
name: "生态工程分析",
color: "#24F6C4",
defaultLayerKey: "engineering-analysis-projects",
},
]
export const yakIndustryChainTopics = [
{
key: "yak-industry-chain",
name: "牦牛产业链",
color: "#24F6C4",
defaultLayerKey: "yak-industry-points",
},
]
export const forestGrassWetLayers = {
woodland: [
{
key: "woodland-distribution",
name: "林地范围",
layerName: "ne:t_woodland_2023",
styles: "woodland_distribution",
opacity: 0.82,
legends: [{ key: "woodland-distribution-all", name: "林地范围", fillColor: "#2BD17E", strokeColor: "#2BD17E", selectable: false }],
},
{
key: "woodland-protection",
name: "公益林",
layerName: "ne:t_woodland_2023",
styles: "woodland_protection",
opacity: 0.86,
legends: [
{ key: "woodland-protection-level-1", name: "国家一级公益林", fillColor: "#08C4C5", strokeColor: "#08C4C5", cqlFilter: createEqualityCql("gjgyl_bhdj", "1") },
{ key: "woodland-protection-level-2", name: "国家二级公益林", fillColor: "#2BD17E", strokeColor: "#2BD17E", cqlFilter: createEqualityCql("gjgyl_bhdj", "2") },
{ key: "woodland-protection-unset", name: "未划定", fillColor: "#6B8191", strokeColor: "#6B8191", cqlFilter: "(gjgyl_bhdj IS NULL OR gjgyl_bhdj = '' OR gjgyl_bhdj NOT IN ('1','2'))" },
],
},
{
key: "woodland-type",
name: "林地类型",
layerName: "ne:t_woodland_2023",
styles: "woodland_type",
opacity: 0.84,
legends: [
{ key: "woodland-type-shrub", name: "灌木林地", fillColor: "#2BD17E", strokeColor: "#2BD17E", cqlFilter: createEqualityCql("dlmc", "灌木林地") },
{ key: "woodland-type-arbor", name: "乔木林地", fillColor: "#0DA368", strokeColor: "#0DA368", cqlFilter: createEqualityCql("dlmc", "乔木林地") },
{ key: "woodland-type-swamp", name: "灌丛沼泽", fillColor: "#23C7B7", strokeColor: "#23C7B7", cqlFilter: createEqualityCql("dlmc", "灌丛沼泽") },
{ key: "woodland-type-other", name: "其他林地", fillColor: "#B7D96B", strokeColor: "#B7D96B", cqlFilter: "(dlmc IS NULL OR dlmc = '' OR dlmc NOT IN ('灌木林地','乔木林地','灌丛沼泽'))" },
],
},
{
key: "woodland-quality",
name: "林地质量",
layerName: "ne:t_woodland_2023",
styles: "woodland_quality",
opacity: 0.84,
legends: [
{ key: "woodland-quality-2", name: "二级质量", fillColor: "#08C4C5", strokeColor: "#08C4C5", cqlFilter: createEqualityCql("zl_dj", "2") },
{ key: "woodland-quality-3", name: "三级质量", fillColor: "#2BD17E", strokeColor: "#2BD17E", cqlFilter: createEqualityCql("zl_dj", "3") },
{ key: "woodland-quality-4", name: "四级质量", fillColor: "#23C7B7", strokeColor: "#23C7B7", cqlFilter: createEqualityCql("zl_dj", "4") },
{ key: "woodland-quality-5", name: "五级质量", fillColor: "#B7D96B", strokeColor: "#B7D96B", cqlFilter: createEqualityCql("zl_dj", "5") },
{ key: "woodland-quality-unset", name: "未划分", fillColor: "#6B8191", strokeColor: "#6B8191", cqlFilter: "(zl_dj IS NULL OR zl_dj = '' OR zl_dj NOT IN ('2','3','4','5'))" },
],
},
{
key: "woodland-ownership",
name: "林地权属",
layerName: "ne:t_woodland_2023",
styles: "woodland_ownership",
opacity: 0.84,
legends: [
{ key: "woodland-ownership-collective", name: "集体林地", fillColor: "#2BD17E", strokeColor: "#2BD17E", cqlFilter: createEqualityCql("ld_qs", "10") },
{ key: "woodland-ownership-other", name: "国有或其他", fillColor: "#08C4C5", strokeColor: "#08C4C5", cqlFilter: "(ld_qs IS NULL OR ld_qs = '' OR ld_qs <> '10')" },
],
},
],
grassland: [
{
key: "grassland-distribution",
name: "草地分布",
layerName: "ne:t_grassland_result_caodi",
opacity: 0.82,
legends: [{ name: "草地", fillColor: "#1D953F", strokeColor: "#1D953F" }],
},
{
key: "basic-grassland",
name: "基本/一般草原",
layerName: "ne:t_basic_grassland_2023",
styles: "basic_grassland_type",
opacity: 0.84,
legends: basicGrasslandLegends,
},
{
key: "grassland-level",
name: "草原级",
layerName: "ne:t_grassland_result_level_caodi",
opacity: 0.82,
legends: grasslandLevelLegends,
},
{
key: "grassland-type",
name: "草原类型",
layerName: "ne:t_grassland_result_grass_min_type_caodi",
opacity: 0.82,
legends: grasslandTypeLegends,
},
{
key: "grassland-yield",
name: "草地产草量/生产力",
layerName: "ne:t_grassland_result_yield_caodi",
opacity: 0.82,
legends: productivityLegends,
},
{
key: "grassland-health",
name: "草地健康/退化",
layerName: "ne:2023_08_ndvi",
opacity: 0.78,
legends: [
{ name: "非常差", fillColor: "#FF000533", strokeColor: "#FF0005", selectable: false },
{ name: "差", fillColor: "#D8EE8C33", strokeColor: "#D8EE8C", selectable: false },
{ name: "正常", fillColor: "#78C96233", strokeColor: "#78C962", selectable: false },
{ name: "较好", fillColor: "#25814933", strokeColor: "#258149", selectable: false },
],
},
],
wetland: [
{
key: "wetland-distribution",
name: "湿地分布",
layerName: "ne:t_grassland_result_shidi",
opacity: 0.84,
legends: [{ name: "湿地", fillColor: "#33A3DC", strokeColor: "#33A3DC" }],
},
{
key: "wetland-level",
name: "湿地级",
layerName: "ne:t_grassland_result_level_shidi",
opacity: 0.82,
legends: wetlandLevelLegends,
},
{
key: "wetland-type",
name: "湿地类型",
layerName: "ne:t_grassland_result_grass_min_type_shidi",
opacity: 0.82,
legends: grasslandTypeLegends,
},
{
key: "wetland-yield",
name: "湿地产草量/生产力",
layerName: "ne:t_grassland_result_yield_shidi",
opacity: 0.82,
legends: productivityLegends,
},
],
}
export const ecologicalProtectionLayers = {
"ecological-redline": [
{
key: "ecological-redline-boundary",
name: "生态保护红线",
layerName: "ne:t_ecological_redline_hy",
sourceType: "wfs",
styles: "ecological_redline_hy",
opacity: 0.58,
fillColor: "#5EDFEA",
strokeColor: "#BFFFFF",
fillAlpha: 0.08,
strokeAlpha: 0.56,
lineWidth: 1.42,
mapView: {
targetLngLat: [102.58, 32.72],
distanceScale: 0.78,
targetLocalZ: 0.76,
duration: 0.9,
},
legends: [
{
key: "ecological-redline-all",
name: "生态保护红线",
fillColor: "rgba(94, 223, 234, 0.28)",
strokeColor: "#BFFFFF",
selectable: false,
},
],
},
],
"natural-protected-area": [
{
key: "natural-protected-area-boundary",
name: "自然保护地",
layerName: "ne:t_natural_protected_area_hy",
sourceType: "wfs",
styles: "natural_protected_area_hy",
opacity: 0.74,
mapView: {
targetLngLat: [102.64, 33.02],
distanceScale: 0.7,
targetLocalZ: 0.78,
duration: 0.9,
},
legends: [
{
key: "natural-protected-area-core",
name: "核心保护区",
fillColor: "rgba(36, 246, 196, 0.16)",
strokeColor: "#B9FBFF",
matches: [
{ field: "functional_zone", value: "核心保护区" },
{ field: "reserve_zone", value: "核心保护区" },
],
selectable: false,
},
{
key: "natural-protected-area-general",
name: "一般控制区",
fillColor: "rgba(48, 220, 255, 0.12)",
strokeColor: "#8BF7FF",
matches: [
{ field: "functional_zone", value: "一般控制区" },
{ field: "reserve_zone", value: "一般控制区" },
],
selectable: false,
},
],
},
],
"national-park": [
{
key: "national-park-zoning",
name: "国家公园分区",
sourceType: "wkt-api",
apiUrl: "/openApi/gjgy/gjgy_area",
fallbackPath: "datas/ecological-protection/national_park_wkt.json",
clipToHongyuanBoundary: true,
clipToLayerBounds: false,
opacity: 0.9,
mapView: {
targetLngLat: [102.88, 33.15],
distanceScale: 0.68,
targetLocalZ: 0.78,
duration: 0.95,
},
legends: [
{
key: "national-park-core",
name: "核心保护区",
fillColor: NATIONAL_PARK_ZONING_COLORS.core.fillColor,
strokeColor: NATIONAL_PARK_ZONING_COLORS.core.strokeColor,
match: { field: "type", value: "核心保护区" },
selectable: false,
},
{
key: "national-park-general",
name: "一般控制区",
fillColor: NATIONAL_PARK_ZONING_COLORS.general.fillColor,
strokeColor: NATIONAL_PARK_ZONING_COLORS.general.strokeColor,
match: { field: "type", value: "一般控制区" },
selectable: false,
},
],
},
],
restoration: [
{
key: "restoration-projects",
name: "生态修复工程",
sourceType: "geojson",
dataPath: "datas/ecological-protection/ecological_restoration_projects.geojson",
opacity: 0.72,
legends: [
{
key: "restoration-grassland",
name: "草地修复",
fillColor: "#75AD49",
strokeColor: "#D2EA78",
cqlFilter: createEqualityCql("project_category", "草地修复"),
match: { field: "project_category", value: "草地修复" },
},
{
key: "restoration-wetland",
name: "湿地修复",
fillColor: "#4FB4C3",
strokeColor: "#A9EEF2",
cqlFilter: createEqualityCql("project_category", "湿地修复"),
match: { field: "project_category", value: "湿地修复" },
},
{
key: "restoration-woodland",
name: "林地修复",
fillColor: "#43A97A",
strokeColor: "#95E2B7",
cqlFilter: createEqualityCql("project_category", "林地修复"),
match: { field: "project_category", value: "林地修复" },
},
{
key: "restoration-linear",
name: "线性设施",
fillColor: "#D2B24D",
strokeColor: "#FFE28A",
cqlFilter: createEqualityCql("feature_role", "线性设施"),
match: { field: "feature_role", value: "线性设施" },
},
],
},
],
"engineering-analysis": [
{
key: "engineering-analysis-projects",
name: "工程分析项目库",
sourceType: "geojson",
dataPath: "datas/ecological-protection/ecological_restoration_projects.geojson",
opacity: 0.76,
mapView: {
targetLngLat: [102.58, 32.72],
distanceScale: 0.78,
targetLocalZ: 0.72,
duration: 0.85,
},
legends: [
{
key: "analysis-project-grassland",
name: "草地修复",
fillColor: "#75AD49",
strokeColor: "#D2EA78",
match: { field: "project_category", value: "草地修复" },
selectable: false,
},
{
key: "analysis-project-wetland",
name: "湿地修复",
fillColor: "#4FB4C3",
strokeColor: "#A9EEF2",
match: { field: "project_category", value: "湿地修复" },
selectable: false,
},
{
key: "analysis-project-woodland",
name: "林地修复",
fillColor: "#43A97A",
strokeColor: "#95E2B7",
match: { field: "project_category", value: "林地修复" },
selectable: false,
},
{
key: "analysis-project-linear",
name: "线性设施",
fillColor: "#D2B24D",
strokeColor: "#FFE28A",
match: { field: "feature_role", value: "线性设施" },
selectable: false,
},
],
},
],
}
export const yakIndustryChainLayers = {
"yak-industry-chain": [
{
key: "yak-recognition-layer",
name: "牦牛识别",
sourceType: "wmts",
layerName: "ne:daping_yak_marks",
style: "ne:yak_marks",
styles: "ne:yak_marks",
format: "image/png",
tileMatrixSetID: "EPSG:900913",
maximumLevel: 21,
homeWmtsZoom: 10,
homeWmtsEnhance: true,
homeWmtsPointSpread: 1.4,
homeWmtsGlowRadius: 1.8,
url: "/geoserver/gwc/service/wmts",
opacity: 0.96,
queryBuffer: 10,
fillColor: "rgba(255, 230, 0, 0)",
strokeColor: "#FFE600",
glowColor: "rgba(255, 230, 0, 0.42)",
lineWidth: 1.4,
mapView: {
targetLngLat: [102.58, 32.72],
distanceScale: 0.82,
targetLocalZ: 0.76,
duration: 0.85,
},
legends: [
{
key: "yak-recognition-all",
name: "牦牛识别",
fillColor: "#FFE600",
strokeColor: "#FFF58A",
selectable: false,
},
],
},
{
key: "yak-industry-points",
name: "牦牛产业点位",
sourceType: "geojson",
dataPath: "datas/yak-industry-chain/yak_industry_points.geojson",
opacity: 0.96,
pointLabelLimit: 12,
showPointLabels: false,
mapView: {
targetLngLat: [102.48, 32.69],
distanceScale: 0.82,
targetLocalZ: 0.76,
duration: 0.85,
},
legends: [
{
key: "yak-industry-family-pasture",
name: "家庭生态牧场",
fillColor: "#30DCFF",
strokeColor: "#C9FBFF",
match: { field: "stageKey", value: "family-pasture" },
},
{
key: "yak-industry-artificial-grassland",
name: "人工种草基地点",
fillColor: "#19FFC6",
strokeColor: "#B7FFF2",
match: { field: "stageKey", value: "artificial-grassland" },
},
{
key: "yak-industry-scale-breeding",
name: "规模化养殖基地",
fillColor: "#46E7FF",
strokeColor: "#C9FBFF",
match: { field: "stageKey", value: "scale-breeding" },
},
{
key: "yak-industry-breeding-selection",
name: "选育/扩繁基地",
fillColor: "#7AEFFF",
strokeColor: "#D8FAFF",
matches: [
{ field: "categoryCode", value: "YC-BREEDING-STOCK" },
{ field: "categoryCode", value: "YC-CXPT-BREEDING-STOCK-BASE" },
],
},
{
key: "yak-industry-forage-storage",
name: "防灾减灾",
fillColor: "#25CBE8",
strokeColor: "#B8F7FF",
match: { field: "stageKey", value: "forage-storage" },
},
{
key: "yak-industry-milk-source-station",
name: "奶源站",
fillColor: "#5CDFFF",
strokeColor: "#D8FAFF",
match: { field: "stageKey", value: "milk-source-station" },
},
{
key: "yak-industry-slaughter-processing",
name: "屠宰与加工",
fillColor: "#1FAFD2",
strokeColor: "#B8F7FF",
match: { field: "stageKey", value: "slaughter-processing" },
},
{
key: "yak-industry-farm-equipment",
name: "农机装备",
fillColor: "#30DCFF",
strokeColor: "#C9FBFF",
match: { field: "stageKey", value: "farm-equipment" },
},
{
key: "yak-industry-forage-trade",
name: "牧草交易",
fillColor: "#19FFC6",
strokeColor: "#B7FFF2",
match: { field: "stageKey", value: "forage-trade" },
},
{
key: "yak-industry-social-service",
name: "社会化服务",
fillColor: "#8AEFFF",
strokeColor: "#E2FDFF",
match: { field: "stageKey", value: "social-service" },
},
],
},
{
key: "artificial-grassland-plots",
name: "人工种草图斑",
sourceType: "geojson",
dataPath: "datas/yak-industry-chain/artificial_grassland_plots.geojson",
opacity: 0.94,
clipToHongyuanBoundary: true,
mapView: {
targetLngLat: [102.51, 32.79],
distanceScale: 0.62,
targetLocalZ: 0.76,
duration: 0.9,
},
legends: [
{
key: "artificial-grassland-pending",
name: "待核定种草图斑",
fillColor: "#30DCFF",
strokeColor: "#C9FBFF",
match: { field: "data_status", value: "待核定" },
selectable: false,
},
],
},
],
}
const layerRegistry = {
...forestGrassWetLayers,
...ecologicalProtectionLayers,
...yakIndustryChainLayers,
}
const topicRegistry = [...forestGrassWetTopics, ...ecologicalProtectionTopics, ...yakIndustryChainTopics]
export function getTopicConfig(topicKey) {
return topicRegistry.find((topic) => topic.key === topicKey) || forestGrassWetTopics[0]
}
export function getLayersByTopic(topicKey) {
return layerRegistry[topicKey] || []
}
export function getLayerByKey(topicKey, layerKey) {
const layers = getLayersByTopic(topicKey)
return layers.find((layer) => layer.key === layerKey) || layers[0]
}
export function getForestGrassWetOverlayLayers(keys = []) {
const selectedKeys = new Set((Array.isArray(keys) ? keys : [keys]).map((key) => String(key || "")).filter(Boolean))
return forestGrassWetOverlayLayers.filter((layer) => selectedKeys.has(layer.key))
}