1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 | <?php $csv = false; $kml = true; if ($kml) { header('Content-Type: application/vnd.google-earth.kml+xml'); echo '<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"><Document>'; } include ('../include/common.inc.php'); //Test code to grab transit times // make sure to sleep(10); $boundingBoxes = Array( "belconnen" => Array( "startlat" => - 35.1828, "startlon" => 149.0295, "finishlat" => - 35.2630, "finishlon" => 149.1045, ) , "north gungahlin civic" => Array( "startlat" => - 35.2652, "startlon" => 149.1045, "finishlat" => -35.2955, "finishlon" => 149.1559, ) , "west duffy" => Array( "startlat" => - 35.3252, "startlon" => 149.0240, "finishlat" => - 35.3997, "finishlon" => 149.0676, ) , "central south" => Array( "startlat" => - 35.3042, "startlon" => 149.0762, "finishlat" => - 35.3370, "finishlon" => 149.1806, ) , "south" => Array( "startlat" => - 35.3403, "startlon" => 149.0714, "finishlat" => - 35.4607, "finishlon" => 149.1243, ) ); $latdeltasize = 0.025; $londeltasize = 0.025; $from = "Barry Drive"; $fromPlace = (startsWith($from, "-") ? $from : geocode($from, false)); $startTime = "9:00 am"; $startDate = "21/03/2011"; $counter = 0; $regionTimes = 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"; if ($csv) echo "<pre>"; if ($csv) echo "lat,lon,time,latdeltasize, londeltasize, region key name\n"; foreach ($boundingBoxes as $key => $boundingBox) { for ($i = $boundingBox['startlat']; $i >= $boundingBox['finishlat']; $i-= $latdeltasize) { 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="; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_HTTPHEADER, array( "Accept: application/json" )); curl_setopt($ch, CURLOPT_TIMEOUT, 5); $page = curl_exec($ch); if (curl_errno($ch)) { if ($csv) echo "Trip planner temporarily unavailable: " . curl_errno($ch) . " " . curl_error($ch); } else { $tripplan = json_decode($page); if (isset($tripplan->error)) var_dump($tripplan->error); $times = Array(); if (is_array($tripplan->plan->itineraries->itinerary)) { foreach ($tripplan->plan->itineraries->itinerary as $itineraryNumber => $itinerary) { $times[] = floor($itinerary->duration / 60000); } } else { $times[] = floor($tripplan->plan->itineraries->itinerary->duration / 60000); } if ($csv) echo "$i,$j," . min($times) . ",$latdeltasize, $londeltasize,$key\n"; } 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> <PolyStyle> <color>7f".$Gradients[$band]."</color>". // 7f = 50% alpha "</PolyStyle> </Style> <Polygon> <extrude>1</extrude> <altitudeMode>relativeToGround</altitudeMode> <outerBoundaryIs> <LinearRing> <coordinates> ". ($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". ($testRegion['lon'] - ($testRegion['londeltasize']/2)) . "," . ($testRegion['lat'] - ($testRegion['latdeltasize']/2)).",0\n". " </coordinates> </LinearRing> </outerBoundaryIs> </Polygon> </Placemark>"; } echo "\n</Document></kml>\n"; } if ($csv) echo "</pre>"; ?> |