@canterbury-air-patrol/marine-search-area-coverage
Version:
Marine Search Area Coverage Calculator
1 lines • 28.4 kB
Source Map (JSON)
{"version":3,"sources":["../marine-search-area-coverage.tsx"],"sourcesContent":["import { marine_sweep_widths as marineSweepWidths, marine_sweep_width_weather_corrections as weatherCorrections } from '@canterbury-air-patrol/marine-sweep-width-data'\n\nimport React from 'react'\n\nimport Table from 'react-bootstrap/Table'\nimport 'bootstrap/dist/css/bootstrap.min.css'\n\nclass MarineSAC {\n column: string\n asset_type: string\n asset_speed: number\n wu: number\n speed_correction: number\n fw: number\n sweep_width: number\n fatigue: boolean\n corrected_sweep_width: number\n practical_track_spacing: number\n search_area: number\n search_hours: number\n available_search_hours: number\n modified_area: number\n whole_area_practical_track_spacing: number\n\n constructor(column: string, assetType: string) {\n this.column = column\n this.asset_type = assetType\n this.asset_speed = 0\n this.wu = 0\n this.speed_correction = 1\n this.fw = 0\n this.sweep_width = 0\n this.fatigue = false\n this.corrected_sweep_width = 0\n this.practical_track_spacing = 0\n this.search_area = 144\n this.search_hours = 0\n this.available_search_hours = 0\n this.modified_area = 0\n this.whole_area_practical_track_spacing = 0\n }\n\n recaclculate() {\n this.sweep_width = this.wu * this.speed_correction * this.fw\n if (this.fatigue) {\n this.corrected_sweep_width = this.sweep_width * 0.9\n } else {\n this.corrected_sweep_width = this.sweep_width\n }\n this.search_hours = this.search_area / (this.asset_speed * this.practical_track_spacing)\n this.modified_area = this.practical_track_spacing * this.asset_speed * this.available_search_hours\n this.whole_area_practical_track_spacing = this.search_area / (this.available_search_hours * this.asset_speed)\n }\n}\n\ninterface TableRowsInterface {\n display_name: string\n column_name: string\n input?: boolean\n input_type?: string\n}\n\nconst tableRows: TableRowsInterface[] = [\n {\n display_name: 'Uncorrected Sweep Width (Wu) `NM`',\n column_name: 'wu'\n },\n {\n display_name: 'Speed Correction Factor (Sc)',\n column_name: 'speed_correction'\n },\n {\n display_name: 'Weather Corrected Factor (Fw)',\n column_name: 'fw'\n },\n {\n display_name: 'Sweep Width (W) (Wu x Sc x Fw)',\n column_name: 'sweep_width'\n },\n {\n display_name: 'Fatigue Factor (Ff)',\n column_name: 'fatigue'\n },\n {\n display_name: 'Corrected Sweep Width (W X Ff)',\n column_name: 'corrected_sweep_width'\n },\n {\n display_name: 'Practical Track Spacing `NM`',\n column_name: 'practicalTrackSpacing',\n input: true,\n input_type: 'number'\n },\n {\n display_name: 'Search Area',\n column_name: 'search_area',\n input: true,\n input_type: 'number'\n },\n {\n display_name: 'Search Hours (T) Total',\n column_name: 'search_hours'\n },\n {\n display_name: 'Available Search Hours',\n column_name: 'availableSearchHours',\n input: true,\n input_type: 'number'\n },\n {\n display_name: 'Modified Area at Practical Spacing in Available Hours',\n column_name: 'modified_area'\n },\n {\n display_name: 'Track Spacing for Whole Area in Available Time',\n column_name: 'whole_area_practical_track_spacing'\n }\n]\n\ninterface WeatherDataTableProps {\n weatherImpactChange: (impact: string) => void\n weatherVisibilityChange: (vis: number) => void\n metVisibility: number\n}\n\nclass WeatherDataTable extends React.Component<WeatherDataTableProps, never> {\n windSpeed: number\n seaHeight: number\n\n constructor(props: WeatherDataTableProps) {\n super(props)\n this.windSpeed = 0\n this.seaHeight = 0\n\n this.updateWeatherImpact()\n this.handleChange = this.handleChange.bind(this)\n }\n\n updateWeatherImpact() {\n // Update the sea/wind impact category\n let weatherImpact = 'low'\n if (this.windSpeed >= 25 || this.seaHeight >= 1.5) {\n weatherImpact = 'high'\n } else if (this.windSpeed >= 15 || this.seaHeight >= 1.0) {\n weatherImpact = 'medium'\n }\n this.props.weatherImpactChange(weatherImpact)\n }\n\n handleChange(event: React.ChangeEvent<HTMLInputElement>) {\n const target = event.target\n const value = target.value\n const name = target.name\n if (name === 'met_visibility') {\n this.props.weatherVisibilityChange(parseFloat(value))\n } else {\n if (name === 'wind_speed') {\n this.windSpeed = parseFloat(value)\n } else if (name === 'sea_height') {\n this.seaHeight = parseFloat(value)\n }\n this.updateWeatherImpact()\n }\n }\n\n render() {\n return (\n <tbody>\n <tr>\n <td>\n <label htmlFor=\"met_visibility\">Meteorological Visibility (NM)</label>\n </td>\n <td>\n <input type=\"number\" id=\"met_visibility\" name=\"met_visibility\" onChange={this.handleChange} defaultValue={this.props.metVisibility}></input>\n </td>\n </tr>\n <tr>\n <td>\n <label htmlFor=\"wind_speed\">Wind Speed (knots)</label>\n </td>\n <td>\n <input type=\"number\" id=\"wind_speed\" name=\"wind_speed\" onChange={this.handleChange} defaultValue={this.windSpeed}></input>\n </td>\n </tr>\n <tr>\n <td>\n <label htmlFor=\"sea_height\">Sea Height (meters)</label>\n </td>\n <td>\n <input type=\"number\" id=\"sea_height\" name=\"sea_height\" onChange={this.handleChange} defaultValue={this.seaHeight}></input>\n </td>\n </tr>\n </tbody>\n )\n }\n}\n\ninterface TargetTypeSelectorProps {\n possible_targets: string[]\n targetTypeChange: (type: string) => void\n selected: string\n}\n\nclass TargetTypeSelector extends React.Component<TargetTypeSelectorProps, never> {\n constructor(props: TargetTypeSelectorProps) {\n super(props)\n this.handleChange = this.handleChange.bind(this)\n }\n\n handleChange(event: React.ChangeEvent<HTMLSelectElement>) {\n const target = event.target\n const value = target.value\n\n this.props.targetTypeChange(value)\n }\n\n render() {\n const selectObjects = []\n for (const idx in this.props.possible_targets) {\n const target = this.props.possible_targets[idx]\n selectObjects.push(\n <option key={target} value={target}>\n {target}\n </option>\n )\n }\n return (\n <tbody>\n <tr>\n <td></td>\n <td>\n <select defaultValue={this.props.selected} onChange={this.handleChange}>\n {selectObjects}\n </select>\n </td>\n </tr>\n </tbody>\n )\n }\n}\n\ninterface AssetSpeedProps {\n assetType: string\n assetSpeedChange: (assetType: string, speed: number) => void\n}\n\nclass AssetSpeed extends React.Component<AssetSpeedProps, never> {\n constructor(props: AssetSpeedProps) {\n super(props)\n this.handleChange = this.handleChange.bind(this)\n }\n\n handleChange(event: React.ChangeEvent<HTMLInputElement>) {\n const target = event.target\n const value = target.value\n this.props.assetSpeedChange(this.props.assetType, parseFloat(value))\n }\n\n render() {\n return (\n <tbody>\n <tr>\n <td>\n <label htmlFor={this.props.assetType + '_speed'}>{this.props.assetType} search speed (knots)</label>\n </td>\n <td>\n <input type=\"number\" name=\"asset_speed\" onChange={this.handleChange} />\n </td>\n </tr>\n </tbody>\n )\n }\n}\n\ninterface FatigueProps {\n fatigueChanged: (fatigue: boolean) => void\n fatigue: boolean\n}\n\nclass Fatigue extends React.Component<FatigueProps, never> {\n constructor(props: FatigueProps) {\n super(props)\n this.handleChange = this.handleChange.bind(this)\n }\n\n handleChange(event: React.ChangeEvent<HTMLInputElement>) {\n const target = event.target\n const value = target.checked\n this.props.fatigueChanged(value)\n }\n\n render() {\n return (\n <tbody>\n <tr>\n <td>\n <label htmlFor=\"fatigue\">Fatigue</label>\n </td>\n <td>\n <input type=\"checkbox\" name=\"fatigue\" id=\"fatigue\" defaultChecked={this.props.fatigue} onChange={this.handleChange} />\n </td>\n </tr>\n </tbody>\n )\n }\n}\n\ninterface DataTableProps {\n columns: MarineSAC[]\n updateData: (assetID: string, column: string, value: number) => void\n}\n\nclass DataTable extends React.Component<DataTableProps, never> {\n constructor(props: DataTableProps) {\n super(props)\n\n this.handleChange = this.handleChange.bind(this)\n }\n\n handleChange(event: React.ChangeEvent<HTMLInputElement>) {\n const target = event.target\n const value = target.value\n const name = target.id\n\n const idParts = name.split('_')\n const assetID = idParts.slice(0, 2).join('_')\n const columnName = idParts.slice(2).join('_')\n\n this.props.updateData(assetID, columnName, parseFloat(value))\n }\n\n render() {\n const rows = []\n const assetTypes = [<th key=\"head\">Asset Type:</th>]\n const assetHeights = [<th key=\"head\">Height of Eye:</th>]\n\n for (const idx in tableRows) {\n const htmlColumns = []\n htmlColumns.push(<th key=\"head\">{tableRows[idx].display_name}</th>)\n for (const colIdx in this.props.columns) {\n const column = this.props.columns[colIdx]\n if (tableRows[idx].input) {\n htmlColumns.push(\n <td key={idx + '_' + colIdx}>\n <input\n type={tableRows[idx].input_type}\n id={column.asset_type + '_' + column.column + '_' + tableRows[idx].column_name}\n // @ts-expect-error need to accept the column name from tableRows\n defaultValue={column[tableRows[idx].column_name]}\n onChange={this.handleChange}\n />\n </td>\n )\n } else if (tableRows[idx].column_name === 'fatigue') {\n htmlColumns.push(<td key={idx + '_' + colIdx}>{column[tableRows[idx].column_name] ? 0.9 : 1.0}</td>)\n } else {\n // @ts-expect-error need to accept the column name from tableRows\n htmlColumns.push(<td key={idx + '_' + colIdx}>{column[tableRows[idx].column_name]}</td>)\n }\n }\n\n rows.push(<tr key={idx}>{htmlColumns}</tr>)\n }\n\n for (const colIdx in this.props.columns) {\n const column = this.props.columns[colIdx]\n assetTypes.push(<th key={colIdx}>{column.asset_type}</th>)\n assetHeights.push(<th key={colIdx}>{column.column}</th>)\n }\n\n return (\n <form>\n <Table>\n <thead>\n <tr>{assetTypes}</tr>\n <tr>{assetHeights}</tr>\n </thead>\n <tbody>{rows}</tbody>\n </Table>\n </form>\n )\n }\n}\n\ninterface MarineSACTableState {\n columns: MarineSAC[]\n targetType: string\n fatigue: boolean\n weatherImpact: string\n assetSpeeds: {\n [assetType: string]: number\n }\n metVisibility: number\n practicalTrackSpacing: Map<string, number>\n availableSearchHours: Map<string, number>\n}\n\nexport class MarineSACTable extends React.Component<never, MarineSACTableState> {\n possibleTargetsList: string[]\n\n constructor(props: never) {\n super(props)\n\n this.possibleTargetsList = Object.keys(marineSweepWidths)\n\n this.state = {\n columns: [],\n targetType: this.possibleTargetsList[0],\n fatigue: false,\n weatherImpact: 'low',\n assetSpeeds: {\n Boat: 0,\n Aircraft: 0\n },\n metVisibility: 10,\n practicalTrackSpacing: new Map<string, number>(),\n availableSearchHours: new Map<string, number>()\n }\n\n this.weatherImpactChange = this.weatherImpactChange.bind(this)\n this.weatherVisibilityChange = this.weatherVisibilityChange.bind(this)\n this.targetTypeChange = this.targetTypeChange.bind(this)\n this.assetSpeedChange = this.assetSpeedChange.bind(this)\n this.fatigueChange = this.fatigueChange.bind(this)\n this.updateData = this.updateData.bind(this)\n\n const defaultAssets = [\n { asset_type: 'Boat', search_height: '8ft' },\n { asset_type: 'Boat', search_height: '14ft' },\n { asset_type: 'Aircraft', search_height: '500ft' },\n { asset_type: 'Aircraft', search_height: '1000ft' }\n ]\n for (const assetIdx in defaultAssets) {\n const asset = defaultAssets[assetIdx]\n this.state.columns.push(new MarineSAC(asset.search_height, asset.asset_type))\n this.state.practicalTrackSpacing.set(`${asset.asset_type}_${asset.search_height}`, 0)\n this.state.availableSearchHours.set(`${asset.asset_type}_${asset.search_height}`, 0)\n }\n }\n\n weatherImpactChange(newWeatherImpact: string) {\n this.setState({ weatherImpact: newWeatherImpact })\n }\n\n weatherVisibilityChange(metVisibility: number) {\n this.setState({ metVisibility: metVisibility })\n }\n\n targetTypeChange(newTargetType: string) {\n this.setState({ targetType: newTargetType })\n }\n\n assetSpeedChange(assetType: string, speed: number) {\n this.setState(function (oldState) {\n const currentAssetSpeeds = oldState.assetSpeeds\n currentAssetSpeeds[assetType] = speed\n return { assetSpeeds: currentAssetSpeeds }\n })\n }\n\n fatigueChange(value: boolean) {\n this.setState({ fatigue: value })\n }\n\n updateData(assetID: string, fieldName: string, value: number) {\n if (fieldName === 'practicalTrackSpacing') {\n this.setState(function (oldState) {\n const currentData = oldState.practicalTrackSpacing\n currentData.set(assetID, value)\n return { practicalTrackSpacing: currentData }\n })\n }\n if (fieldName === 'availableSearchHours') {\n this.setState(function (oldState) {\n const currentData = oldState.availableSearchHours\n currentData.set(assetID, value)\n return { availableSearchHours: currentData }\n })\n }\n }\n\n recalculate() {\n // Update the uncorrected sweep width and weather correct factors\n const targetData = marineSweepWidths[this.state.targetType]\n\n for (const colIdx in this.state.columns) {\n const column = this.state.columns[colIdx]\n const searchHeight = column.column\n const assetType = column.asset_type\n const columnName = `${assetType}_${searchHeight}`\n const visibleDistanceData =\n assetType == 'Boat'\n ? targetData.Boat[searchHeight]\n : assetType === 'Heliocopter'\n ? targetData.Helicopter[searchHeight]\n : assetType === 'Aircraft'\n ? targetData.Aircraft[searchHeight]\n : null\n const speedCorrections = assetType === 'Aircraft' ? targetData.speed_corrections.Aircraft : assetType === 'Helicopter' ? targetData.speed_corrections.Helicopter : null\n\n column.asset_speed = Number(this.state.assetSpeeds[column.asset_type])\n\n let lowerSpeedSeen = null\n let higherSpeedSeen = null\n if (speedCorrections === null) {\n column.speed_correction = 1.0\n } else {\n for (const idx in speedCorrections) {\n const data = speedCorrections[idx]\n if ((lowerSpeedSeen === null || data.speed > lowerSpeedSeen.speed) && data.speed <= column.asset_speed) {\n lowerSpeedSeen = data\n }\n if ((higherSpeedSeen === null || data.speed < higherSpeedSeen.speed) && data.speed >= column.asset_speed) {\n higherSpeedSeen = data\n }\n }\n if (lowerSpeedSeen === null && higherSpeedSeen !== null) {\n column.speed_correction = higherSpeedSeen.correction\n } else if (lowerSpeedSeen !== null && higherSpeedSeen === null) {\n column.speed_correction = lowerSpeedSeen.correction\n } else if (lowerSpeedSeen !== null && higherSpeedSeen !== null) {\n if (lowerSpeedSeen.correction === higherSpeedSeen.correction) {\n column.speed_correction = lowerSpeedSeen.correction\n } else {\n const speedRange = higherSpeedSeen.speed - lowerSpeedSeen.speed\n const correctionRange = higherSpeedSeen.correction - lowerSpeedSeen.correction\n const assetSpeedOffset = column.asset_speed - lowerSpeedSeen.speed\n const ratio = assetSpeedOffset / speedRange\n column.speed_correction = lowerSpeedSeen.correction + ratio * correctionRange\n }\n } else {\n column.speed_correction = 1.0\n }\n }\n\n let highestSeenSweepWidth = 0\n let highestSeenVis = 0\n if (visibleDistanceData) {\n for (const idx in visibleDistanceData) {\n const data = visibleDistanceData[idx]\n if (data.vis <= this.state.metVisibility && data.vis > highestSeenVis) {\n highestSeenSweepWidth = data.sw\n highestSeenVis = data.vis\n }\n }\n }\n column.wu = highestSeenSweepWidth\n const weatherCorrectionsTable = targetData.weather_corrections === 'large' ? weatherCorrections.large : weatherCorrections.small\n if (this.state.weatherImpact === 'low' || this.state.weatherImpact === 'medium' || this.state.weatherImpact === 'high') {\n column.fw = weatherCorrectionsTable.IAMSAR[this.state.weatherImpact]\n }\n column.fatigue = this.state.fatigue\n\n column.practical_track_spacing = this.state.practicalTrackSpacing.get(columnName)!\n column.available_search_hours = this.state.availableSearchHours.get(columnName)!\n column.recaclculate()\n }\n }\n\n render() {\n this.recalculate()\n return (\n <div>\n <Table>\n <WeatherDataTable weatherImpactChange={this.weatherImpactChange} weatherVisibilityChange={this.weatherVisibilityChange} metVisibility={this.state.metVisibility} />\n <AssetSpeed assetType=\"Boat\" assetSpeedChange={this.assetSpeedChange} />\n <AssetSpeed assetType=\"Aircraft\" assetSpeedChange={this.assetSpeedChange} />\n <TargetTypeSelector possible_targets={this.possibleTargetsList} targetTypeChange={this.targetTypeChange} selected={this.state.targetType} />\n <Fatigue fatigueChanged={this.fatigueChange} fatigue={this.state.fatigue} />\n </Table>\n <DataTable columns={this.state.columns} updateData={this.updateData} />\n </div>\n )\n }\n}\n"],"mappings":"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","names":[]}