Merge branch 'master' of github.com:maxious/ACTBus-ui
[busui.git] / labs / tripPlannerTester.kml.php
















































































































































































































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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
<?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($md['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;
$kml = true;
$gearthcolors = false;
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');
$boundingBoxes = Array(
        "belconnen" => Array(
                "startlat" => - 35.1928,
                "startlon" => 149.006,
                "finishlat" => - 35.2630,
                "finishlon" => 149.1045,
        ) ,
        "north gungahlin civic" => Array(
                "startlat" => - 35.1828,
                "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.005;
$londeltasize = 0.005;
$from = "Wattle Street";
$fromPlace = (startsWith($from, "-") ? $from : geocode($from, false));
$startTime = "9:00 am";
$startDate = "03/21/2011"; // american dates, OTP does not validate!
$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 ($kml) echo "<name> $from at $startTime on $startDate </name>";
if ($csv) echo "<pre>";
if ($csv) echo "lat,lon,time,latdeltasize, londeltasize, region key name\n";
$rc = new RollingCurl("processResult_cb");
$rc->window_size = 2;
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=440&wheelchair=false&toPlace=" . $i . "," . $j . "&fromPlace=$fromPlace";
                        //debug($url);
                        $request = new RollingCurlRequest($url);
                        $request->headers = Array(
                                "Accept: application/json"
                        );
                        $request->metadata = Array( "i" => $i, "j" => $j, "key" => $key, "url" => $url);
                        $rc->add($request);
                }
        }
}
$rc->execute();
if ($kml) {
        $colorSteps = 9;
        //$minTime = min($regionTimes);
        //$maxTime = max($regionTimes);
        //$rangeTime = $maxTime - $minTime;
        //$deltaTime = $rangeTime / $colorSteps;
        $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));
                if ($band > $colorSteps) $band = $colorSteps;
                echo "<Placemark>
  <name>" . $testRegion['regionname'] . " time {$testRegion['time']} band $band</name>
  <description> <![CDATA[ {$testRegion['plan']}  ]]> </description>
    <Style>
        <PolyStyle>
            <color>c7" . $Gradients[$band] . "</color>" . // 7f = 50% alpha, c7=78%
                "</PolyStyle>
        <LineStyle>
            <color>c7" . $Gradients[$band] . "</color>" . "</LineStyle>
    </Style>
   <Polygon>
<altitudeMode>relativeToGround</altitudeMode>
    <outerBoundaryIs>
      <LinearRing>
        <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" . "
          
        </coordinates>
      </LinearRing>
    </outerBoundaryIs>
  </Polygon>
</Placemark>";
        }
        echo "\n</Document></kml>\n";
}
if ($csv) echo "</pre>";
?>