{"id":557,"date":"2011-10-19T23:39:00","date_gmt":"2011-10-19T20:39:00","guid":{"rendered":"http:\/\/ramuuns.id.lv\/blog\/?p=557"},"modified":"2016-01-03T16:23:20","modified_gmt":"2016-01-03T14:23:20","slug":"ok-tatad-tu-gribi-sev-uztaisit-meteolapu","status":"publish","type":"post","link":"https:\/\/ramuuns.com\/blog\/2011\/10\/19\/ok-tatad-tu-gribi-sev-uztaisit-meteolapu\/","title":{"rendered":"Ok, t\u0101tad tu gribi sev uztais\u012bt meteolapu"},"content":{"rendered":"<p>B\u016bt\u012bb\u0101 viss ir vienk\u0101r\u0161i lapa ir <a href=\"http:\/\/meteo.enkurs.org\">te<\/a>, kods ir <a href=\"http:\/\/bitbucket.org\/ramuuns\/lt-ee-meteo-radar\">te<\/a>, nek\u0101di paskaidrojumi t\u0101l\u0101k neseko, vai ne?<\/p>\n<p>Rright. T\u0101l\u0101k visi neprogramm\u0113t\u0101ji aiziet <a href=\"http:\/\/meteo.enkurs.org\">skat\u012bties radara bildi<\/a> un t\u0101l\u0101k nelasa. Ar p\u0101rejiem str\u0101d\u0101sim.<\/p>\n<p>B\u016bt\u012bb\u0101 jau, lai uztais\u012btu \u0161\u0101du servisu neko daudz nevajag. P\u0101ris stundas un gatavs. Tiesa, neveiksmes gad\u012bjum\u0101 (ir re\u0101li lietaina diena\/s) \u00a0var gad\u012bties, ka vajadz\u0113s vair\u0101k, bet par visu p\u0113c k\u0101rtas.<\/p>\n<p>T\u0101tad ko m\u0113s gribam pan\u0101kt &#8211; well, b\u016bt\u012bb\u0101 to, ko var redz\u0113t augst\u0101kmin\u0113taj\u0101 sait\u0113 &#8211; t.i. uz google maps (vai k\u0101das citas kartes) projic\u0113ti nokri\u0161\u0146i (vai k\u0101da cita inform\u0101cija, tas pat nav b\u016btiski, bet \u0161eit m\u0113s apskat\u012bsim tie\u0161i nokri\u0161\u0146u radaru).<\/p>\n<p>K\u0101 to dara?<\/p>\n<p>Step 1. Apzinam nokri\u0161\u0146u radaru lapas. \u0145emot v\u0113r\u0101, ka LV\u0122MC lapa tagad to pied\u0101v\u0101 k\u0101 maksas pakalpojumu, tad to atmetam, paliek <a title=\"Igau\u0146u meteoradars skat\u012bts caur lt proxy serveri\" href=\"http:\/\/proxy.zzona.lt\/browse.php?u=http%3A%2F%2Fwww.emhi.ee%2Finc%2Fother%2Fradaripilt.php%3Fj%3Dsur%26v%3D1&amp;b=4\">igau\u0146i<\/a> un <a href=\"http:\/\/www.meteo.lt\/radaro_inf.php\">lietuvie\u0161i<\/a>.<\/p>\n<p>Step 2. Ieg\u016bstam b\u0101zes att\u0113lus katram no \u0161iem radariem. \u0160eit ir atruna par to, ka ja ir skaidrs laiks, tad ir maz\u0101k j\u0101iegulda darbs un ir nepiecie\u0161ami maz\u0101k att\u0113li, lai nov\u0101ktu nost visu info.<\/p>\n<p><img class=\"alignnone\" src=\"https:\/\/balticra.in\/images\/lt\/base.png\" alt=\"\" \/><\/p>\n<p><img class=\"alignnone\" src=\"https:\/\/balticra.in\/images\/ee\/base.png\" alt=\"\" \/><\/p>\n<p>Step 3. Uztaisam skripti\u0146u, kas ieg\u016bst attiec\u012bgos jaun\u0101kos att\u0113lus. Ja ir nepiecie\u0161ams proxy &#8211; izmantojam cUrl.<\/p>\n<p>Step 4. Apstr\u0101d\u0101jam jaunieg\u016btos att\u0113lus ar <a href=\"http:\/\/www.imagemagick.org\">imagemagick<\/a>. B\u016bt\u012bb\u0101 m\u016bs interes\u0113 \u0161\u0101das lietas<br \/>\n&#8211; izv\u0101kt lieko inform\u0101ciju no igau\u0146u att\u0113la (cropojam).<br \/>\n&#8211; nov\u0101kt fonu atst\u0101jot tikai nokri\u0161\u0146us.<br \/>\n&#8211; kompres\u0113t att\u0113lu, lai tas aiz\u0146em maz\u0101k vietas.<\/p>\n<p><code><br \/>\n#pie\u0146emam, ka $src un $dst ir main\u012bgie, kas satur pilnu ce\u013cu uz failu<br \/>\n#$base savuk\u0101rt ir pilns ce\u013c\u0161 uz augst\u0101k min\u0113to att\u0113lu, kur\u0161 satur tikai fonu<br \/>\n#igau\u0146u att\u0113la cropo\u0161ana -&gt; dst att\u0113ls ir 558x558 px un kvadr\u0101ta kreisais aug\u0161\u0113jais st\u016bris ir 1,81<br \/>\nconvert $src -crop '558x558!+1+81' $src<br \/>\n#nov\u0101cam nost fonu<br \/>\nconvert $src $base -compose ChangeMask -composite $dst<br \/>\n#png att\u0113la saspie\u0161ana -&gt; samazinam uz 256 kr\u0101s\u0101m, saglab\u0101jot caursp\u012bd\u012bbu<br \/>\nconvert $dst -fuzz 10% -colors 256 -transparent none $dst<br \/>\n<\/code><\/p>\n<p>Step 5. Saprotamies ar interes\u0113jo\u0161\u0101 kartes provaidera <a href=\"http:\/\/code.google.com\/apis\/maps\/documentation\/javascript\/\">API dokument\u0101ciju<\/a>.<\/p>\n<p>Step 6. Izmantojot saprasto API liekam lap\u0101 tik iek\u0161\u0101 karti. T\u0101pat \u00a0attiec\u012bgajai kartei taisam\u00a0<a href=\"http:\/\/code.google.com\/apis\/maps\/documentation\/javascript\/overlays.html#CustomOverlays\">overlay objektu<\/a>.<\/p>\n<p>Step 7. Paga, paga &#8211; a k\u0101d\u0101s koordin\u0101t\u0113s mums ir j\u0101liek tas overlay? Nu &#8211; \u0161eit ir t\u0101ds moments, ka darbojamies\u00a0\u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043d\u0430\u0443\u0447\u043d\u043e\u0433\u043e \u0442\u044b\u043a\u0430. T.i. ar line\u0101la, acum\u0113ra un taml\u012bdz\u012bg\u0101m pal\u012bdz\u012bb\u0101m m\u0113\u0123inam saprast k\u0101das tie\u0161i ir t\u0101s koordin\u0101tes kartes dienvidrietumu un zieme\u013caustrumu st\u016briem. Protams, gan jau viegl\u0101ks veids b\u016btu bijis overlay\u0101 likt puscaursp\u012bd\u012bgu base karti, bet man nakts vid\u016b bija slinkums to izdom\u0101t, turkl\u0101t ar Gudgesa\/aproksim\u0101cijas metodi veiktie koordin\u0101\u0161u pie\u0146\u0113mumi bija pietiekami prec\u012bzi, lai p\u0113c tam tos mazliet pielabojot tr\u0101p\u012btu apm\u0113ram pareizi.<\/p>\n<p>Step 8. Atceramies, ka google mapos un radaru kart\u0113s, lai ar\u012b kar\u0161u projekcijas ir l\u012bdz\u012bgas, t\u0101s tom\u0113r nav identiskas, l\u012bdz ar to, ja vien negrib\u0101s veikt kaut k\u0101du v\u0113l att\u0113lu transform\u0113\u0161anu, ir j\u0101samierin\u0101s, ka vis\u0101s viet\u0101s prec\u012bzi virs\u016b viss neb\u016bs.<\/p>\n<p>Step 9. \u0100, b\u016bt\u012bb\u0101 \u0161eit mums b\u016btu j\u0101izdom\u0101 veids k\u0101 uzzin\u0101t, kur\u0161 ir jaun\u0101kais att\u0113ls un r\u0101d\u012bt to. Viena ideja ir t\u0101da, ka att\u0113lu nosaukum\u0101 tiek ietverta laika inform\u0101cija, pie tam t\u0101d\u0101 veid\u0101, ka jebkur\u0161 jaun\u0101ks att\u0113ls ir alfab\u0113tiski k\u0101rtojot &#8220;liel\u0101ks&#8221; par iepriek\u0161\u0113jo. (ISO datuma form\u0101ts Y-m-d H:i ir tam labi piem\u0113rots). Rezult\u0101t\u0101, lai atrastu jaun\u0101ko att\u0113lu var vienk\u0101r\u0161i izmantot glob, un pa\u0146emt p\u0113d\u0113jo mas\u012bva elementu.<\/p>\n<p>Step 10. Teor\u0113tiski \u0161aj\u0101 mirkl\u012b m\u0113s esam ieman\u012bju\u0161ies dab\u016bt jaun\u0101ko bildi uz ekr\u0101na. V\u0113l var\u0113tu pielikt anim\u0101ciju &#8211; t.i. b\u016btu j\u0101iel\u0101d\u0113 iepriek\u0161\u0113j\u0101s x bildes un t\u0101s p\u0101rmai\u0146us j\u0101r\u0101da. Ir vair\u0101ki varianti k\u0101 to dar\u012bt, bet idejiski, ja prot iel\u0101d\u0113t jaun\u0101ko, tad iepriek\u0161p\u0113d\u0113j\u0101s iel\u0101de ir trivi\u0101la. Man\u0101 gad\u012bjum\u0101 tas notiek t\u0101, ka pie anim\u0101cijas pogas nospie\u0161anas tiek uzs\u0101kta iepriek\u0161\u0113jo bil\u017eu iel\u0101de, kad t\u0101s visas ir iel\u0101d\u0113tas (satais\u012bti visi p\u0101r\u0113jie overlayi), tad tiek palaista funkcija, kas ar setTimeout pal\u012bdz\u012bbu sevi izsauc ik p\u0113c sekundes.<\/p>\n<p>Step 11. Papildus for\u0161umam, kartei b\u016btu pa\u0161ai j\u0101sp\u0113j iel\u0101d\u0113t jaun\u0101k\u0101 bilde, ja t\u0101 tiek tur\u0113ta va\u013c\u0101 pietiekami ilgu laiku. B\u016bt\u012bb\u0101 te ar\u012b ir vienk\u0101r\u0161i &#8211; mums ir zin\u0101ms, k\u0101ds taimstamps ir p\u0113d\u0113jai bildei, ik pa min\u016btei (s\u0101kum\u0101) veicam piepras\u012bjumu, kas mums atgrie\u017e jaun\u0101k\u0101s bildes failneimu (taimstampu) un sal\u012bdzinam \u0161os &#8211; ja ir jaun\u0101ks, tad iemetam to anim\u0101cijas mas\u012bva s\u0101kum\u0101, un nomainam aktu\u0101lo bildi uz to. P\u0113c tam optimiz\u0101cijas nol\u016bkos var veikt piepras\u012bjumus tikai reizi att\u0113lu atjaunin\u0101\u0161anas laik\u0101 (15 min)<\/p>\n<p>&nbsp;<\/p>\n<p>Nekas vairak tur ar\u012b \u012bsti nav. (Ja neskaita to momentu, kas sauc\u0101s ko dar\u012bt, kad tev uzkl\u016bp viss Latvijas internets). Veiksmi savu meteodienestu izveid\u0113!<\/p>\n<p>P.S.<\/p>\n<p>Protams, ka tur ir v\u0113l vis\u0101das milions lietas un s\u012bkumi, ko var\u0113tu izdar\u012bt t\u0101, lai ir v\u0113l daudz for\u0161\u0101k, protams, ka tie\u0161i tie ar\u012b ir tas, pie k\u0101 tiek pavad\u012bts visliel\u0101kais laiks. Bet nu j\u0101 &#8211; te t\u0101d\u0101 tipisk\u0101 startup variant\u0101 ir izst\u0101st\u012bts, k\u0101 \u0101tri tikt pie <a href=\"http:\/\/en.wikipedia.org\/wiki\/Minimum_viable_product\">MVP<\/a> :)<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>B\u016bt\u012bb\u0101 viss ir vienk\u0101r\u0161i lapa ir te, kods ir te, nek\u0101di paskaidrojumi t\u0101l\u0101k neseko, vai ne? Rright. T\u0101l\u0101k visi neprogramm\u0113t\u0101ji aiziet skat\u012bties radara bildi un t\u0101l\u0101k nelasa. Ar p\u0101rejiem str\u0101d\u0101sim. B\u016bt\u012bb\u0101 jau, lai uztais\u012btu \u0161\u0101du servisu neko daudz nevajag. P\u0101ris stundas un gatavs. Tiesa, neveiksmes gad\u012bjum\u0101 (ir re\u0101li lietaina diena\/s) \u00a0var gad\u012bties, ka vajadz\u0113s vair\u0101k, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[],"_links":{"self":[{"href":"https:\/\/ramuuns.com\/blog\/wp-json\/wp\/v2\/posts\/557"}],"collection":[{"href":"https:\/\/ramuuns.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ramuuns.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ramuuns.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ramuuns.com\/blog\/wp-json\/wp\/v2\/comments?post=557"}],"version-history":[{"count":5,"href":"https:\/\/ramuuns.com\/blog\/wp-json\/wp\/v2\/posts\/557\/revisions"}],"predecessor-version":[{"id":670,"href":"https:\/\/ramuuns.com\/blog\/wp-json\/wp\/v2\/posts\/557\/revisions\/670"}],"wp:attachment":[{"href":"https:\/\/ramuuns.com\/blog\/wp-json\/wp\/v2\/media?parent=557"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ramuuns.com\/blog\/wp-json\/wp\/v2\/categories?post=557"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ramuuns.com\/blog\/wp-json\/wp\/v2\/tags?post=557"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}