User Tools

Site Tools


project:brmmeteo:start

BrmMeteo

brmmeteo.sh
#!/bin/bash
#
# $1 = output synop CSV file
# $2 = output HTML map
# $3 = output JSON file
#
 
# https://www.ogimet.com/ultimos_synops2.php?lang=en&estado=Czec&fmt=html&Send=Send
# https://www.ogimet.com/getsynop_help.phtml.en
 
# https://www.ogimet.com/cgi-bin/getsynop?begin=201901281900&state=Cze&header=yes
# http://www.weather.org.uk/resource/syn_code.htm
 
 
# How far station is
function dalka()
{
	local x=$(echo "$3-$1" | bc)
	local y=$(echo "$4-$2" | bc)
	echo "sqrt((($3-$1)^2)+(($4-$2)^2))" | bc -l| sed -e 's/^\./0./g' -e 's/^-\./-0./g'
}
 
# Angle to another station
function uhel ()
{
	local x=$(echo "$3-$1" | bc)
	local y=$(echo "$4-$2" | bc)
	echo "$y/sqrt(($x*$x)+($y*$y))" | bc -l| sed -e 's/^\./0./g' -e 's/^-\./-0./g'
}
 
# Return close points $1=stanice $2=CSV
function blizke()
{
	local id=$(echo "$1" |  awk -F', ' '{print $4}' | grep -o -e'[0-9]*')
	local x=$(echo "$1" | awk -F', ' '{print $2}' | sed -e 's/.$//g')
	local y=$(echo "$1" | awk -F', ' '{print $3}' | sed -e 's/.$//g')
	local m=$(echo "$1" | awk -F', ' '{print $1}')
 
	local tab=""
 
	while IFS='' read -r br || [[ -n "$br" ]]; do
		local rid=$(echo "$br" |  awk -F', ' '{print $4}' | grep -o -e'[0-9]*')
		if [[ "$id" == "$rid" ]]; then
			continue;
		fi
 
		local rx=$(echo "$br" | awk -F', ' '{print $2}' | sed -e 's/.$//g')
		local ry=$(echo "$br" | awk -F', ' '{print $3}' | sed -e 's/.$//g')
		local rmm=$(echo "$br" | awk -F', ' '{print $1}')
 
		local rd=$(dalka "$x" "$y" "$rx" "$ry")
 
		tab+="$rd $rid $m -> $rmm\n"
	done <<< $(echo "$2")
 
	tab=$(echo -e "$tab" | sort)
	echo -e "$tab"
}
 
 
json="var data='{\"version\":\"$(date --rfc-3339=seconds)\",\"stanice\":["
 
#syno=$(wget "https://www.ogimet.com/cgi-bin/getsynop?begin=201901291800&state=Cze" -O - > /dev/null 2>&1 
 
