thêm zustand để cấu hình global state, hook để lấy platform, thêm polyline và polygon b vào map
This commit is contained in:
88
utils/geom.ts
Normal file
88
utils/geom.ts
Normal file
@@ -0,0 +1,88 @@
|
||||
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ó";
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user