Parallelise http transfers for trip planner tester
Parallelise http transfers for trip planner tester

<?php <?php
// http://www.herethere.net/~samson/php/color_gradient/color_gradient_generator.php.txt // http://www.herethere.net/~samson/php/color_gradient/color_gradient_generator.php.txt
// return the interpolated value between pBegin and pEnd // return the interpolated value between pBegin and pEnd
function interpolate($pBegin, $pEnd, $pStep, $pMax) function interpolate($pBegin, $pEnd, $pStep, $pMax)
{ {
if ($pBegin < $pEnd) { if ($pBegin < $pEnd) {
return (($pEnd - $pBegin) * ($pStep / $pMax)) + $pBegin; return (($pEnd - $pBegin) * ($pStep / $pMax)) + $pBegin;
} }
else { else {
return (($pBegin - $pEnd) * (1 - ($pStep / $pMax))) + $pEnd; 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) function Gradient($HexFrom, $HexTo, $ColorSteps)
{ {
$theColorBegin = hexdec($HexFrom); $theColorBegin = hexdec($HexFrom);
$theColorEnd = hexdec($HexTo); $theColorEnd = hexdec($HexTo);
$theNumSteps = intval($ColorSteps); $theNumSteps = intval($ColorSteps);
$theR0 = ($theColorBegin & 0xff0000) >> 16; $theR0 = ($theColorBegin & 0xff0000) >> 16;
$theG0 = ($theColorBegin & 0x00ff00) >> 8; $theG0 = ($theColorBegin & 0x00ff00) >> 8;
$theB0 = ($theColorBegin & 0x0000ff) >> 0; $theB0 = ($theColorBegin & 0x0000ff) >> 0;
$theR1 = ($theColorEnd & 0xff0000) >> 16; $theR1 = ($theColorEnd & 0xff0000) >> 16;
$theG1 = ($theColorEnd & 0x00ff00) >> 8; $theG1 = ($theColorEnd & 0x00ff00) >> 8;
$theB1 = ($theColorEnd & 0x0000ff) >> 0; $theB1 = ($theColorEnd & 0x0000ff) >> 0;
$GradientColors = array(); $GradientColors = array();
// generate gradient swathe now // generate gradient swathe now
for ($i = 0; $i <= $theNumSteps; $i++) { for ($i = 0; $i <= $theNumSteps; $i++) {
$theR = interpolate($theR0, $theR1, $i, $theNumSteps); $theR = interpolate($theR0, $theR1, $i, $theNumSteps);
$theG = interpolate($theG0, $theG1, $i, $theNumSteps); $theG = interpolate($theG0, $theG1, $i, $theNumSteps);
$theB = interpolate($theB0, $theB1, $i, $theNumSteps); $theB = interpolate($theB0, $theB1, $i, $theNumSteps);
$theVal = ((($theR << 8) | $theG) << 8) | $theB; $theVal = ((($theR << 8) | $theG) << 8) | $theB;
$GradientColors[] = sprintf("%06X", $theVal); $GradientColors[] = sprintf("%06X", $theVal);
} }
return $GradientColors; return $GradientColors;
} }
function processLeg($legNumber, $leg) function processLeg($legNumber, $leg)
{ {
$legArray = object2array($leg); $legArray = object2array($leg);
if ($legArray["@mode"] === "BUS") { if ($legArray["@mode"] === "BUS") {
return "bus {$legArray['@route']} " . str_replace("To", "towards", $legArray['@headsign']); return "bus {$legArray['@route']} " . str_replace("To", "towards", $legArray['@headsign']);
} }
else { else {
return "walk"; return "walk";
//$walkingstep = "walk "; //$walkingstep = "walk ";
//if (strpos($step->streetName, "from") !== false && strpos($step->streetName, "way") !== false) { //if (strpos($step->streetName, "from") !== false && strpos($step->streetName, "way") !== false) {
// $walkingstep.= "footpath"; // $walkingstep.= "footpath";
//} //}
//else { //else {
// $walkingstep.= $step->streetName; // $walkingstep.= $step->streetName;
//} //}
//$walkingstep.= floor($step->distance) . "m"; //$walkingstep.= floor($step->distance) . "m";
//return $walkingstep; //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.1928, "startlat" => - 35.1928,
"startlon" => 149.006, "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.1828, "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.01; $latdeltasize = 0.01;
$londeltasize = 0.01; $londeltasize = 0.01;
$from = "Wattle Street"; $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 = "03/21/2011"; // american dates, OTP does not validate! $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=440&wheelchair=false&toPlace=" . $i . "," . $j . "&fromPlace=$fromPlace"; $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);  
$plans = Array();  
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 "$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);  
}  
if (isset($tripplan->error) && $tripplan->error->id == 404) {  
$time = 999;  
$plan = "Trip not possible without excessive walking from nearest bus stop";  
}  
$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(); @ob_flush();  
curl_close($ch);  
}  
}  
}  
if ($kml) { if ($kml) {
$colorSteps = 9; $colorSteps = 9;
//$minTime = min($regionTimes); //$minTime = min($regionTimes);
//$maxTime = max($regionTimes); //$maxTime = max($regionTimes);
//$rangeTime = $maxTime - $minTime; //$rangeTime = $maxTime - $minTime;
//$deltaTime = $rangeTime / $colorSteps; //$deltaTime = $rangeTime / $colorSteps;
$Gradients = Gradient(strrev("66FF00"), strrev("FF0000"), $colorSteps); // KML is BGR not RGB so strrev $Gradients = Gradient(strrev("66FF00") , strrev("FF0000") , $colorSteps); // KML is BGR not RGB so strrev
foreach ($testRegions as $testRegion) { foreach ($testRegions as $testRegion) {
//$band = (floor(($testRegion[time] - $minTime) / $deltaTime)); //$band = (floor(($testRegion[time] - $minTime) / $deltaTime));
$band = (floor($testRegion[time] / 10)); $band = (floor($testRegion[time] / 10));
if ($band > $colorSteps) $band = $colorSteps; if ($band > $colorSteps) $band = $colorSteps;
echo "<Placemark> echo "<Placemark>
<name>" . $testRegion['regionname'] . " time {$testRegion['time']} band $band</name> <name>" . $testRegion['regionname'] . " time {$testRegion['time']} band $band</name>
<description> {$testRegion['plan']} </description> <description> {$testRegion['plan']} </description>
<Style> <Style>
<PolyStyle> <PolyStyle>
<color>c7" . $Gradients[$band] . "</color>" . // 7f = 50% alpha, c7=78% <color>c7" . $Gradients[$band] . "</color>" . // 7f = 50% alpha, c7=78%
"</PolyStyle> "</PolyStyle>
<LineStyle> <LineStyle>
<color>c7" . $Gradients[$band] . "</color>" . "</LineStyle> <color>c7" . $Gradients[$band] . "</color>" . "</LineStyle>
</Style> </Style>
<Polygon> <Polygon>
<altitudeMode>relativeToGround</altitudeMode> <altitudeMode>relativeToGround</altitudeMode>
<outerBoundaryIs> <outerBoundaryIs>
<LinearRing> <LinearRing>
<coordinates> <coordinates>
" . ($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)) . ",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" . "
</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>";
?> ?>
   
  K 25
  svn:wc:ra_dav:version-url
  V 22
  /svn/!svn/ver/20/trunk
  END
  RollingCurlGroup.php
  K 25
  svn:wc:ra_dav:version-url
  V 43
  /svn/!svn/ver/20/trunk/RollingCurlGroup.php
  END
  example_groups.php
  K 25
  svn:wc:ra_dav:version-url
  V 41
  /svn/!svn/ver/20/trunk/example_groups.php
  END
  example.php
  K 25
  svn:wc:ra_dav:version-url
  V 34
  /svn/!svn/ver/20/trunk/example.php
  END
  RollingCurl.php
  K 25
  svn:wc:ra_dav:version-url
  V 38
  /svn/!svn/ver/20/trunk/RollingCurl.php
  END
  CHANGELOG.txt
  K 25
  svn:wc:ra_dav:version-url
  V 36
  /svn/!svn/ver/20/trunk/CHANGELOG.txt
  END
  README.txt
  K 25
  svn:wc:ra_dav:version-url
  V 33
  /svn/!svn/ver/20/trunk/README.txt
  END
 
</
  10
 
  dir
  20
  http://rolling-curl.googlecode.com/svn/trunk
  http://rolling-curl.googlecode.com/svn
 
 
 
  2010-09-12T20:39:22.711474Z
  20
  alexander.makarow
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  74aa2acc-2e27-11de-b2a4-4f96ceaaac44
 
  RollingCurlGroup.php
  file
 
 
 
 
  2011-04-10T08:32:48.081650Z
  73c08d9e9e24b4adc89816624c7aca30
  2010-09-12T20:39:22.711474Z
  20
  alexander.makarow
  has-props