function decimate($points, $bounds)
{
$lngcnt = 20;
$latcnt = 20;
$cdl = array();
foreach($points as &$p)
{
$lngper = ($p['long'] - $bounds[1])/($bounds[3] - $bounds[1]);
$latper = ($p['lat'] - $bounds[0])/($bounds[2] - $bounds[0]);
$latidx = intVal($latcnt*$latper);
$lngidx = intVal($lngcnt*$lngper);
$val = $p['cpm'];
#create arrays if needed
if(!isset($cdl[$lngidx]))
{
$cdl[$lngidx] = array();
}
if(!isset($cdl[$lngidx][$latidx]))
{
$cdl[$lngidx][$latidx] = array();
$cp = &$cdl[$lngidx][$latidx];
$cp['sum'] = $val;
$cp['cnt'] = 1;
$cp['max'] = $val;
$cp['max_long'] = $p['long'];
$cp['max_lat'] = $p['lat'];
# $cp['min'] = $val;
# $cp['min_long'] = $p['long'];
# $cp['min_lat'] = $p['lat'];
}
else
{
$cp = &$cdl[$lngidx][$latidx];
$cp['sum'] += $val;
$cp['cnt']++;
if ($val > $cp['max'])
{
$cp['max'] = $val;
$cp['max_long'] = $p['long'];
$cp['max_lat'] = $p['lat'];
}
# if ($val < $cp['min'])
# {
# $cp['min'] = $val;
# $cp['min_long'] = $p['long'];
# $cp['min_lat'] = $p['lat'];
# }
}
}
$res = array();
foreach($cdl as $lng => &$lngcdl)
{
foreach($lngcdl as $lat => &$cp)
{
if($cp['cnt'] > 0)
{
$pnt = array();
$pnt['cpm'] = $cp['sum']/$cp['cnt'];
$pnt['long1'] = ($bounds[3] - $bounds[1])*$lng/$lngcnt + $bounds[1];
$pnt['lat1'] = ($bounds[2] - $bounds[0])*$lat/$latcnt + $bounds[0];
$pnt['long2'] = ($bounds[3] - $bounds[1])*($lng+1)/$lngcnt + $bounds[1];
$pnt['lat2'] = ($bounds[2] - $bounds[0])*($lat+1)/$latcnt + $bounds[0];
$pnt['max'] = $cp['max'] ;
$pnt['max_long'] = $cp['max_long'];
$pnt['max_lat'] = $cp['max_lat'] ;
# $pnt['min'] = $cp['min'] ;
# $pnt['min_long'] = $cp['min_long'];
# $pnt['min_lat'] = $cp['min_lat'] ;
array_push($res, $pnt);
}
}
}
return $res;
}
Thursday, July 14, 2011
Data decimation
The some times u just cant send out 100s of MBs of data, hell sometimes you cant process it. Basically you need to decimate the results into a usable shape. The average joe understands averages and maximums. So break it down based on what you need to see for the current level of zoom.
Labels:
php
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment