Good colorscheme for trip planner tester
[busui.git] / labs / tripPlannerTester.kml.php
blob:a/labs/tripPlannerTester.kml.php -> blob:b/labs/tripPlannerTester.kml.php
<?php <?php
  // http://www.herethere.net/~samson/php/color_gradient/color_gradient_generator.php.txt
  // return the interpolated value between pBegin and pEnd
  function interpolate($pBegin, $pEnd, $pStep, $pMax)
  {
  if ($pBegin < $pEnd) {
  return (($pEnd - $pBegin) * ($pStep / $pMax)) + $pBegin;
  }
  else {
  return (($pBegin - $pEnd) * (1 - ($pStep / $pMax))) + $pEnd;
  }
  }
  function Gradient($HexFrom, $HexTo, $ColorSteps)
  {
  $theColorBegin = hexdec($HexFrom);
  $theColorEnd = hexdec($HexTo);
  $theNumSteps = intval($ColorSteps);
  $theR0 = ($theColorBegin & 0xff0000) >> 16;
  $theG0 = ($theColorBegin & 0x00ff00) >> 8;
  $theB0 = ($theColorBegin & 0x0000ff) >> 0;
  $theR1 = ($theColorEnd & 0xff0000) >> 16;
  $theG1 = ($theColorEnd & 0x00ff00) >> 8;
  $theB1 = ($theColorEnd & 0x0000ff) >> 0;
  $GradientColors = array();
  // generate gradient swathe now
  for ($i = 0; $i <= $theNumSteps; $i++) {
  $theR = interpolate($theR0, $theR1, $i, $theNumSteps);
  $theG = interpolate($theG0, $theG1, $i, $theNumSteps);
  $theB = interpolate($theB0, $theB1, $i, $theNumSteps);
  $theVal = ((($theR << 8) | $theG) << 8) | $theB;
  $GradientColors[] = sprintf("%06X", $theVal);
  }
  return $GradientColors;
  }
  function processLeg($legNumber, $leg)
  {
  $legArray = object2array($leg);
  if ($legArray["@mode"] === "BUS") {
  return "bus {$legArray['@route']} " . str_replace("To", "towards", $legArray['@headsign']);
  }
  else {
  return "walk";
  //$walkingstep = "walk ";
  //if (strpos($step->streetName, "from") !== false && strpos($step->streetName, "way") !== false) {
  // $walkingstep.= "footpath";
  //}
  //else {
  // $walkingstep.= $step->streetName;
  //}
  //$walkingstep.= floor($step->distance) . "m";
  //return $walkingstep;
  }
  }
$csv = false; $csv = false;
$kml = true; $kml = true;
if ($kml) { if ($kml) {
header('Content-Type: application/vnd.google-earth.kml+xml'); //header('Content-Type: application/vnd.google-earth.kml+xml');
echo '<?xml version="1.0" encoding="UTF-8"?> echo '<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2"><Document>'; <kml xmlns="http://www.opengis.net/kml/2.2"><Document>';
} }
include ('../include/common.inc.php'); include ('../include/common.inc.php');
//Test code to grab transit times //Test code to grab transit times
// make sure to sleep(10); // make sure to sleep(10);
$boundingBoxes = Array( $boundingBoxes = Array(
"belconnen" => Array( "belconnen" => Array(
"startlat" => - 35.1828, "startlat" => - 35.1828,
"startlon" => 149.0295, "startlon" => 149.0295,
"finishlat" => - 35.2630, "finishlat" => - 35.2630,
"finishlon" => 149.1045, "finishlon" => 149.1045,
) , ) ,
"north gungahlin civic" => Array( "north gungahlin civic" => Array(
"startlat" => - 35.2652, "startlat" => - 35.1828,
"startlon" => 149.1045, "startlon" => 149.1045,
"finishlat" => -35.2955, "finishlat" => - 35.2955,
"finishlon" => 149.1559, "finishlon" => 149.1559,
) , ) ,
"west duffy" => Array( //"west duffy" => Array(
"startlat" => - 35.3252, // "startlat" => - 35.3252,
"startlon" => 149.0240, // "startlon" => 149.0240,
"finishlat" => - 35.3997, // "finishlat" => - 35.3997,
"finishlon" => 149.0676, // "finishlon" => 149.0676,
) , //) ,
"central south" => Array( //"central south" => Array(
"startlat" => - 35.3042, // "startlat" => - 35.3042,
"startlon" => 149.0762, // "startlon" => 149.0762,
"finishlat" => - 35.3370, // "finishlat" => - 35.3370,
"finishlon" => 149.1806, // "finishlon" => 149.1806,
) , //) ,
"south" => Array( //"south" => Array(
"startlat" => - 35.3403, // "startlat" => - 35.3403,
"startlon" => 149.0714, // "startlon" => 149.0714,
"finishlat" => - 35.4607, // "finishlat" => - 35.4607,
"finishlon" => 149.1243, // "finishlon" => 149.1243,
) //)
   
); );
$latdeltasize = 0.025; $latdeltasize = 0.01;
$londeltasize = 0.025; $londeltasize = 0.01;
$from = "Barry Drive"; $from = "Wattle Street";
$fromPlace = (startsWith($from, "-") ? $from : geocode($from, false)); $fromPlace = (startsWith($from, "-") ? $from : geocode($from, false));
$startTime = "9:00 am"; $startTime = "9:00 am";
$startDate = "21/03/2011"; $startDate = "03/21/2011"; // american dates, OTP does not validate!
$counter = 0; $counter = 0;
$regionTimes = Array(); $regionTimes = Array();
$testRegions = Array(); $testRegions = Array();
$useragent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1"; $useragent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1";
if ($csv) echo "<pre>"; if ($csv) echo "<pre>";
if ($csv) echo "lat,lon,time,latdeltasize, londeltasize, region key name\n"; if ($csv) echo "lat,lon,time,latdeltasize, londeltasize, region key name\n";
   
