export const convertWKTPointToLatLng = (wktString: string) => { if ( !wktString || typeof wktString !== "string" || !wktString.startsWith("POINT") ) { return null; } const matched = wktString.match(/POINT\s*\(([-\d.]+)\s+([-\d.]+)\)/); if (!matched) return null; const lng = parseFloat(matched[1]); const lat = parseFloat(matched[2]); return [lng, lat]; // [longitude, latitude] }; export const convertWKTLineStringToLatLngArray = (wktString: string) => { if ( !wktString || typeof wktString !== "string" || !wktString.startsWith("LINESTRING") ) { return []; } const matched = wktString.match(/LINESTRING\s*\((.*)\)/); if (!matched) return []; const coordinates = matched[1].split(",").map((coordStr) => { const [x, y] = coordStr.trim().split(" ").map(Number); return [y, x]; // [lat, lng] }); return coordinates; }; export const convertWKTtoLatLngString = (wktString: string) => { if (!wktString || typeof wktString !== "string") return []; const clean = wktString.trim(); // MULTIPOLYGON if (clean.startsWith("MULTIPOLYGON")) { const matched = clean.match(/MULTIPOLYGON\s*\(\(\((.*)\)\)\)/); if (!matched) return []; const polygons = matched[1].split(")),((").map((polygonStr) => polygonStr .trim() .split(",") .map((coordStr) => { const [lng, lat] = coordStr.trim().split(/\s+/).map(Number); return [lat, lng]; // Đảo ngược: [latitude, longitude] }) ); return polygons; // Mỗi phần tử là 1 polygon (mảng các [lat, lng]) } // POLYGON if (clean.startsWith("POLYGON")) { const matched = clean.match(/POLYGON\s*\(\((.*)\)\)/); if (!matched) return []; const polygon = matched[1].split(",").map((coordStr) => { const [lng, lat] = coordStr.trim().split(/\s+/).map(Number); return [lat, lng]; }); return [polygon]; } return []; }; export const getBanzoneNameByType = (type: number) => { switch (type) { case 1: return "Cấm đánh bắt"; case 2: return "Cấm di chuyển"; case 3: return "Vùng an toàn"; default: return "Chưa có"; } }; export const convertToDMS = (value: number, isLat: boolean): string => { const deg = Math.floor(Math.abs(value)); const minFloat = (Math.abs(value) - deg) * 60; const min = Math.floor(minFloat); const sec = (minFloat - min) * 60; const direction = value >= 0 ? (isLat ? "N" : "E") : isLat ? "S" : "W"; return `${deg}°${min}'${sec.toFixed(2)}"${direction}`; }; /** * Chuyển đổi tốc độ từ km/h sang knot (hải lý/giờ) * @param kmh - tốc độ tính bằng km/h * @returns tốc độ tính bằng knot */ export function kmhToKnot(kmh: number): number { const KNOT_PER_KMH = 1 / 1.852; // 1 knot = 1.852 km/h return parseFloat((kmh * KNOT_PER_KMH).toFixed(2)); // làm tròn 2 chữ số thập phân }