Uutiset:

Ei uusia uutisia.

Main Menu

Sääkameran kuva-arkisto

Aloittaja teutari, perjantai, 01.10.2010, 18:39

« edellinen - seuraava »

0 Jäsenet ja 1 Vieras katselee tätä aihetta.

teutari

Joskus on tullut aina mietittyä että tuommoinen sääkameran kuva-arkisto olisi mukava olla olemmassa mistä pystyisi katsomaan sääkameran kuvia jälkikäteen pitemmältäkin ajalta taaksepäin ja verestelemään vanhoja. :)
Vaihtoehtoja tuohon kuva-arkistoon oli kaksi, ensimmäinen vaihto oli että tehdä sääsivujen palvelimelle (dedille) kansio jonne kuvia tallentais päivittäin mutta kun vuoden kuvakasa olisi ollut n.1400 kpl..... ::)
Mitäpä sitä dedin resursseja tuommoiseen tuhlaa kun sillä on paljon tärkeämpääkin tekemistä ja WU:lla on kaikki jo valmiina kun sinne tulee tuota sääkameran kuvaa lähetettyä. ;)
Asian tiimoilta tein pientä kyselyä meidän "script-gurulle" (weatherc) että onko mahdollista jne. saada tuota WU:n Monthly Overview osaa ilman tuota "laadukasta" video hässäkkää omalle sivulle....? ja eipä siinä ehtinyt kissaa sanomaan saatikka sitten ajatuksia loppuun kun kaikki oli jo valmista. :D

Vanhoja sääkameran kuvia voi nyt luurailla tuolla.
Löytyyhän sieltä aika paljon reikiä päivien kohdilta mutta täytyypä olla tästä lähtien hiukan tunnollisempi tuon sääkamerakuvan lähettämisessä. ;)

weatherc

#1
Oli todella simppeli tehdä loppujen lopuksi, perustuu osaksi UV-ennuste-skriptiin joka meillä oli jo ennestään :)
Laitetaanpa se koodi tähän, sivu on CL-templateen suoraan sopiva.
Mitä tarvitset:

- Puske WU:lle kamerakuvaa
- Fancybox Jquery lightbox-palikan jonka voi hakea täältä, uploadaa vain fancybox-kansio juureen ja se on siinä
- Tee kansio nimeltään cache ja chmoddaa se 0777 tai 0666
- Hae oma kamerasivusi url WU:lta ja nappaa osoite talteen ja muuta rivillä 83 oleva $rawURL vastaamaan sitä, siten ettei show.html-loppuosaa ole mukana.

<?php
############################################################################
# A Project of TNET Services, Inc. and Saratoga-Weather.org (WD-World template set)
############################################################################
#
#   Project:    Sample Included Website Design
#   Module:     sample.php
#   Purpose:    Sample Page
#   Authors:    Kevin W. Reed <kreed@tnet.com>
#               TNET Services, Inc.
#
#     Copyright:    (c) 1992-2007 Copyright TNET Services, Inc.
############################################################################
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
############################################################################
#    This document uses Tab 4 Settings
############################################################################
require_once("Settings.php");
require_once(
"common.php");
############################################################################
$TITLE$SITE['organ'] . " Teutari.net - Live Sääkamera";
$showGizmo false;  // set to false to exclude the gizmo
include("top.php");
############################################################################
?>

<!-- HEAD OSA ALKU -->
<link rel="stylesheet" href="/fancybox/jquery.fancybox-1.3.1.css" type="text/css" media="screen" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
<script type="text/javascript" src="/fancybox/jquery.fancybox-1.3.1.pack.js"></script>
<script type="text/javascript">
<!--
       $(document).ready(function(){
           $("a.bigcam").fancybox();

       });
//-->
</script>
<style>
.selectorBox { padding-top: 10px; width: 850px; }
.selectorBox .dateTable SPAN { margin: 0 10px 0 10px; white-space: nowrap; }
.selectorBox .dateTable TD { vertical-align: middle; padding: 1px; }
.selectorBox .dateTable td.nobr { width: 250px; }
.selectorBox .dateTable .dateForm { margin-left: auto; margin-right: auto; }
.selectorBox .dateTable .dateForm SELECT { margin: 1px; }

#calTable { width: 850px; margin: 0 0 10px 0; }
#calTable THEAD TR TD { background-color: #4A4A4A; font-weight: bold; text-align: center; padding: 4px; color:#fff; padding-bottom: 2px; font-size: 11px; }
#calTable TBODY TR TD { padding: 3px; text-align:center; }
#calTable .dayCell { vertical-align: top; border: 2px solid #eee; }
#calTable .calThumb { text-align: center; min-width: 100px; min-height: 80px; margin: 5px 5px 0 5px; font-size: 14px; color: #999; }
#calTable .calThumb IMG { border-top: 1px solid #999; border-right: 1px solid #333; border-bottom: 1px solid #333; border-left: 1px solid #999; }
#calTable .vaM { text-align: left; width: 60px; }
</style>
<!-- HEAD OSA LOPPU -->
</head>
<body>
<?php
############################################################################
include("header.php");
############################################################################
include("menubar.php");
############################################################################
?>


<div id="main-copy">
<!-- BODY OSA ALKU -->
<?php
#error_reporting(E_ALL);
#ini_set('display_errors', '1');

$rawURL "http://www.wunderground.com/webcams/kamerakansiowussa/1/";
$UVcacheName "cache/monthcam";
$UVrefetchSeconds 3600;

$defmonth date('m');
$defyr date('Y');
$deftime "noon";
if(isset(
$_GET[month])) { $month $_GET[month]; } else { $month $defmonth; }
if(isset(
$_GET[yr])) { $yr $_GET[yr]; } else { $yr $defyr; }
if(isset(
$_GET[time])) { $time $_GET[time]; } else { $time $deftime; }

$UVcacheName $UVcacheName.$yr.$month.$time.'.txt';
$UV_URL $rawURL.'show.html?year='.$yr.'&month='.$month.'&time='.$time;

if (
file_exists($UVcacheName) and filemtime($UVcacheName) + $UVrefetchSeconds time()) {
      
$WhereLoaded "from cache $UVcacheName";
      
$html implode(''file($UVcacheName));
    } else {
      
$WhereLoaded "from URL $UV_URL";
      
$html fetchUVUrlWithoutHanging($UV_URL);
      
$fp fopen($UVcacheName"w"); 
      if(
$fp) {
        
$write fputs($fp$html); 
        
fclose($fp);
      } else {
        print 
"<!--Unable to write cache $UVcacheName -->\n";
      }
}
print 
"<!-- UV data load from $WhereLoaded -->\n";

  
preg_match_all('|<div class="blueBox">(.*?)<table cellspacing="0" cellpadding="0" class="blueBottom">|is',$html,$betweenspan);
  
$table $betweenspan[1][1];
  
$table preg_replace("/vaM\">\<a(.*)\>(.*)\<\/a\>/iU""vaM\">$2"$table);
  
$table preg_replace("/<p class(.*)p>/"""$table);
  
$table preg_replace("/rel=\"lightbox\[webcam\]\"/""class=\"bigcam\""$table);
  
$table preg_replace("/time-lapse video for this day/""full-size image"$table);
  
$table preg_replace("/\<a href=\"show.html(.*)a>/""&nbsp;"$table);
  
$table preg_replace("/background-color: #F5F5F5; border-bottom: 1px solid #FFF; border-right: 1px solid #FFF;/"""$table);
  
  echo 
substr($table,0,-7);
  echo 
'<br/>Data courtnesy of <a href="'.$UV_URL.'" target="_new">Wunderground</a>.';
    
// ----------------------------functions ----------------------------------- 
 
 
function fetchUVUrlWithoutHanging($url// thanks to Tom at Carterlake.org for this script fragment
   
{
   
// Set maximum number of seconds (can have floating-point) to wait for feed before displaying page without feed
   
$numberOfSeconds=4;   

   
// Suppress error reporting so Web site visitors are unaware if the feed fails
   
error_reporting(0);

   
// Extract resource path and domain from URL ready for fsockopen

   
$url str_replace("http://","",$url);
   
$urlComponents explode("/",$url);
   
$domain $urlComponents[0];
   
$resourcePath str_replace($domain,"",$url);

   
// Establish a connection
   
$socketConnection fsockopen($domain80$errno$errstr$numberOfSeconds);

   if (!
$socketConnection)
       {
       
// You may wish to remove the following debugging line on a live Web site
        
print("<!-- Network error: $errstr ($errno) -->\n");
       }    
// end if
   
else    {
       
$xml '';
       
fputs($socketConnection"GET $resourcePath HTTP/1.0\r\nHost: $domain\r\n\r\n");
   
       
// Loop until end of file
       
while (!feof($socketConnection))
           {
           
$xml .= fgets($socketConnection4096);
           }    
// end while

       
fclose ($socketConnection);

       }    
// end else
      

   
return($xml);

   }    
// end function
   
// ----------------------------------------------------------

?>

<!-- BODY OSA LOPPU -->
   <p> </p>
</div><!-- end main-copy -->

<?php
############################################################################
include("footer.php");
############################################################################
# End of Page
############################################################################
?>


Sitä miettiville, WU:n politiikkahan on se että jos lähettää heille dataa niin saa myös käyttää heidän datoja, eli molemmat osapuolet saa/ottaa, mikä on mielestäni aivan mainio politiikka. Tästä on useamman kerran keskusteltu ww-foorumilla matkan varrella ja asiaa on myös kysytty suoraan WU:lta.

Snowi

Näyttää kyllä aivan erinomaiselta ja kyllä tuonlaatuisia kuvia kelpaa katsellakin  ;D

Itsellä on puolestaan ollut mielessä videoarkisto sääkamerasta, tuon ukkostutkan tapaan. Silkeborgilla on tehty juuri tuosta ukkostutkan videoarkistosta arkisto myös kameralle ja varmaan on weatherc:lla näppinsä pelissä myös siinäkin  ;D. Löytyy täältä http://www.silkeborg-vejret.dk/english/video.php
Paljonkohan yksi päivän video veisi tilaa? Tosin omat videot olisi kyllä vähän lyhyempiä, mutta toisaalta parempilaatuisia.

weatherc

Silkeborgin videot ovat noin 4.5 megan kokoisia, eli tekis noin 1.65 gigaa vuodessa  ;D

Ne ei ole meikäläisen käsialaa (itse allakka-skriptissä taas mulla oli sormet mukana, on muokattu versio NS-allakasta ;D) vaan ne ovat WD:n webkamerapalikan tekemiä. Siinähän on asetuksia vaikka muille jakaa koon, kuvia/s ym. suhteen jolla myös pystyy sitä kautta säädellä videon kokoa. Siinä on myös koko nippu eri vaihtoehtoja että mikä on videon muoto joka pusketaan ylös serverille.

WD:n videohan perustuu siihen että se nappaa kuvan joka minuutti tais olla joista se sitten tekee videon päivän päätteeksi, pystyy myös tekemään videot päivän aikana kerran tunnissa. Hienouden saa sitten tallennettua päivämäärän kera.
Nykyisen palikan videolaatu on jo aikas hyvä kuten myös näkyy Silkeborgin videosta, tosin sitäkin saa säädettyä, mutta kannattaa muistaa että parempi laatu -> isompi koko.

Dedillä olijoille: jos alat tekemään video-arkistoa, pistä kansio mulle postissa niin laitan sen backupin ohituslistalle ettei backuppi kasva liian isoksi (sullahan jää videot myös WD:n webfiles-kansioon, tai minne sit asetatkin sen tallentamaan ne ;)). Mitä dedin varsinaiseen tilaan tulee niin en näe mitään estettä laittamaan arkistoa pystyyn, jos ottaa laskuun vaikka 10 sivustoa niin jokaiselle olisi noin 50 gigaa tilaa ihan kevyesti (ja jäis vielä 250 G purkin muille tavaroille)

weatherc

Kokeilin piruttain Windows-versiota FFMPEG:stä wx-purkilla ja ainakin 20 kuvan video antais olettaa että koko olisi 1/4 siitä mitä WD:n video on niillä asteuksilla mitä nyt tein.

Ainut mutka FFMPEG:ssä on se että sen käyttämät kuvat pitää olla numerojärjestyksessä alkaen numerosta 1, ei aikaleimalla kuten WD:n kuvankeruu ne tallentaa. Ainakin nyt kokeilussa ratkaisin sen siten että WAMP-serverin avulla pieni php-skripti joka tallentaa kuvan minuutin välein haluttuun kansioon tarkistamalla ensin kuin monta kuvaa on jo kansiossa samalla kun se piententää kuvaa kokoon 480x320. (sama skripti mitä käytän dedillä NS-videokuvien keruun)

Windows-FFMPEG:n voi ladata tuolta. Se ei vaadi mitään asennusta vaan toimii suoraan ainakin mulla.
.bat-filu jolla tein kokeiluvideon on tuossa:
set FFMPEG_DATADIR=D:\ffmpeg\presets\
set FileDate=%date:~9,4%%date:~6,2%%date:~3,2%
set FD=%FileDate%

@DEL /S /Q /F "D:\ffmpeg\videos\nex%FD%.mp4"
D:\ffmpeg\bin\ffmpeg -y -f image2 -r 25 -i C:\wamp\www\timelapse\cam%%d.jpg -vcodec libx264 -vpre hq -crf 26 D:\ffmpeg\videos\nex%FD%.mp4

@ECHO OFF

Tuo tallentaa videon nimellä nexVVVVKKPP.mp4, eli tämän päivän nimenä on nex20101002.mp4.
mp4-muodon valitsin jotta Windowsin mediaplayerikin osais sen näyttää  ;D


Snowi

Aivan loistavaa  ;D. Pitää katsoa tuota tänään tai viimeistään huomenna tarkemmin ja katsoa jos sais sitten kameran kuvista videoarkiston  :)

weatherc

#6
Nyt on 4 tunnin pätkä kasassa, josta tosin suuri osa on pimeää kuvaa, ja videon koko on vaivalloiset 180 KB kun tein sen FFMPEG:llä siten että kuva tallennetaan joka toinen minuutti koossa 480x320 joka on ihan hyvä vielä videolle.
Sen voi hakea tuolta, ei ole mitenkään autopäivittyvä vaan koeotos klo 19-23 pätkästä.
Vertailuna, ainakin oma WD:n tekemä tunnin video on 640 KB, samalla koolla.

Uhohtui tuosta edellisesta viestistä se php-skripti ;)
Tämä hoitaa myös noita muita webkameran kuvia joita sivuilla on.
Siinä on paljon sontaa joukossa mutta pääidea on siinä että
(a) lukaisee clientraw:n ja raapustaa tiedot kuviin
(b) tallentaa yhteensä 4 erikokosita kuvaa webkameran kuvasta aina pienestä nappikuvasta normikokoon (avartarkoko, nwn:n pallukka-koko, 480x320 ja 640x480) ;)
(c) kopioi medium-kokoisen kuvan myös timelapse-kansioon videota varten tarkistamalla ensin että kuin montaa kuvaa siellä jo on jotta saa numeroinnin oikein. Tarkistaa myös että kuvasta tuli jotain (= koko yli 1KB).
Tallennus tapahtuu omaan kansioon 3 kuvan osalta josta Fling:in FTP-automaatti sitten uppaa ne dedille heti kun tulevat uunista ulos :)
neljännen kuvan osalta en tarvi sitä sivuilla joten en laittanut sitä siihen (on videon käyttämä mediumkoko).
Selvennyksi vielä, tämä ajetaan wx-purkilla kotona wamp-serverin avulla, ei dedillä.

<?php
date_default_timezone_set
("Europe/Helsinki");

# what is the root of your files?
$basedir="D:\Dorgem";

$clientrawfile "D:\WD\webfiles\clientraw.txt";
$clientraw get_raw($clientrawfile);
$font="tahomabd.ttf";
$astringwindDir($clientraw[3]) . " " ktsToMph($clientraw[2],1) . " m/s, ".$clientraw[4]."°C, "$clientraw[7]." mm";

$file="D:\Dorgem\cam.jpg";
$image $file;

$camtime=filemtime($image);
$bstring=date('d.m.Y H:i T'$camtime);
$cstring "nordicweather.net";

$ext substr($image, -3);

if (
strtolower($ext) == "gif") {
    if (!
$im2 imagecreatefromgif($image)) {
        echo 
"Error opening $image!"; exit;
    }
} else if(
strtolower($ext) == "jpg") {
    if (!
$im2 imagecreatefromjpeg($image)) {
        echo 
"Error opening $image!"; exit;
    }
} else if(
strtolower($ext) == "png") {
    if (!
$im2 imagecreatefrompng($image)) {
        echo 
"Error opening $image!"; exit;
    }
} else {
    die;
}