foreach ($boundingBoxes as $key => $boundingBox) { foreach ($boundingBoxes as $key => $boundingBox) {
for ($i = $boundingBox['startlat']; $i >= $boundingBox['finishlat']; $i-= $latdeltasize) { for ($i = $boundingBox['startlat']; $i >= $boundingBox['finishlat']; $i-= $latdeltasize) {
for ($j = $boundingBox['startlon']; $j <= $boundingBox['finishlon']; $j+= $londeltasize) { for ($j = $boundingBox['startlon']; $j <= $boundingBox['finishlon']; $j+= $londeltasize) {
$url = $otpAPIurl . "ws/plan?date=" . urlencode($startDate) . "&time=" . urlencode($startTime) . "&mode=TRANSIT%2CWALK&optimize=QUICK&maxWalkDistance=840&wheelchair=false&toPlace=" . $i . "," . $j . "&fromPlace=$fromPlace&intermediatePlaces="; $url = $otpAPIurl . "ws/plan?date=" . urlencode($startDate) . "&time=" . urlencode($startTime) . "&mode=TRANSIT%2CWALK&optimize=QUICK&maxWalkDistance=440&wheelchair=false&toPlace=" . $i . "," . $j . "&fromPlace=$fromPlace";
$ch = curl_init($url); $ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, array( curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"Accept: application/json" "Accept: application/json"
)); ));
curl_setopt($ch, CURLOPT_TIMEOUT, 5); curl_setopt($ch, CURLOPT_TIMEOUT, 5);
$page = curl_exec($ch); $page = curl_exec($ch);
if (curl_errno($ch)) { if (curl_errno($ch)) {
if ($csv) echo "Trip planner temporarily unavailable: " . curl_errno($ch) . " " . curl_error($ch); if ($csv) echo "Trip planner temporarily unavailable: " . curl_errno($ch) . " " . curl_error($ch);
} }
else { else {
$tripplan = json_decode($page); $tripplan = json_decode($page);
if (isset($tripplan->error)) var_dump($tripplan->error); if (isset($tripplan->error)) var_dump($tripplan->error);
$times = Array(); $plans = Array();
if (is_array($tripplan->plan->itineraries->itinerary)) { if (is_array($tripplan->plan->itineraries->itinerary)) {
   
foreach ($tripplan->plan->itineraries->itinerary as $itineraryNumber => $itinerary) { foreach ($tripplan->plan->itineraries->itinerary as $itineraryNumber => $itinerary) {
$times[] = floor($itinerary->duration / 60000); $plans[floor($itinerary->duration / 60000) ] = $itinerary;
} }
   
} }
else { else {
$times[] = floor($tripplan->plan->itineraries->itinerary->duration / 60000); $plans[floor($tripplan->plan->itineraries->itinerary->duration / 60000) ] = $tripplan->plan->itineraries->itinerary;
} }
if ($csv) echo "$i,$j," . min($times) . ",$latdeltasize, $londeltasize,$key\n"; if ($csv) echo "$i,$j," . min(array_keys($plans)) . ",$latdeltasize, $londeltasize,$key\n";
  if ($kml) {
  $time = min(array_keys($plans));
  $plan = "";
  if (is_array($plans[min(array_keys($plans)) ]->legs->leg)) {
  foreach ($plans[min(array_keys($plans)) ]->legs->leg as $legNumber => $leg) {
  $plan .= processLeg($legNumber, $leg).",";
  }
  }
  else {
  $plan .= processLeg(0, $plans[min(array_keys($plans)) ]->legs->leg);
  }
  $testRegions[] = Array(
  "lat" => $i,
  "lon" => $j,
  "time" => $time,
  "latdeltasize" => $latdeltasize,
  "londeltasize" => $londeltasize,
  "regionname" => $key,
  "plan" => $plan . "<br><a href='". htmlspecialchars($url)."'>original plan</a>"
  );
  $regionTimes[] = $time;
  }
} }
flush(); flush();
ob_flush(); ob_flush();
curl_close($ch); curl_close($ch);
$testRegions[] = Array ("lat" => $i, "lon" => $j, "time" => min($times), "latdeltasize" => $latdeltasize, "londeltasize" => $londeltasize, "regionname" => $key); }
$regionTimes[] = min($times); }
break; }
} if ($kml) {
break; $colorSteps = 18;
} //$minTime = min($regionTimes);
} //$maxTime = max($regionTimes);
  //$rangeTime = $maxTime - $minTime;
// http://www.geekpedia.com/code163_Generate-Gradient-Within-Hex-Range-In-PHP.html //$deltaTime = $rangeTime / $colorSteps;
function Gradient($HexFrom, $HexTo, $ColorSteps) $Gradients = Gradient("66FF00", "FF0000", $colorSteps);
{ foreach ($testRegions as $testRegion) {
$FromRGB['r'] = hexdec(substr($HexFrom, 0, 2)); //$band = (floor(($testRegion[time] - $minTime) / $deltaTime));
$FromRGB['g'] = hexdec(substr($HexFrom, 2, 2)); $band = (floor(($testRegion[time] / 10) *2));
$FromRGB['b'] = hexdec(substr($HexFrom, 4, 2)); if ($band > $colorSteps) $band = $colorSteps;
  echo "<Placemark>
$ToRGB['r'] = hexdec(substr($HexTo, 0, 2)); <name>" . $testRegion['regionname'] . " time {$testRegion['time']} band $band</name>
$ToRGB['g'] = hexdec(substr($HexTo, 2, 2)); <description> {$testRegion['plan']} </description>
$ToRGB['b'] = hexdec(substr($HexTo, 4, 2));  
   
$StepRGB['r'] = ($FromRGB['r'] - $ToRGB['r']) / ($ColorSteps - 1);  
$StepRGB['g'] = ($FromRGB['g'] - $ToRGB['g']) / ($ColorSteps - 1);  
$StepRGB['b'] = ($FromRGB['b'] - $ToRGB['b']) / ($ColorSteps - 1);  
   
$GradientColors = array();  
   
for($i = 0; $i <= $ColorSteps; $i++)  
{  
$RGB['r'] = floor($FromRGB['r'] - ($StepRGB['r'] * $i));  
$RGB['g'] = floor($FromRGB['g'] - ($StepRGB['g'] * $i));  
$RGB['b'] = floor($FromRGB['b'] - ($StepRGB['b'] * $i));  
   
$HexRGB['r'] = sprintf('%02x', ($RGB['r']));  
$HexRGB['g'] = sprintf('%02x', ($RGB['g']));  
$HexRGB['b'] = sprintf('%02x', ($RGB['b']));  
   
$GradientColors[] = implode(NULL, $HexRGB);  
}  
return $GradientColors;  
}  
   
if ($kml) {  
$minTime = min($regionTimes);  
$maxTime = max($regionTimes);  
$rangeTime = $maxTime - $minTime;  
$colorSteps = 32;  
$deltaTime = $rangeTime / $colorSteps;  
   
$Gradients = Gradient("FF5B5B", "FFCA5B", $colorSteps);  
   
foreach ($testRegions as $testRegion) {  
$band = (floor(($testRegion[time] - $minTime) / $deltaTime));  
echo "<Placemark>  
<name>".$testRegion['regionname']." time {$testRegion[time]} band $band</name>  
<Style> <Style>
<PolyStyle> <PolyStyle>
<color>7f".$Gradients[$band]."</color>". // 7f = 50% alpha <color>c7" . strrev($Gradients[$band]) . "</color>" . // 7f = 50% alpha, c7=78%, also KML is BGR not RGB
"</PolyStyle> "</PolyStyle>
  <LineStyle>
  <color>c7" . strrev($Gradients[$band]) . "</color>" . "</LineStyle>
</Style> </Style>
<Polygon> <Polygon>
<extrude>1</extrude> <altitudeMode>relativeToGround</altitudeMode>
<altitudeMode>relativeToGround</altitudeMode>  
<outerBoundaryIs> <outerBoundaryIs>
<LinearRing> <LinearRing>
<coordinates> <coordinates>
". ($testRegion['lon'] - ($testRegion['londeltasize']/2)) . "," . ($testRegion['lat'] - ($testRegion['latdeltasize']/2)).",0\n". " . ($testRegion['lon'] - ($testRegion['londeltasize'] / 2)) . "," . ($testRegion['lat'] - ($testRegion['latdeltasize'] / 2)) . ",500\n" . ($testRegion['lon'] - ($testRegion['londeltasize'] / 2)) . "," . ($testRegion['lat'] + ($testRegion['latdeltasize'] / 2)) . ",500\n" . ($testRegion['lon'] + ($testRegion['londeltasize'] / 2)) . "," . ($testRegion['lat'] + ($testRegion['latdeltasize'] / 2)) . ",500\n" . ($testRegion['lon'] + ($testRegion['londeltasize'] / 2)) . "," . ($testRegion['lat'] - ($testRegion['latdeltasize'] / 2)) . ",500\n" . ($testRegion['lon'] - ($testRegion['londeltasize'] / 2)) . "," . ($testRegion['lat'] - ($testRegion['latdeltasize'] / 2)) . ",500\n" . "
($testRegion['lon'] - ($testRegion['londeltasize']/2)) . "," . ($testRegion['lat'] + ($testRegion['latdeltasize']/2)).",0\n".  
($testRegion['lon'] + ($testRegion['londeltasize']/2)) . "," . ($testRegion['lat'] + ($testRegion['latdeltasize']/2)).",0\n".  
($testRegion['lon'] + ($testRegion['londeltasize']/2)) . "," . ($testRegion['lat'] - ($testRegion['latdeltasize']/2)).",0\n".  
($testRegion['lon'] - ($testRegion['londeltasize']/2)) . "," . ($testRegion['lat'] - ($testRegion['latdeltasize']/2)).",0\n".  
"  
</coordinates> </coordinates>
</LinearRing> </LinearRing>
</outerBoundaryIs> </outerBoundaryIs>
</Polygon> </Polygon>
</Placemark>"; </Placemark>";
} }
echo "\n</Document></kml>\n"; echo "\n</Document></kml>\n";
} }
if ($csv) echo "</pre>"; if ($csv) echo "</pre>";
   
?> ?>