satupeta-main/shared/services/map-layer.ts
2026-01-27 09:31:12 +07:00

64 lines
1.9 KiB
TypeScript

import axios from "axios";
import mapSourceApi from "./map-source";
export interface LayerOption {
name: string;
url: string;
}
const fetchWMSLayersFromSourceId = async (
sourceId: string
): Promise<LayerOption[]> => {
try {
const source = await mapSourceApi.getMapSourceById(sourceId);
const serverUrl = source.url;
// Fetch WMS GetCapabilities
const res = await axios.get(
`${serverUrl}/wms?service=WMS&request=GetCapabilities`
);
const parser = new DOMParser();
const xml = parser.parseFromString(res.data, "application/xml");
const layers = Array.from(xml.getElementsByTagName("Layer"));
const layerMap = new Map<string, LayerOption>();
layers.forEach((layer) => {
const name = layer.getElementsByTagName("Name")[0]?.textContent;
if (name) {
// Get bounding box from layer XML
const bboxElement = layer.getElementsByTagName("BoundingBox")[0];
let bbox = "-20037508.34,-20037508.34,20037508.34,20037508.34"; // default fallback
if (bboxElement) {
const minx = bboxElement.getAttribute("minx");
const miny = bboxElement.getAttribute("miny");
const maxx = bboxElement.getAttribute("maxx");
const maxy = bboxElement.getAttribute("maxy");
if (minx && miny && maxx && maxy) {
bbox = `${minx},${miny},${maxx},${maxy}`;
}
}
layerMap.set(name, {
name,
url: `${serverUrl}/wms?service=WMS&version=1.1.0&request=GetMap&layers=${name}&bbox=${bbox}&width=768&height=534&srs=EPSG:4326&styles=&format=application/openlayers`,
});
}
});
// Convert Map to array to remove duplicates
const parsedLayers = Array.from(layerMap.values());
return parsedLayers;
} catch (error) {
console.error("Failed to fetch WMS layers", error);
return [];
}
};
export { fetchWMSLayersFromSourceId };