diff --git a/web/src/assets/map_night_3840x1440_wind.webp b/web/src/assets/map_night_3840x1440_wind.webp new file mode 100644 index 0000000..c04d353 Binary files /dev/null and b/web/src/assets/map_night_3840x1440_wind.webp differ diff --git a/web/src/lvgmc-forecast/CsvMapData.tsx b/web/src/lvgmc-forecast/CsvMapData.tsx new file mode 100644 index 0000000..55595be --- /dev/null +++ b/web/src/lvgmc-forecast/CsvMapData.tsx @@ -0,0 +1,83 @@ +import { Component, createSignal, onMount } from 'solid-js' +import { apiHost } from '../consts' +import { fetchText } from '../helpers/fetch' +import { codeToIcon } from '../components/weatherIcons/iconConsts' +import { cityCoords } from '../components/cityCoords' +import { CityData, drawOnMap } from '../cities/map/canvasDraw' +import { citiesToShow, csvCityListInOrder } from './consts' + +import arrowUrl from '../assets/arrow.webp' +import { resolutionProps, windProps, WindProps } from '../cities/map/mapConsts' + +export const CsvMapData: Component<{ + csvUrl: string, + bgImgUrl: string, +}> = ({ + csvUrl, + bgImgUrl, +}) => { + const [getCityData, setCityData] = createSignal([]) + const [getWindData, setWindData] = createSignal<[string, string, string]>(['', '', '']) + + fetchText(`${apiHost}/api/show/lvgmc-forecast/${csvUrl}`) + .then(csv => { + const csvLines = csv.split('\n') + const dayOrNight = csvLines[2].split(';')[1] + console.log(csvLines) + const citiesOffset = 4 + const cityData: CityData[] = csvCityListInOrder + .map((city, i): CityData => { + const parts = csvLines[i + citiesOffset].split(';') + const temperature = Number(parts[1]) + const iconCode = Number(parts[2]) + const icon = codeToIcon(iconCode) + const coord = cityCoords[city] + if (!coord) throw new Error(`No coord found for city: ${city}`) + return [city, coord, temperature, icon] + }) + .filter(([city]) => citiesToShow.includes(city)) + + const windOffset = dayOrNight === 'DIENA' ? 30 : 26 + const windParts = csvLines[windOffset].split(';') + const windSpped = windParts[1] + const windGusts = windParts[3] + const windDirection = windParts[5] + setWindData([windDirection, windSpped, windGusts]) + + setCityData(cityData) + draw() + }) + + const arrowImg = new Image() + arrowImg.src = arrowUrl + + let canvas: HTMLCanvasElement + let ctx: CanvasRenderingContext2D + onMount(() => { + ctx = canvas!.getContext('2d')! + }) + + function draw(){ + const img = new Image() + const tmpWindData: [string, string, string, boolean, WindProps] = [...getWindData(), true, windProps.map_3840x1440_wind] + img.onload = () => { + drawOnMap( + ctx, + [img, arrowImg], + getCityData(), + tmpWindData, + resolutionProps.map_3840x1440_wind, + ) + } + img.src = bgImgUrl + } + + return <> + canvas=c} + width={'3840px'} + height={'1440px'} + style={{ 'width': '1000px', 'height': '374px' }} + /> + +} \ No newline at end of file diff --git a/web/src/lvgmc-forecast/LvgmcForecast.tsx b/web/src/lvgmc-forecast/LvgmcForecast.tsx index 0d96156..246cc35 100644 --- a/web/src/lvgmc-forecast/LvgmcForecast.tsx +++ b/web/src/lvgmc-forecast/LvgmcForecast.tsx @@ -1,13 +1,8 @@ -import { Component, createEffect, createSignal, onMount } from 'solid-js' -import { apiHost } from '../consts' -import { fetchText } from '../helpers/fetch' -import { codeToIcon } from '../components/weatherIcons/iconConsts' -import { cityCoords } from '../components/cityCoords' -import { CityData, drawOnMap } from '../cities/map/canvasDraw' +import { Component } from 'solid-js' -import arrowUrl from '../assets/arrow.webp' -import bgMap from '../assets/map_3840x1440_wind.webp' -import { resolutionProps, WindProps, windProps } from '../cities/map/mapConsts' +import dayBgMap from '../assets/map_3840x1440_wind.webp' +import nightBgMap from '../assets/map_night_3840x1440_wind.webp' +import { CsvMapData } from './CsvMapData' // Eiropa_LTV_pilsetas_nakama_dn.csv // Eiropa_LTV_pilsetas_tekosa_dn.csv @@ -15,74 +10,18 @@ import { resolutionProps, WindProps, windProps } from '../cities/map/mapConsts' // Latvija_LTV_pilsetas_tekosa_dn.csv // Latvija_faktiskais_laiks.csv -export const csvCityListInOrder = ['Alūksne', 'Bauska', 'Cēsis', 'Daugavpils', 'Jelgava', 'Rīga', 'Liepāja', 'Madona', 'Rēzekne', 'Saldus', 'Valmiera', 'Ventspils', 'Ainaži', 'Dobele', 'Gulbene', 'Sigulda', 'Talsi', 'Jēkabpils'] -export const citiesToShow = ['Liepāja', 'Ventspils', 'Saldus', 'Talsi', 'Bauska', 'Rīga', 'Ainaži', 'Valmiera', 'Alūksne', 'Madona', 'Jēkabpils', 'Daugavpils'] - - export const LvgmcForecast: Component<{}> = () => { - const [getCityData, setCityData] = createSignal([]) - const [getWindData, setWindData] = createSignal<[string, string, string]>(['', '', '']) - - fetchText(`${apiHost}/api/show/lvgmc-forecast/Latvija_LTV_pilsetas_tekosa_dn.csv`) - .then(csv => { - const csvLines = csv.split('\n') - console.log(csvLines) - const citiesOffset = 4 - const cityData: CityData[] = csvCityListInOrder - .map((city, i): CityData => { - const parts = csvLines[i + citiesOffset].split(';') - const temperature = Number(parts[1]) - const iconCode = Number(parts[2]) - const icon = codeToIcon(iconCode) - const coord = cityCoords[city] - if (!coord) throw new Error(`No coord found for city: ${city}`) - return [city, coord, temperature, icon] - }) - .filter(([city]) => citiesToShow.includes(city)) - - const windOffset = 30 - const windParts = csvLines[windOffset].split(';') - const windSpped = windParts[1] - const windGusts = windParts[3] - const windDirection = windParts[5] - setWindData([windDirection, windSpped, windGusts]) - - setCityData(cityData) - draw() - }) - - const arrowImg = new Image() - arrowImg.src = arrowUrl - - let canvas: HTMLCanvasElement - let ctx: CanvasRenderingContext2D - onMount(() => { - ctx = canvas!.getContext('2d')! - }) - - function draw(){ - const img = new Image() - const tmpWindData: [string, string, string, boolean, WindProps] = [...getWindData(), true, windProps.map_3840x1440_wind] - img.onload = () => { - drawOnMap( - ctx, - [img, arrowImg], - getCityData(), - tmpWindData, - resolutionProps.map_3840x1440_wind, - ) - } - img.src = bgMap - } - return <> - LvgmcForecast -
- canvas=c} - width={'3840px'} - height={'1440px'} - style={{ 'width': '1000px', 'height': '374px' }} +

Night

+ + +

Day

+ } diff --git a/web/src/lvgmc-forecast/consts.ts b/web/src/lvgmc-forecast/consts.ts new file mode 100644 index 0000000..4f1f6b1 --- /dev/null +++ b/web/src/lvgmc-forecast/consts.ts @@ -0,0 +1,2 @@ +export const csvCityListInOrder = ['Alūksne', 'Bauska', 'Cēsis', 'Daugavpils', 'Jelgava', 'Rīga', 'Liepāja', 'Madona', 'Rēzekne', 'Saldus', 'Valmiera', 'Ventspils', 'Ainaži', 'Dobele', 'Gulbene', 'Sigulda', 'Talsi', 'Jēkabpils'] +export const citiesToShow = ['Liepāja', 'Ventspils', 'Saldus', 'Talsi', 'Bauska', 'Rīga', 'Ainaži', 'Valmiera', 'Alūksne', 'Madona', 'Rēzekne', 'Jēkabpils', 'Daugavpils']