$grey imagecolorallocate ($im2166166166);
$black imagecolorallocate ($im20,0,0);

$image_p imagecreatetruecolor(128,96);
imagecopyresampled($image_p$im2000012896640480);
imagettftext($image_p403592$grey$font$cstring);
imagejpeg($image_p,'C:\wamp\www\out\cam_small.jpg',85);
imagedestroy($image_p);

$image_p imagecreatetruecolor(100,100);
imagecopyresampled($image_p$im20000100100640480);
imagettftext($image_p402898$grey$font$cstring);
imagejpeg($image_p,'C:\wamp\www\out\cam_ww.jpg',85);
imagedestroy($image_p);

$astr strlen($astring);
$bstr strlen($bstring);

$image_p imagecreatetruecolor(480,320);
imagecopyresampled($image_p$im20000480320640480);

imagettftext($image_p80356290$black$font$cstring);
imagettftext($image_p80, (465-(($astr*5.9)-1)), 316$black$font$astring);
imagettftext($image_p80, (465-(($bstr*6.25)-1)), 303$black$font$bstring);

imagettftext($image_p80355289$grey$font$cstring);
imagettftext($image_p80, (465-($astr*5.9)), 315$grey$font$astring);
imagettftext($image_p80, (465-($bstr*6.25)), 302$grey$font$bstring);
imagejpeg($image_p,'C:\wamp\www\cam_med.jpg',85);
imagedestroy($image_p);


imagettftext($im2100, (635-(($astr*7.7)-1)), 476$black$font$astring);
imagettftext($im2100, (635-(($bstr*7.8)-1)), 461$black$font$bstring);
imagettftext($im2100499446$black$font$cstring);

imagettftext($im2100, (635-($astr*7.7)), 475$grey$font$astring);
imagettftext($im2100, (635-($bstr*7.8)), 460$grey$font$bstring);
imagettftext($im2100498445$grey$font$cstring);

imagejpeg($im2,'C:\wamp\www\out\cam.jpg',85);
#imagepng($im2,'C:\wamp\www\out\cam.png',9);

imagedestroy($im2);

$im 'C:\wamp\www\cam_med.jpg';
$outdir 'C:\wamp\www\timelapse';

$filecount count(glob("" $outdir "\cam*.jpg"));
$filecount += 1;

$fileout $outdir.'\cam'.$filecount.'.jpg';

copy($im$fileout);

if(
filesize($fileout) < 1) { unlink($fileout); }


function 
get_raw$rawfile ) {
        
$rawdata implode(''file($rawfile));
        
$rawdata explode(' '$rawdata);
        return 
$rawdata;
}

function 
ktsToMph ($kts$prec) {
          
$prec = (integer)$prec;
          
$inch = (float)$kts 0.514444444;
          return 
round($inch1);
}

function 
windDir ($winddir)
// Given the wind direction, return the text label
// for that value.  16 point compass
{
  if (!isset(
$winddir)) {
    return 
"---";
  }
$windlabel = array ("N","NNE""NE""ENE""E""ESE""SE""SSE""S",
   
"SSW","SW""WSW""W""WNN""NW""NNW");
$dir $windlabel[ (int) ($winddir 22.5) ];
return 
"$dir";
}
exit;
?>


weatherc

No niin, nyt on lähes vuorokauden mittainen testivideo kasassa ja siihen 2 MB kokoon näyttää menevän hienous vuorokaudessa.
Päiväsajan kuvat kun ovat huomattavastikkin isoimpia kooltaan kun pimeän ajan kuvat nostaa videonkin kokoa (15 KB öisin versus 60 KB päivisin).

HapaK

WUon tainnut muuttaa systeemeitä muunkin kuin ennusteen osalta. Kuva-arkisto, joka aiemmin näkyi omallakin sivulla loistaa poissaolollaan. Linkki on ainut mitä on jäljellä. Kuinkahan kuvat saisi näkymään?

http://www.jyv-weather.info/wxwebcamarchive.php

Data courtnesy of http://www.wunderground.com/webcams/HapaK/1/show.htmlshow.html?year=2011&month=02&time=noon Wunderground.




http://jyv-weather.info