refactor(tactical): remove ridge lines to keep map uncluttered and focused strictly on wadi flows
This commit is contained in:
@@ -1131,87 +1131,7 @@ export async function calculateTerrainStudy(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 7. Trace Natural Ridge Watershed Divides (Dominant High Crests)
|
|
||||||
// Crest cells: high elevation, local peak curvature, divergent flow (low flow accumulation)
|
|
||||||
const ridgeCandidates: Array<{ r: number; c: number; elev: number; tpi: number }> = [];
|
|
||||||
for (let r = 1; r < gridSize - 1; r++) {
|
|
||||||
for (let c = 1; c < gridSize - 1; c++) {
|
|
||||||
const el = elevationGrid[r][c];
|
|
||||||
if (el >= minElev + relief * 0.45 && flowAcc[r][c] <= 2) {
|
|
||||||
// Compute 3x3 local mean
|
|
||||||
let sum = 0;
|
|
||||||
let count = 0;
|
|
||||||
for (let dr = -1; dr <= 1; dr++) {
|
|
||||||
for (let dc = -1; dc <= 1; dc++) {
|
|
||||||
sum += elevationGrid[r + dr][c + dc];
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const localMean = sum / count;
|
|
||||||
const tpi = el - localMean;
|
|
||||||
if (tpi >= 1.5) {
|
|
||||||
ridgeCandidates.push({ r, c, elev: el, tpi });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Group connected ridge candidates into crest lines
|
|
||||||
const visitedRidge = Array(gridSize).fill(false).map(() => Array(gridSize).fill(false));
|
|
||||||
for (const rc of ridgeCandidates) {
|
|
||||||
if (visitedRidge[rc.r][rc.c]) continue;
|
|
||||||
const ridgeLine: [number, number][] = [];
|
|
||||||
let currR = rc.r;
|
|
||||||
let currC = rc.c;
|
|
||||||
|
|
||||||
while (currR >= 0 && currR < gridSize && currC >= 0 && currC < gridSize) {
|
|
||||||
visitedRidge[currR][currC] = true;
|
|
||||||
const pt = gridCoords[currR * gridSize + currC];
|
|
||||||
const distFromCenter = calculateDistance(centerLat, centerLng, pt.lat, pt.lng);
|
|
||||||
if (distFromCenter <= radiusMeters * 1.05) {
|
|
||||||
ridgeLine.push([pt.lng, pt.lat]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find best unvisited ridge neighbor
|
|
||||||
let bestNext: { r: number; c: number } | null = null;
|
|
||||||
let highestNeighborElev = -9999;
|
|
||||||
for (let dr = -1; dr <= 1; dr++) {
|
|
||||||
for (let dc = -1; dc <= 1; dc++) {
|
|
||||||
if (dr === 0 && dc === 0) continue;
|
|
||||||
const nr = currR + dr;
|
|
||||||
const nc = currC + dc;
|
|
||||||
if (nr >= 0 && nr < gridSize && nc >= 0 && nc < gridSize && !visitedRidge[nr][nc]) {
|
|
||||||
const isCand = ridgeCandidates.some(c => c.r === nr && c.c === nc);
|
|
||||||
if (isCand && elevationGrid[nr][nc] > highestNeighborElev) {
|
|
||||||
highestNeighborElev = elevationGrid[nr][nc];
|
|
||||||
bestNext = { r: nr, c: nc };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!bestNext) break;
|
|
||||||
currR = bestNext.r;
|
|
||||||
currC = bestNext.c;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ridgeLine.length >= 3) {
|
|
||||||
spatialFeatures.push({
|
|
||||||
type: 'Feature',
|
|
||||||
properties: {
|
|
||||||
layerType: 'ridge',
|
|
||||||
category: 'key-terrain',
|
|
||||||
title: `⛰️ سلسلة تلال وقمم حاكمة (خط تقسيم مياه)`,
|
|
||||||
color: '#d97706',
|
|
||||||
width: 2.5
|
|
||||||
},
|
|
||||||
geometry: {
|
|
||||||
type: 'LineString',
|
|
||||||
coordinates: ridgeLine
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 8. Regional Sector Intelligence Context
|
// 8. Regional Sector Intelligence Context
|
||||||
let sectorName = 'قطاع عمليات ميداني';
|
let sectorName = 'قطاع عمليات ميداني';
|
||||||
|
|||||||
Reference in New Issue
Block a user