syno=$(cat /s/syno | cut -b 35- | sed -e 's/ /, /g' | sed -e 's/^11406/Cheb, 50.0683N, 12.3913E, 11406/g' -e 's/^11414/Karlovy Vary, 50.2016N, 12.9139E, 11414/g' -e 's/^11423/Primda, 49.6694N, 12.6779E, 11423/g' -e 's/^11438/Tusimice, 50.3765N, 13.3279E, 11438/g' -e 's/^11450/Plzen-Mikulka, 49.7645N, 13.3787E, 11450/g' -e 's/^11457/Churanov, 49.0683N, 13.615E, 11457/g' -e 's/^11464/Milesovka, 50.5549N, 13.9306E, 11464/g' -e 's/^11487/Kocelovice, 49.4672N, 13.8385E, 11487/g' -e 's/^11502/Usti n. Labem, 50.6833N, 14.0410E, 11502/g' -e 's/^11509/Doksany, 50.4587N, 14.1699E, 11509/g' -e 's/^11518/Praha-Ruzyne, 50.1003N, 14.2555E, 11518/g' -e 's/^11520/Praha-Libus, 50.0077N, 14.4467E, 11520/g' -e 's/^11538/Temelin, 49.1975N, 14.3421E, 11538/g' -e 's/^11546/C. Budejovice, 48.9519N, 14.4697E, 11546/g' -e 's/^11567/Praha-Kbely, 50.1232N, 14.538E, 11567/g' -e 's/^11603/Liberec, 50.7697N, 15.0238E, 11603/g' -e 's/^11624/Caslav, 49.9407N, 15.3863E, 11624/g' -e 's/^11628/Kramolin-Kosetice, 49.5735N, 15.0803E, 11628/g' -e 's/^11636/Kostelni Myslova, 49.159N, 15.4391E, 11636/g' -e 's/^11643/Pec p. Snezkou, 50.6918N, 15.7287E, 11643/g' -e 's/^11652/Pardubice, 50.1580N, 15.7402E, 11652/g' -e 's/^11653/Snezka, 50.68N, 15.44E, 11653/g' -e 's/^11659/Pribyslav, 49.5825N, 15.7623E, 11659/g' -e 's/^11669/Polom, 50.3503N, 16.3221E, 11669/g' -e 's/^11679/Usti n. Orlici, 49.9801N, 16.4221E, 11679/g' -e 's/^11683/Svratouch, 49.735N, 16.0342E, 11683/g' -e 's/^11692/Namest n. Oslavou, 49.1708N, 16.1205E, 11692/g' -e 's/^11693/Dukovany, 49.0954N, 16.1344E, 11693/g' -e 's/^11698/Kucharovice, 48.8809N, 16.0852E, 11698/g' -e 's/^11710/Luka, 49.6522N, 16.9533E, 11710/g' -e 's/^11723/Brno-Turany, 49.1530N, 16.6888E, 11723/g' -e 's/^11730/Serak, 50.1874N, 17.1082E, 11730/g' -e 's/^11747/Prostejov, 49.4525N, 17.1347E, 11747/g' -e 's/^11766/Cervená u Libavé, 49.7770N, 17.5418E, 11766/g' -e 's/^11774/Holesov, 49.3205N, 17.5699E, 11774/g' -e 's/^11782/Ostrava-Mosnov, 49.6918N, 18.1126E, 11782/g' -e 's/^11787/Lysa hora, 49.5459N, 18.4473E, 11787/g' -e 's/^11791/Maruska Hostalkova, 49.3650N, 17.8284E, 11791/g')
 
#echo "$syno" > "$1"
 
while IFS='' read -r radek || [[ -n "$radek" ]]; do
 
	blizke "$radek" "$syno"
	echo "---"
 
	mesto=$(echo "$radek" | grep -o -e '^[^,]*')
	gpsn=$(echo "$radek" | awk -F', ' '{print $2}'| sed -e 's/.$//g')
	gpse=$(echo "$radek" | awk -F', ' '{print $3}'| sed -e 's/.$//g')
	mestoid=$(echo "$radek" | awk -F', ' '{print $4}')
 
	# SECTION 0
	ir=$(echo "$radek" | awk -F', ' '{print $5}' | cut -b 1)
	ix=$(echo "$radek" | awk -F', ' '{print $5}' | cut -b 2)
	# vyska mraku
	h=$(echo "$radek" | awk -F', ' '{print $5}' | cut -b 3)
	# dohlednost
	vv=$(echo "$radek" | awk -F', ' '{print $5}' | cut -b 4-5)
	#echo "$ir $ix $h $vv"
 
	# SECTION 1
	n=$(echo "$radek" | awk -F', ' '{print $6}' | cut -b 1)
	# smer vetru
	dd=$(echo "$radek" | awk -F', ' '{print $6}' | cut -b 2-3)
	# rychlost vetru v knotech
	ff=$(echo "$radek" | awk -F', ' '{print $6}' | cut -b 4-5)
	# rychlost vetru v m/s
	ff=$(echo "0$ff*0.514" | bc | sed -e 's/^\./0\./g')
	#echo "$n $dd $ff"
 
	section1=$(echo "$radek" | grep -o -P -e ' (1[0-9/]{4}, )?(2[0-9/]{4}, )?(3[0-9/]{4}, )?(4[0-9/]{4}, )?(5[0-9/]{4}, )?(6[0-9/]{4}, )?(7[0-9/]{4}, )?(8[0-9/]{4}, )?333,' | cut -c 2- | sed -e 's/, 333,//g')
 
	# znamenko teploty (0=+; 1=-)
	s11sn=$(echo "$section1" | grep -o -P -e '1[0-9/]{4}' | cut -b 2 | tr '1' '-' | tr '0' '+')
	# teplota v desetinach
	s11ttt=$(echo "$section1" | grep -o -P -e '1[0-9/]{4}' | cut -b 3-5)
	# teplota v °C
	s11ttt=$(echo "$s11sn 0 $s11ttt*0.1" | tr -d ' ' | bc)
	# rosny bod znamenko
	s12sn=$(echo "$section1" | grep -o -P -e '2[0-9/]{4}' | cut -b 2)
	# rosny bod teplota °C
	s12ttt=$(echo "$section1" | grep -o -P -e '2[0-9/]{4}' | cut -b 3-5)
	# tlak v mBar (stary ale v CR asi pouzivany)
	s13tttt=$(echo "$section1" | grep -o -P -e '3[0-9/]{4}' | cut -b 2-5)
	s13tttt=$(echo "((0$s13tttt)*100)+101325" | bc)
	# tlak v mBar
	s14pppp=$(echo "$section1" | grep -o -P -e '4[0-9/]{4}' | cut -b 2-5)
	# tlak v Pa
	s14pppp=$(echo "(0$s14pppp*0.1*100)+101325" | bc)
	# zmena tlaku +-
	s15a=$(echo "$section1" | grep -o -P -e '5[0-9/]{4}' | cut -b 2)
	# zmena tlaku v desetinach mBar/3h
	s15ppp=$(echo "$section1" | grep -o -P -e '5[0-9/]{4}' | cut -b 3-5)
	# srazky mm/6h
	s16rrr=$(echo "$section1" | grep -o -P -e '6[0-9/]{4}' | cut -b 2-4)
	s16tr=$(echo "$section1" | grep -o -P -e '6[0-9/]{4}' | cut -b 5)
	# aktualni pocasi
	s17ww=$(echo "$section1" | grep -o -P -e '7[0-9/]{4}' | cut -b 2-3)
	# minule pocasi
	s17w1w2=$(echo "$section1" | grep -o -P -e '7[0-9/]{4}' | cut -b 4-5)
	# oblacnost
	s18nh=$(echo "$section1" | grep -o -P -e '8[0-9/]{4}' | cut -b 2)
	# ...nizka
	s18cl=$(echo "$section1" | grep -o -P -e '8[0-9/]{4}' | cut -b 3)
	# ...stredni
	s18cm=$(echo "$section1" | grep -o -P -e '8[0-9/]{4}' | cut -b 4)
	# ...vysoka
	s18ch=$(echo "$section1" | grep -o -P -e '8[0-9/]{4}' | cut -b 5)
 
	#echo "$section1"
 
	# SECTION 3
	section3=$(echo "$radek" | grep -o -P -e ', 333, (1[0-9/]{4}((, )|(=+)))?(2[0-9/]{4}((, )|(=+)))?(3[0-9/]{4}((, )|(=+)))?(4[0-9/]{4}((, )|(=+)))?(5[0-9/]{4}((, )|(=+)))?(6[0-9/]{4}((, )|(=+)))?(7[0-9/]{4}((, )|(=+)))?(8[0-9/]{4}((, )|(=+)))*(9[0-9/]{4}((, )|(=+)))*((444)|(555))?' | cut -c 8- | sed -e 's/, 555$//g' -e 's/, 444$//g' | tr -d '=')
 
	s31sn=$(echo "$section3" | grep -o -P -e '1[0-9/]{4}' | cut -b 2)
	s31ttt=$(echo "$section3" | grep -o -P -e '1[0-9/]{4}' | cut -b 3-5)
	s32sn=$(echo "$section3" | grep -o -P -e '2[0-9/]{4}' | cut -b 2)
	s32ttt=$(echo "$section3" | grep -o -P -e '2[0-9/]{4}' | cut -b 3-5)
	s33e=$(echo "$section3" | grep -o -P -e '3[0-9/]{4}' | cut -b 2)
	s33sn=$(echo "$section3" | grep -o -P -e '3[0-9/]{4}' | cut -b 3)
	s33sn=$(echo "$section3" | grep -o -P -e '3[0-9/]{4}' | cut -b 4-5)
	s34e=$(echo "$section3" | grep -o -P -e '4[0-9/]{4}' | cut -b 2)
	s34sss=$(echo "$section3" | grep -o -P -e '4[0-9/]{4}' | cut -b 3-5)
	s38ns=$(echo "$section3" | grep -o -P -e '8[0-9/]{4}' | cut -b 2)
	s38c=$(echo "$section3" | grep -o -P -e '8[0-9/]{4}' | cut -b 3)
	s38hh=$(echo "$section3" | grep -o -P -e '8[0-9/]{4}' | cut -b 4-5)
	s39=$(echo "$section3" | grep -o -P -e '9[0-9/]{4}' | cut -b 2-5)
 
	#echo "$section3"
 
	# SECTION 4
	section4=$(echo "$radek" | grep -o -P -e ', 444, (1[0-9/]{4}((, )|(=+)))?(2[0-9/]{4}((, )|(=+)))?(3[0-9/]{4}((, )|(=+)))?(4[0-9/]{4}((, )|(=+)))?(5[0-9/]{4}((, )|(=+)))?(6[0-9/]{4}((, )|(=+)))?(7[0-9/]{4}((, )|(=+)))?(8[0-9/]{4}((, )|(=+)))*(9[0-9/]{4}((, 555,)|(=+)))*?' | cut -c 8- | sed -e 's/, 555,$//g' -e 's/, $//g' | tr -d '=')
 
	#echo "$section4"
 
	#SECTION 5
	section5=$(echo "$radek" | grep -o -P -e ', 555, (1[0-9/]{4}((, )|(=+)))?(2[0-9/]{4}((, )|(=+)))?(3[0-9/]{4}((, )|(=+)))?(4[0-9/]{4}((, )|(=+)))?(5[0-9/]{4}((, )|(=+)))?(6[0-9/]{4}((, )|(=+)))?(7[0-9/]{4}((, )|(=+)))?(8[0-9/]{4}((, )|(=+)))*(9[0-9/]{4}((, )|(=+)))*' | cut -c 8- | tr -d '=')
 
	s51vv=$(echo "$section5" | grep -o -P -e '1[0-9/]{4}' | cut -b 2-3)
	s51ff=$(echo "$section5" | grep -o -P -e '1[0-9/]{4}' | cut -b 4-5)
	s52sn=$(echo "$section5" | grep -o -P -e '2[0-9/]{4}' | cut -b 2)
	s52ttt=$(echo "$section5" | grep -o -P -e '2[0-9/]{4}' | cut -b 3-5)
 
	#echo "$section5"
 
	# VYPIS
 
	echo "$radek"
	echo "$mesto   $gpsn,$gpse   $ff m/s   $s11ttt °C   $s13tttt Pa   $s16rrr mm/6h";
 
	json+="{"
	json+="\"station\":\"$mesto\","
	json+="\"gpse\":\"$gpse\","
	json+="\"gpsn\":\"$gpsn\","
	json+="\"wind\":\"$ff\","
	json+="\"temp\":\"$s11ttt\","
	json+="\"press\":\"$s13tttt\","
	json+="\"rain\":\"$s16rrr\","
	json+="\"raw\":\"$radek\"" # posledni bez ,
	json+="},"
 
