@mytec: iter1.6 ready for testing

This commit is contained in:
2026-01-31 12:10:55 +02:00
parent 5821de9a8f
commit 7a5b27bd87
13 changed files with 773 additions and 101 deletions

View File

@@ -707,6 +707,8 @@ export default function App() {
use_dominant_path: preset.use_dominant_path,
use_street_canyon: preset.use_street_canyon,
use_reflections: preset.use_reflections,
use_water_reflection: preset.use_water_reflection,
use_vegetation: preset.use_vegetation,
});
}
}}
@@ -754,6 +756,8 @@ export default function App() {
{ key: 'use_dominant_path' as const, label: 'Dominant Path', disabled: false },
{ key: 'use_street_canyon' as const, label: 'Street Canyon', disabled: false },
{ key: 'use_reflections' as const, label: 'Reflections', disabled: false },
{ key: 'use_water_reflection' as const, label: 'Water Reflection', disabled: false },
{ key: 'use_vegetation' as const, label: 'Vegetation Loss', disabled: false },
].map(({ key, label, disabled }) => (
<label
key={key}
@@ -778,6 +782,27 @@ export default function App() {
{label}
</label>
))}
{/* Season selector (only relevant when vegetation is enabled) */}
{settings.use_vegetation && (
<div className="mt-1.5 pl-5">
<label className="text-xs text-gray-500 dark:text-dark-muted">Season</label>
<select
value={settings.season || 'summer'}
onChange={(e) =>
useCoverageStore.getState().updateSettings({
season: e.target.value as 'summer' | 'winter' | 'spring' | 'autumn',
})
}
disabled={isCalculating}
className="w-full mt-0.5 px-2 py-1 text-xs bg-white dark:bg-dark-border border border-gray-300 dark:border-dark-border rounded text-gray-700 dark:text-dark-text disabled:opacity-50"
>
<option value="summer">Summer (full foliage)</option>
<option value="autumn">Autumn (70%)</option>
<option value="spring">Spring (60%)</option>
<option value="winter">Winter (30%)</option>
</select>
</div>
)}
</div>
)}
</div>

View File

@@ -171,6 +171,14 @@ export default memo(function CoverageStats({ points, resolution, stats, calculat
</span>
</div>
)}
{stats.points_with_vegetation_loss > 0 && (
<div className="flex justify-between">
<span className="text-gray-500 dark:text-dark-muted">Vegetation</span>
<span className="font-medium text-gray-700 dark:text-dark-text">
{stats.points_with_vegetation_loss}
</span>
</div>
)}
</div>
</div>
)}

View File

@@ -28,6 +28,9 @@ export interface ApiCoverageSettings {
use_dominant_path?: boolean;
use_street_canyon?: boolean;
use_reflections?: boolean;
use_water_reflection?: boolean;
use_vegetation?: boolean;
season?: 'summer' | 'winter' | 'spring' | 'autumn';
}
export interface CoverageRequest {
@@ -46,6 +49,7 @@ export interface ApiCoveragePoint {
terrain_loss: number;
building_loss: number;
reflection_gain: number;
vegetation_loss: number;
}
export interface ApiCoverageStats {
@@ -56,6 +60,7 @@ export interface ApiCoverageStats {
points_with_buildings: number;
points_with_terrain_loss: number;
points_with_reflection_gain: number;
points_with_vegetation_loss: number;
}
export interface CoverageResponse {
@@ -75,6 +80,8 @@ export interface Preset {
use_dominant_path: boolean;
use_street_canyon: boolean;
use_reflections: boolean;
use_water_reflection: boolean;
use_vegetation: boolean;
estimated_speed: string;
}

View File

@@ -41,6 +41,9 @@ export const useCoverageStore = create<CoverageState>((set, get) => ({
use_dominant_path: false,
use_street_canyon: false,
use_reflections: false,
use_water_reflection: false,
use_vegetation: false,
season: 'summer',
},
heatmapVisible: true,
error: null,
@@ -101,6 +104,9 @@ export const useCoverageStore = create<CoverageState>((set, get) => ({
use_dominant_path: settings.use_dominant_path,
use_street_canyon: settings.use_street_canyon,
use_reflections: settings.use_reflections,
use_water_reflection: settings.use_water_reflection,
use_vegetation: settings.use_vegetation,
season: settings.season,
},
});
@@ -115,6 +121,7 @@ export const useCoverageStore = create<CoverageState>((set, get) => ({
terrain_loss: p.terrain_loss,
building_loss: p.building_loss,
reflection_gain: p.reflection_gain,
vegetation_loss: p.vegetation_loss,
})),
calculationTime: response.computation_time,
totalPoints: response.count,

View File

@@ -9,6 +9,7 @@ export interface CoveragePoint {
terrain_loss?: number; // dB terrain obstruction loss
building_loss?: number; // dB building penetration loss
reflection_gain?: number; // dB reflection signal gain
vegetation_loss?: number; // dB vegetation attenuation
}
export interface CoverageResult {
@@ -29,6 +30,7 @@ export interface CoverageApiStats {
points_with_buildings: number;
points_with_terrain_loss: number;
points_with_reflection_gain: number;
points_with_vegetation_loss: number;
}
export interface CoverageSettings {
@@ -45,6 +47,9 @@ export interface CoverageSettings {
use_dominant_path?: boolean;
use_street_canyon?: boolean;
use_reflections?: boolean;
use_water_reflection?: boolean;
use_vegetation?: boolean;
season?: 'summer' | 'winter' | 'spring' | 'autumn';
}
export interface GridPoint {