More trip planner testing with colors
[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;
  }
  }
  require ("../lib/rolling-curl/RollingCurl.php");
  function processResult_cb($response, $info, $request)
  {
  global $testRegions, $regionTimes,$csv,$kml, $latdeltasize,$londeltasize;
  $md = $request->metadata;
  $tripplan = json_decode($response);
  $plans = Array();
  //var_dump(Array($info, $request));
  if (is_array($tripplan->plan->itineraries->itinerary)) {
  foreach ($tripplan->plan->itineraries->itinerary as $itineraryNumber => $itinerary) {
  $plans[floor($itinerary->duration / 60000) ] = $itinerary;
  }
  }
  else {
  $plans[floor($tripplan->plan->itineraries->itinerary->duration / 60000) ] = $tripplan->plan->itineraries->itinerary;
  }
  if ($csv) echo "{$md['i']},{$md['j']}," . min(array_keys($plans)) . ",$latdeltasize, $londeltasize,{$md['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);
  }
  if (isset($tripplan->error) && $tripplan->error->id == 404) {
  $time = 999;
  $plan = "Trip not possible without excessive walking from nearest bus stop";
  }
  $testRegions[] = Array(
  "lat" => $md['i'],
  "lon" => $md['j'],
  "time" => $time,
  "latdeltasize" => $latdeltasize,
  "londeltasize" => $londeltasize,
  "regionname" => $md['key'],
  "plan" => $plan . "<br/><a href='" . htmlspecialchars($url) . "'>original plan</a>"
  );
  $regionTimes[] = $time;
  }
  }
  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  
// make sure to sleep(10);  
$boundingBoxes = Array( $boundingBoxes = Array(
"belconnen" => Array( "belconnen" => Array(
"startlat" => - 35.1828, "startlat" => - 35.1928,
"startlon" => 149.0295, "startlon" => 149.006,
"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";
  $rc = new RollingCurl("processResult_cb");
  $rc->window_size = 3;
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); $request = new RollingCurlRequest($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $request->headers = Array(
curl_setopt($ch, CURLOPT_HEADER, 0);  
curl_setopt($ch, CURLOPT_HTTPHEADER, array(  
"Accept: application/json" "Accept: application/json"
)); );
curl_setopt($ch, CURLOPT_TIMEOUT, 5); $request->metadata = Array( "i" => $i, "j" => $j, "key" => $key);
$page = curl_exec($ch); $rc->add($request);
if (curl_errno($ch)) { }
if ($csv) echo "Trip planner temporarily unavailable: " . curl_errno($ch) . " " . curl_error($ch); }
} }
else { $rc->execute();
$tripplan = json_decode($page); if ($kml) {
if (isset($tripplan->error)) var_dump($tripplan->error); $colorSteps = 9;
$times = Array(); //$minTime = min($regionTimes);
if (is_array($tripplan->plan->itineraries->itinerary)) { //$maxTime = max($regionTimes);
  //$rangeTime = $maxTime - $minTime;
foreach ($tripplan->plan->itineraries->itinerary as $itineraryNumber => $itinerary) { //$deltaTime = $rangeTime / $colorSteps;
$times[] = floor($itinerary->duration / 60000); $Gradients = Gradient(strrev("66FF00") , strrev("FF0000") , $colorSteps); // KML is BGR not RGB so strrev
} foreach ($testRegions as $testRegion) {
  //$band = (floor(($testRegion[time] - $minTime) / $deltaTime));
} $band = (floor($testRegion[time] / 10));
else { if ($band > $colorSteps) $band = $colorSteps;
$times[] = floor($tripplan->plan->itineraries->itinerary->duration / 60000); echo "<Placemark>
} <name>" . $testRegion['regionname'] . " time {$testRegion['time']} band $band</name>
if ($csv) echo "$i,$j," . min($times) . ",$latdeltasize, $londeltasize,$key\n"; <description> {$testRegion['plan']} </description>
}  
flush();  
ob_flush();  
curl_close($ch);  
$testRegions[] = Array ("lat" => $i, "lon" => $j, "time" => min($times), "latdeltasize" => $latdeltasize, "londeltasize" => $londeltasize, "regionname" => $key);  
$regionTimes[] = min($times);  
break;  
}  
break;  
}  
}  
   
// http://www.geekpedia.com/code163_Generate-Gradient-Within-Hex-Range-In-PHP.html  
function Gradient($HexFrom, $HexTo, $ColorSteps)  
{  
$FromRGB['r'] = hexdec(substr($HexFrom, 0, 2));  
$FromRGB['g'] = hexdec(substr($HexFrom, 2, 2));  
$FromRGB['b'] = hexdec(substr($HexFrom, 4, 2));  
   
$ToRGB['r'] = hexdec(substr($HexTo, 0, 2));  
$ToRGB['g'] = hexdec(substr($HexTo, 2, 2));  
$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" . $Gradients[$band] . "</color>" . // 7f = 50% alpha, c7=78%
"</PolyStyle> "</PolyStyle>
  <LineStyle>
  <color>c7" . $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>";
   
?> ?>