Būtībā viss ir vienkārši lapa ir te, kods ir te, nekādi paskaidrojumi tālāk neseko, vai ne?
Rright. Tālāk visi neprogrammētāji aiziet skatīties radara bildi un tālāk nelasa. Ar pārejiem strādāsim.
Būtībā jau, lai uztaisītu šādu servisu neko daudz nevajag. Pāris stundas un gatavs. Tiesa, neveiksmes gadījumā (ir reāli lietaina diena/s) var gadīties, ka vajadzēs vairāk, bet par visu pēc kārtas.
Tātad ko mēs gribam panākt – well, būtībā to, ko var redzēt augstākminētajā saitē – t.i. uz google maps (vai kādas citas kartes) projicēti nokrišņi (vai kāda cita informācija, tas pat nav būtiski, bet šeit mēs apskatīsim tieši nokrišņu radaru).
Kā to dara?
Step 1. Apzinam nokrišņu radaru lapas. Ņemot vērā, ka LVĢMC lapa tagad to piedāvā kā maksas pakalpojumu, tad to atmetam, paliek igauņi un lietuvieši.
Step 2. Iegūstam bāzes attēlus katram no šiem radariem. Šeit ir atruna par to, ka ja ir skaidrs laiks, tad ir mazāk jāiegulda darbs un ir nepieciešami mazāk attēli, lai novāktu nost visu info.
Step 3. Uztaisam skriptiņu, kas iegūst attiecīgos jaunākos attēlus. Ja ir nepieciešams proxy – izmantojam cUrl.
Step 4. Apstrādājam jauniegūtos attēlus ar imagemagick. Būtībā mūs interesē šādas lietas
– izvākt lieko informāciju no igauņu attēla (cropojam).
– novākt fonu atstājot tikai nokrišņus.
– kompresēt attēlu, lai tas aizņem mazāk vietas.
#pieņemam, ka $src un $dst ir mainīgie, kas satur pilnu ceļu uz failu
#$base savukārt ir pilns ceļš uz augstāk minēto attēlu, kurš satur tikai fonu
#igauņu attēla cropošana -> dst attēls ir 558x558 px un kvadrāta kreisais augšējais stūris ir 1,81
convert $src -crop '558x558!+1+81' $src
#novācam nost fonu
convert $src $base -compose ChangeMask -composite $dst
#png attēla saspiešana -> samazinam uz 256 krāsām, saglabājot caurspīdību
convert $dst -fuzz 10% -colors 256 -transparent none $dst
Step 5. Saprotamies ar interesējošā kartes provaidera API dokumentāciju.
Step 6. Izmantojot saprasto API liekam lapā tik iekšā karti. Tāpat attiecīgajai kartei taisam overlay objektu.
Step 7. Paga, paga – a kādās koordinātēs mums ir jāliek tas overlay? Nu – šeit ir tāds moments, ka darbojamies методом научного тыка. T.i. ar lineāla, acumēra un tamlīdzīgām palīdzībām mēģinam saprast kādas tieši ir tās koordinātes kartes dienvidrietumu un ziemeļaustrumu stūriem. Protams, gan jau vieglāks veids būtu bijis overlayā likt puscaurspīdīgu base karti, bet man nakts vidū bija slinkums to izdomāt, turklāt ar Gudgesa/aproksimācijas metodi veiktie koordināšu pieņēmumi bija pietiekami precīzi, lai pēc tam tos mazliet pielabojot trāpītu apmēram pareizi.
Step 8. Atceramies, ka google mapos un radaru kartēs, lai arī karšu projekcijas ir līdzīgas, tās tomēr nav identiskas, līdz ar to, ja vien negribās veikt kaut kādu vēl attēlu transformēšanu, ir jāsamierinās, ka visās vietās precīzi virsū viss nebūs.
Step 9. Ā, būtībā šeit mums būtu jāizdomā veids kā uzzināt, kurš ir jaunākais attēls un rādīt to. Viena ideja ir tāda, ka attēlu nosaukumā tiek ietverta laika informācija, pie tam tādā veidā, ka jebkurš jaunāks attēls ir alfabētiski kārtojot “lielāks” par iepriekšējo. (ISO datuma formāts Y-m-d H:i ir tam labi piemērots). Rezultātā, lai atrastu jaunāko attēlu var vienkārši izmantot glob, un paņemt pēdējo masīva elementu.
Step 10. Teorētiski šajā mirklī mēs esam iemanījušies dabūt jaunāko bildi uz ekrāna. Vēl varētu pielikt animāciju – t.i. būtu jāielādē iepriekšējās x bildes un tās pārmaiņus jārāda. Ir vairāki varianti kā to darīt, bet idejiski, ja prot ielādēt jaunāko, tad iepriekšpēdējās ielāde ir triviāla. Manā gadījumā tas notiek tā, ka pie animācijas pogas nospiešanas tiek uzsākta iepriekšējo bilžu ielāde, kad tās visas ir ielādētas (sataisīti visi pārējie overlayi), tad tiek palaista funkcija, kas ar setTimeout palīdzību sevi izsauc ik pēc sekundes.
Step 11. Papildus foršumam, kartei būtu pašai jāspēj ielādēt jaunākā bilde, ja tā tiek turēta vaļā pietiekami ilgu laiku. Būtībā te arī ir vienkārši – mums ir zināms, kāds taimstamps ir pēdējai bildei, ik pa minūtei (sākumā) veicam pieprasījumu, kas mums atgriež jaunākās bildes failneimu (taimstampu) un salīdzinam šos – ja ir jaunāks, tad iemetam to animācijas masīva sākumā, un nomainam aktuālo bildi uz to. Pēc tam optimizācijas nolūkos var veikt pieprasījumus tikai reizi attēlu atjaunināšanas laikā (15 min)
Nekas vairak tur arī īsti nav. (Ja neskaita to momentu, kas saucās ko darīt, kad tev uzklūp viss Latvijas internets). Veiksmi savu meteodienestu izveidē!
P.S.
Protams, ka tur ir vēl visādas milions lietas un sīkumi, ko varētu izdarīt tā, lai ir vēl daudz foršāk, protams, ka tieši tie arī ir tas, pie kā tiek pavadīts vislielākais laiks. Bet nu jā – te tādā tipiskā startup variantā ir izstāstīts, kā ātri tikt pie MVP :)