done <<< $(echo "$syno")
 
json+="{}]}'"
echo "$json" | sed -e "s/^var data='//g" -e "s/'$//g" > "$3"
 
 
# STATIC
 
js='<script>'
js+='map = new OpenLayers.Map("map");'
js+='map.addLayer(new OpenLayers.Layer.OSM());'
js+='epsg4326 =  new OpenLayers.Projection("EPSG:4326");' # WGS 1984 projection
js+='projectTo = map.getProjectionObject();' # The map projection (Spherical Mercator)
js+='var lonLat = new OpenLayers.LonLat(15.478, 49.817).transform(epsg4326, projectTo);'
js+='var zoom=8;'
js+='map.setCenter (lonLat, zoom);'
js+="$json"
js+="</script>"
 
html='<!DOCTYPE html>'
html+='<html>'
html+='<head>'
html+='<meta http-equiv="Content-Type" content="text/html; charset=utf-8">'
html+='<title>BrmMeteo</title>'
html+='<link rel="stylesheet" href="./style.css" type="text/css">'
html+='<link rel="favicon" href="./biohazard.svg">'
html+='<script src="./OpenLayers.js"></script>'
html+='</head>'
html+='<body>'
html+="<h1 id='title'>BrmMeteo - Let's make HAARP great again!</h1>"
html+="<div id='map' class='smallmap'></div>"
html+="<br><p>Welcome! You can download the <a href='./brmmeteo.json' target='_blank'>source data as JSON file</a><br>"
html+="This site is owned and governed by members of the <a href='https://brmlab.cz' target='_blank'>hackerspace brmlab</a>. See our wiki page for <a href='https://brmlab.cz/project/brmmeteo/start' target='_blank'>details and contact info</a><br>License: CC-BY-SA</p>"
html+="</body>"
html+="$js"
html+='<script src="./brmmeteo.js"></script>'
html+="</html>"
 
echo "$html" > "$2"
project/brmmeteo/start.txt · Last modified: 2019/02/05 20:21 by sachy