More buffer flush while printing unsorted lists
More buffer flush while printing unsorted lists

<?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;
} }
} }
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 //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.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";
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); $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);
$plans = 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) {
$plans[floor($itinerary->duration / 60000) ] = $itinerary; $plans[floor($itinerary->duration / 60000) ] = $itinerary;
} }
} }
else { else {
$plans[floor($tripplan->plan->itineraries->itinerary->duration / 60000) ] = $tripplan->plan->itineraries->itinerary; $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 ($csv) echo "$i,$j," . min(array_keys($plans)) . ",$latdeltasize, $londeltasize,$key\n";
if ($kml) { if ($kml) {
$time = min(array_keys($plans)); $time = min(array_keys($plans));
$plan = ""; $plan = "";
if (is_array($plans[min(array_keys($plans)) ]->legs->leg)) { if (is_array($plans[min(array_keys($plans)) ]->legs->leg)) {
foreach ($plans[min(array_keys($plans)) ]->legs->leg as $legNumber => $leg) { foreach ($plans[min(array_keys($plans)) ]->legs->leg as $legNumber => $leg) {
$plan .= processLeg($legNumber, $leg).","; $plan .= processLeg($legNumber, $leg).",";
} }
} }
else { else {
$plan .= processLeg(0, $plans[min(array_keys($plans)) ]->legs->leg); $plan .= processLeg(0, $plans[min(array_keys($plans)) ]->legs->leg);
} }
if (isset($tripplan->error) && $tripplan->error->id == 404) { if (isset($tripplan->error) && $tripplan->error->id == 404) {
$time = 999; $time = 999;
$plan = "Trip not possible without excessive walking from nearest bus stop"; $plan = "Trip not possible without excessive walking from nearest bus stop";
} }
$testRegions[] = Array( $testRegions[] = Array(
"lat" => $i, "lat" => $i,
"lon" => $j, "lon" => $j,
"time" => $time, "time" => $time,
"latdeltasize" => $latdeltasize, "latdeltasize" => $latdeltasize,
"londeltasize" => $londeltasize, "londeltasize" => $londeltasize,
"regionname" => $key, "regionname" => $key,
"plan" => $plan . "<br/><a href='". htmlspecialchars($url)."'>original plan</a>" "plan" => $plan . "<br/><a href='". htmlspecialchars($url)."'>original plan</a>"
); );
$regionTimes[] = $time; $regionTimes[] = $time;
} }
} }
flush(); flush(); @ob_flush();
ob_flush();  
curl_close($ch); 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>";
?> ?>
   
#!/usr/bin/python2.5 #!/usr/bin/python2.5
   
# Copyright (C) 2007 Google Inc. # Copyright (C) 2007 Google Inc.
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
# You may obtain a copy of the License at # You may obtain a copy of the License at
# #
# http://www.apache.org/licenses/LICENSE-2.0 # http://www.apache.org/licenses/LICENSE-2.0
# #
# Unless required by applicable law or agreed to in writing, software # Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, # distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
   
""" """
An example application that uses the transitfeed module. An example application that uses the transitfeed module.
   
You must provide a Google Maps API key. You must provide a Google Maps API key.
""" """
   
   
import BaseHTTPServer, sys, urlparse import BaseHTTPServer, sys, urlparse
  from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
  from SocketServer import ThreadingMixIn
  import threading
import bisect import bisect
from gtfsscheduleviewer.marey_graph import MareyGraph from gtfsscheduleviewer.marey_graph import MareyGraph
import gtfsscheduleviewer import gtfsscheduleviewer
import mimetypes import mimetypes
import os.path import os.path
import re import re
import signal import signal
import simplejson import simplejson
import socket import socket
import time import time
import datetime import datetime
import transitfeed import transitfeed
from transitfeed import util from transitfeed import util
import urllib import urllib
   
   
# By default Windows kills Python with Ctrl+Break. Instead make Ctrl+Break # By default Windows kills Python with Ctrl+Break. Instead make Ctrl+Break
# raise a KeyboardInterrupt. # raise a KeyboardInterrupt.
if hasattr(signal, 'SIGBREAK'): if hasattr(signal, 'SIGBREAK'):
signal.signal(signal.SIGBREAK, signal.default_int_handler) signal.signal(signal.SIGBREAK, signal.default_int_handler)
   
   
mimetypes.add_type('text/plain', '.vbs') mimetypes.add_type('text/plain', '.vbs')
   
   
class ResultEncoder(simplejson.JSONEncoder): class ResultEncoder(simplejson.JSONEncoder):
def default(self, obj): def default(self, obj):
try: try:
iterable = iter(obj) iterable = iter(obj)
except TypeError: except TypeError:
pass pass
else: else:
return list(iterable) return list(iterable)
return simplejson.JSONEncoder.default(self, obj) return simplejson.JSONEncoder.default(self, obj)
   
# Code taken from class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/425210/index_txt """Handle requests in a separate thread."""
# An alternate approach is shown at  
# http://mail.python.org/pipermail/python-list/2003-July/212751.html  
# but it requires multiple threads. A sqlite object can only be used from one  
# thread.  
class StoppableHTTPServer(BaseHTTPServer.HTTPServer):  
def server_bind(self):  
BaseHTTPServer.HTTPServer.server_bind(self)  
self.socket.settimeout(1)  
self._run = True  
   
def get_request(self):  
while self._run:  
try:  
sock, addr = self.socket.accept()  
sock.settimeout(None)  
return (sock, addr)  
except socket.timeout:  
pass  
   
def stop(self):  
self._run = False  
   
def serve(self):  
while self._run:  
self.handle_request()  
   
   
def StopToTuple(stop): def StopToTuple(stop):
"""Return tuple as expected by javascript function addStopMarkerFromList""" """Return tuple as expected by javascript function addStopMarkerFromList"""
return (stop.stop_id, stop.stop_name, float(stop.stop_lat), return (stop.stop_id, stop.stop_name, float(stop.stop_lat),
float(stop.stop_lon), stop.location_type, stop.stop_code) float(stop.stop_lon), stop.location_type, stop.stop_code)
def StopZoneToTuple(stop): def StopZoneToTuple(stop):
"""Return tuple as expected by javascript function addStopMarkerFromList""" """Return tuple as expected by javascript function addStopMarkerFromList"""
return (stop.stop_id, stop.stop_name, float(stop.stop_lat), return (stop.stop_id, stop.stop_name, float(stop.stop_lat),
float(stop.stop_lon), stop.location_type, stop.stop_code, stop.zone_id) float(stop.stop_lon), stop.location_type, stop.stop_code, stop.zone_id)
   
class ScheduleRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): class ScheduleRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
cache = {} cache = {}
def do_GET(self): def do_GET(self):
scheme, host, path, x, params, fragment = urlparse.urlparse(self.path) scheme, host, path, x, params, fragment = urlparse.urlparse(self.path)
parsed_params = {} parsed_params = {}
for k in params.split('&'): for k in params.split('&'):
k = urllib.unquote(k) k = urllib.unquote(k)
if '=' in k: if '=' in k:
k, v = k.split('=', 1) k, v = k.split('=', 1)
parsed_params[k] = unicode(v, 'utf8') parsed_params[k] = unicode(v, 'utf8')
else: else:
parsed_params[k] = '' parsed_params[k] = ''
   
if path == '/': if path == '/':
return self.handle_GET_home() return self.handle_GET_home()
   
m = re.match(r'/json/([a-z]{1,64})', path) m = re.match(r'/json/([a-z]{1,64})', path)
if m: if m:
handler_name = 'handle_json_GET_%s' % m.group(1) handler_name = 'handle_json_GET_%s' % m.group(1)
handler = getattr(self, handler_name, None) handler = getattr(self, handler_name, None)
if callable(handler): if callable(handler):
return self.handle_json_wrapper_GET(handler, parsed_params, handler_name) return self.handle_json_wrapper_GET(handler, parsed_params, handler_name)
   
# Restrict allowable file names to prevent relative path attacks etc # Restrict allowable file names to prevent relative path attacks etc
m = re.match(r'/file/([a-z0-9_-]{1,64}\.?[a-z0-9_-]{1,64})$', path) m = re.match(r'/file/([a-z0-9_-]{1,64}\.?[a-z0-9_-]{1,64})$', path)
if m and m.group(1): if m and m.group(1):
try: try: