<?php | <?php |
/* | /* |
* Copyright 2010,2011 Alexander Sadleir | * Copyright 2010,2011 Alexander Sadleir |
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. |
*/ | */ |
// SELECT array_to_string(array(SELECT REPLACE(name_2006, ',', '\,') as name FROM suburbs order by name), ',') | // SELECT array_to_string(array(SELECT REPLACE(name_2006, ',', '\,') as name FROM suburbs order by name), ',') |
$suburbs = explode(',', 'Acton,Ainslie,Amaroo,Aranda,Banks,Barton,Belconnen,Bonner,Bonython,Braddon,Bruce,Calwell,Campbell,Chapman,Charnwood,Chifley,Chisholm,City,Conder,Cook,Curtin,Deakin,Dickson,Downer,Duffy,Dunlop,Evatt,Fadden,Farrer,Fisher,Florey,Flynn,Forrest,Franklin,Fraser,Fyshwick,Garran,Gilmore,Giralang,Gordon,Gowrie,Greenway,Griffith,Gungahlin,Hackett,Hall,Harrison,Hawker,Higgins,Holder,Holt,Hughes,Hume,Isaacs,Isabella Plains,Kaleen,Kambah,Kingston,Latham,Lawson,Lyneham,Lyons,Macarthur,Macgregor,Macquarie,Mawson,McKellar,Melba,Mitchell,Monash,Narrabundah,Ngunnawal,Nicholls,Oaks Estate,O\'Connor,O\'Malley,Oxley,Page,Palmerston,Parkes,Pearce,Phillip,Pialligo,Red Hill,Reid,Richardson,Rivett,Russell,Scullin,Spence,Stirling,Symonston,Tharwa,Theodore,Torrens,Turner,Wanniassa,Waramanga,Watson,Weetangera,Weston,Yarralumla'); | $suburbs = explode(',', 'Acton,Ainslie,Amaroo,Aranda,Banks,Barton,Belconnen,Bonner,Bonython,Braddon,Bruce,Calwell,Campbell,Chapman,Charnwood,Chifley,Chisholm,City,Conder,Cook,Curtin,Deakin,Dickson,Downer,Duffy,Dunlop,Evatt,Fadden,Farrer,Fisher,Florey,Flynn,Forrest,Franklin,Fraser,Fyshwick,Garran,Gilmore,Giralang,Gordon,Gowrie,Greenway,Griffith,Gungahlin,Hackett,Hall,Harrison,Hawker,Higgins,Holder,Holt,Hughes,Hume,Isaacs,Isabella Plains,Kaleen,Kambah,Kingston,Latham,Lawson,Lyneham,Lyons,Macarthur,Macgregor,Macquarie,Mawson,McKellar,Melba,Mitchell,Monash,Narrabundah,Ngunnawal,Nicholls,Oaks Estate,O\'Connor,O\'Malley,Oxley,Page,Palmerston,Parkes,Pearce,Phillip,Pialligo,Red Hill,Reid,Richardson,Rivett,Russell,Scullin,Spence,Stirling,Symonston,Tharwa,Theodore,Torrens,Turner,Wanniassa,Waramanga,Watson,Weetangera,Weston,Yarralumla'); |
function staticmap($mapPoints, $collapsible = true, $twotone = false, $path = false, $numbered = false) { | function staticmap($mapPoints, $collapsible = true, $twotone = false, $path = false, $numbered = false) { |
$markers = ''; | $markers = ''; |
$height = 300; | $height = 300; |
$width = $height; | $width = $height; |
$index = 0; | $index = 0; |
if (sizeof($mapPoints) < 1) | if (sizeof($mapPoints) < 1) |
return 'map error'; | return 'map error'; |
if (sizeof($mapPoints) === 1) { | if (sizeof($mapPoints) === 1) { |
$markers = 'markers={$mapPoints[0][0]},{$mapPoints[0][1]}'; | $markers = 'markers='.$mapPoints[0][0].','.$mapPoints[0][1]; |
} else { | } else { |
if (!$numbered) { | if (!$numbered) { |
$markers = 'markers='; | $markers = 'markers='; |
} | } |
if ($path) { | if ($path) { |
$markers.= 'markers={$mapPoints[0][0]},{$mapPoints[0][1]}&path='; | $markers.= 'markers='.$mapPoints[0][0].','.$mapPoints[0][1].'&path='; |
} | } |
foreach ($mapPoints as $index => $mapPoint) { | foreach ($mapPoints as $index => $mapPoint) { |
if ($twotone && $index == 0) { | if ($twotone && $index == 0) { |
$markers = 'markerd=color:red|' . $mapPoint[0] . ',' . $mapPoint[1] . '&markers='; | $markers = 'markerd=color:red|' . $mapPoint[0] . ',' . $mapPoint[1] . '&markers='; |
} else { | } else { |
if ($numbered) { | if ($numbered) { |
$label = ($index > 9 ? 9 : $index); | $label = ($index > 9 ? 9 : $index); |
$markers.= 'markers=label:' . $label . '|' . $mapPoint[0] . ',' . $mapPoint[1]; | $markers.= 'markers=label:' . $label . '|' . $mapPoint[0] . ',' . $mapPoint[1]; |
if ($index + 1 != sizeof($mapPoints)) { | if ($index + 1 != sizeof($mapPoints)) { |
$markers.= '&'; | $markers.= '&'; |
} | } |
} else { | } else { |
$markers.= $mapPoint[0] . ',' . $mapPoint[1]; | $markers.= $mapPoint[0] . ',' . $mapPoint[1]; |
if ($index + 1 != sizeof($mapPoints)) { | if ($index + 1 != sizeof($mapPoints)) { |
$markers.= '|'; | $markers.= '|'; |
} | } |
} | } |
$index++; | $index++; |
} | } |
} | } |
} | } |
$output = ''; | $output = ''; |
if ($collapsible) | if ($collapsible) |
$output.= '<div class="map" data-role="collapsible" data-collapsed="true"><h3>Open Map...</h3>'; | $output.= '<div class="map" data-role="collapsible" data-collapsed="true"><h3>Open Map...</h3>'; |
if (isIOSDevice()) | if (isIOSDevice()) |
$output.= '<img class="hiresmap" src="http://maps.googleapis.com/maps/api/staticmap?size=' . $width . 'x' . $height . '&' . $markers . '&scale=2&sensor=true" width=' . $width . ' height=' . $height . '" alt="map of stop location">'; | $output.= '<img class="hiresmap" src="http://maps.googleapis.com/maps/api/staticmap?size=' . $width . 'x' . $height . '&' . $markers . '&scale=2&sensor=true" width=' . $width . ' height=' . $height . '" alt="map of stop location">'; |
else | else |
$output.= '<img class="lowresmap" src="http://maps.googleapis.com/maps/api/staticmap?size=' . $width . 'x' . $height . '&' . $markers . '&scale=1&format=jpg&sensor=true" width=' . $width . ' height=' . $height . '" alt="map of stop location">'; | $output.= '<img class="lowresmap" src="http://maps.googleapis.com/maps/api/staticmap?size=' . $width . 'x' . $height . '&' . $markers . '&scale=1&format=jpg&sensor=true" width=' . $width . ' height=' . $height . '" alt="map of stop location">'; |
if ($collapsible) | if ($collapsible) |
$output.= '</div>'; | $output.= '</div>'; |
return $output; | return $output; |
} | } |
function distance($lat1, $lng1, $lat2, $lng2, $roundLargeValues = false) { | function distance($lat1, $lng1, $lat2, $lng2, $roundLargeValues = false) { |
$pi80 = M_PI / 180; | $pi80 = M_PI / 180; |
$lat1*= $pi80; | $lat1*= $pi80; |
$lng1*= $pi80; | $lng1*= $pi80; |
$lat2*= $pi80; | $lat2*= $pi80; |
$lng2*= $pi80; | $lng2*= $pi80; |
$r = 6372.797; // mean radius of Earth in km | $r = 6372.797; // mean radius of Earth in km |
$dlat = $lat2 - $lat1; | $dlat = $lat2 - $lat1; |
$dlng = $lng2 - $lng1; | $dlng = $lng2 - $lng1; |
$a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlng / 2) * sin($dlng / 2); | $a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlng / 2) * sin($dlng / 2); |
$c = 2 * atan2(sqrt($a), sqrt(1 - $a)); | $c = 2 * atan2(sqrt($a), sqrt(1 - $a)); |
$km = $r * $c; | $km = $r * $c; |
if ($roundLargeValues) { | if ($roundLargeValues) { |
if ($km < 1) | if ($km < 1) |
return floor($km * 1000); | return floor($km * 1000); |
else | else |
return round($km, 2) . 'k'; | return round($km, 2) . 'k'; |
} | } |
else | else |
return floor($km * 1000); | return floor($km * 1000); |
} | } |
function decodePolylineToArray($encoded) { | function decodePolylineToArray($encoded) { |
// source: http://latlongeeks.com/forum/viewtopic.php?f=4&t=5 | // source: http://latlongeeks.com/forum/viewtopic.php?f=4&t=5 |
$length = strlen($encoded); | $length = strlen($encoded); |
$index = 0; | $index = 0; |
$points = array(); | $points = array(); |
$lat = 0; | $lat = 0; |
$lng = 0; | $lng = 0; |
while ($index < $length) { | while ($index < $length) { |
// Temporary variable to hold each ASCII byte. | // Temporary variable to hold each ASCII byte. |
$b = 0; | $b = 0; |
// The encoded polyline consists of a latitude value followed by a | // The encoded polyline consists of a latitude value followed by a |
// longitude value. They should always come in pairs. Read the | // longitude value. They should always come in pairs. Read the |
// latitude value first. | // latitude value first. |
$shift = 0; | $shift = 0; |
$result = 0; | $result = 0; |
do { | do { |
// The `ord(substr($encoded, $index++))` statement returns the ASCII | // The `ord(substr($encoded, $index++))` statement returns the ASCII |
// code for the character at $index. Subtract 63 to get the original | // code for the character at $index. Subtract 63 to get the original |
// value. (63 was added to ensure proper ASCII characters are displayed | // value. (63 was added to ensure proper ASCII characters are displayed |
// in the encoded polyline string, which is `human` readable) | // in the encoded polyline string, which is `human` readable) |
$b = ord(substr($encoded, $index++)) - 63; | $b = ord(substr($encoded, $index++)) - 63; |
// AND the bits of the byte with 0x1f to get the original 5-bit `chunk. | // AND the bits of the byte with 0x1f to get the original 5-bit `chunk. |
// Then left shift the bits by the required amount, which increases | // Then left shift the bits by the required amount, which increases |
// by 5 bits each time. | // by 5 bits each time. |
// OR the value into $results, which sums up the individual 5-bit chunks | // OR the value into $results, which sums up the individual 5-bit chunks |
// into the original value. Since the 5-bit chunks were reversed in | // into the original value. Since the 5-bit chunks were reversed in |
// order during encoding, reading them in this way ensures proper | // order during encoding, reading them in this way ensures proper |
// summation. | // summation. |
$result|= ($b & 0x1f) << $shift; | $result|= ($b & 0x1f) << $shift; |
$shift+= 5; | $shift+= 5; |
} | } |
// Continue while the read byte is >= 0x20 since the last `chunk` | // Continue while the read byte is >= 0x20 since the last `chunk` |
// was not OR'd with 0x20 during the conversion process. (Signals the end) | // was not OR'd with 0x20 during the conversion process. (Signals the end) |
while ($b >= 0x20); | while ($b >= 0x20); |
// Check if negative, and convert. (All negative values have the last bit | // Check if negative, and convert. (All negative values have the last bit |
// set) | // set) |
$dlat = (($result & 1) ? ~($result >> 1) : ($result >> 1)); | $dlat = (($result & 1) ? ~($result >> 1) : ($result >> 1)); |
// Compute actual latitude since value is offset from previous value. | // Compute actual latitude since value is offset from previous value. |
$lat+= $dlat; | $lat+= $dlat; |
// The next values will correspond to the longitude for this point. | // The next values will correspond to the longitude for this point. |
$shift = 0; | $shift = 0; |
$result = 0; | $result = 0; |
do { | do { |
$b = ord(substr($encoded, $index++)) - 63; | $b = ord(substr($encoded, $index++)) - 63; |
$result|= ($b & 0x1f) << $shift; | $result|= ($b & 0x1f) << $shift; |
$shift+= 5; | $shift+= 5; |
} while ($b >= 0x20); | } while ($b >= 0x20); |
$dlng = (($result & 1) ? ~($result >> 1) : ($result >> 1)); | $dlng = (($result & 1) ? ~($result >> 1) : ($result >> 1)); |
$lng+= $dlng; | $lng+= $dlng; |
// The actual latitude and longitude values were multiplied by | // The actual latitude and longitude values were multiplied by |
// 1e5 before encoding so that they could be converted to a 32-bit | // 1e5 before encoding so that they could be converted to a 32-bit |
// integer representation. (With a decimal accuracy of 5 places) | // integer representation. (With a decimal accuracy of 5 places) |
// Convert back to original values. | // Convert back to original values. |
$points[] = array( | $points[] = array( |
$lat * 1e-5, | $lat * 1e-5, |
$lng * 1e-5 | $lng * 1e-5 |
); | ); |
} | } |
return $points; | return $points; |
} | } |
function geocode($query, $giveOptions) { | function geocode($query, $giveOptions) { |
global $cloudmadeAPIkey; | global $cloudmadeAPIkey; |
$url = 'http://geocoding.cloudmade.com/$cloudmadeAPIkey/geocoding/v2/find.js?query=' . urlencode($query) . '&bbox=-35.5,149.00,-35.15,149.1930&return_location=true&bbox_only=true'; | $url = 'http://geocoding.cloudmade.com/$cloudmadeAPIkey/geocoding/v2/find.js?query=' . urlencode($query) . '&bbox=-35.5,149.00,-35.15,149.1930&return_location=true&bbox_only=true'; |
$contents = json_decode(getPage($url)); | $contents = json_decode(getPage($url)); |
if ($giveOptions) | if ($giveOptions) |
return $contents->features; | return $contents->features; |
elseif (isset($contents->features[0]->centroid)) | elseif (isset($contents->features[0]->centroid)) |
return $contents->features[0]->centroid->coordinates[0] . ',' . $contents->features[0]->centroid->coordinates[1]; | return $contents->features[0]->centroid->coordinates[0] . ',' . $contents->features[0]->centroid->coordinates[1]; |
else | else |
return ''; | return ''; |
} | } |
function reverseGeocode($lat, $lng) { | function reverseGeocode($lat, $lng) { |
global $cloudmadeAPIkey; | global $cloudmadeAPIkey; |
$url = 'http://geocoding.cloudmade.com/$cloudmadeAPIkey/geocoding/v2/find.js?around=' . $lat . ',' . $lng . '&distance=closest&object_type=road'; | $url = 'http://geocoding.cloudmade.com/$cloudmadeAPIkey/geocoding/v2/find.js?around=' . $lat . ',' . $lng . '&distance=closest&object_type=road'; |
$contents = json_decode(getPage($url)); | $contents = json_decode(getPage($url)); |
return $contents->features[0]->properties->name; | return $contents->features[0]->properties->name; |
} | } |
<?php | <?php |
/* | /* |
* Copyright 2010,2011 Alexander Sadleir | * Copyright 2010,2011 Alexander Sadleir |
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. |
*/ | */ |
$service_periods = Array( | $service_periods = Array( |
'sunday', | 'sunday', |
'saturday', | 'saturday', |
'weekday' | 'weekday' |
); | ); |
function service_period($date = '') { | function service_period($date = '') { |
if (isset($_REQUEST['service_period'])) { | if (isset($_REQUEST['service_period'])) { |
return $_REQUEST['service_period']; | return $_REQUEST['service_period']; |
} | } |
$override = getServiceOverride($date); | $override = getServiceOverride($date); |
if (isset($override['service_id'])) { | if (isset($override['service_id'])) { |
return strtolower($override['service_id']); | return strtolower($override['service_id']); |
} | } |
$date = ($date != '' ? $date : time()); | $date = ($date != '' ? $date : time()); |
$dow = date('w', $date); | $dow = date('w', $date); |
switch ($dow) { | switch ($dow) { |
case 0: | case 0: |
return 'sunday'; | return 'sunday'; |
case 6: | case 6: |
return 'saturday'; | return 'saturday'; |
default: | default: |
return 'weekday'; | return 'weekday'; |
} | } |
} | } |
function service_ids($service_period, $date = '') { | function service_ids($service_period, $date = '') { |
switch ($service_period) { | switch ($service_period) { |
case 'sunday': | case 'sunday': |
return Array('Sunday', 'Sunday'); | return Array('Sunday', 'Sunday'); |
case 'saturday': | case 'saturday': |
return Array('Saturday', 'Saturday'); | return Array('Saturday', 'Saturday'); |
default: | default: |
$date = ($date != '' ? $date : time()); | $date = ($date != '' ? $date : time()); |
// school holidays | // school holidays |
$ymd = date('Ymd', $date); | $ymd = date('Ymd', $date); |
$dow = date('w', $date); | $dow = date('w', $date); |
if (intval($ymd) < '20120203' && $dow != 0 && $dow != 6) { | if (intval($ymd) < '20120427' && $dow != 0 && $dow != 6) { |
return Array('Weekday-SchoolVacation', 'Weekday-SchoolVacation'); | return Array('Weekday-SchoolVacation', 'Weekday-SchoolVacation'); |
} else { | } else { |
return Array('Weekday', 'Weekday'); | return Array('Weekday', 'Weekday'); |
} | } |
} | } |
} | } |
function valid_service_ids() { | function valid_service_ids() { |
return array_merge(service_ids(''), service_ids('saturday'), service_ids('sunday')); | return array_merge(service_ids(''), service_ids('saturday'), service_ids('sunday')); |
} | } |
function midnight_seconds($time = '') { | function midnight_seconds($time = '') { |
// from http://www.perturb.org/display/Perlfunc__Seconds_Since_Midnight.html | // from http://www.perturb.org/display/Perlfunc__Seconds_Since_Midnight.html |
if ($time != '') { | if ($time != '') { |
return (date('G', $time) * 3600) + (date('i', $time) * 60) + date('s', $time); | return (date('G', $time) * 3600) + (date('i', $time) * 60) + date('s', $time); |
} | } |
if (isset($_SESSION['time'])) { | if (isset($_SESSION['time'])) { |
$time = strtotime($_SESSION['time']); | $time = strtotime($_SESSION['time']); |
return (date('G', $time) * 3600) + (date('i', $time) * 60) + date('s', $time); | return (date('G', $time) * 3600) + (date('i', $time) * 60) + date('s', $time); |
} | } |
return (date('G') * 3600) + (date('i') * 60) + date('s'); | return (date('G') * 3600) + (date('i') * 60) + date('s'); |
} | } |
function midnight_seconds_to_time($seconds) { | function midnight_seconds_to_time($seconds) { |
if ($seconds > 0) { | if ($seconds > 0) { |
$midnight = mktime(0, 0, 0, date('n'), date('j'), date('Y')); | $midnight = mktime(0, 0, 0, date('n'), date('j'), date('Y')); |
return date('h:ia', $midnight + $seconds); | return date('h:ia', $midnight + $seconds); |
} else { | } else { |
return ''; | return ''; |
} | } |
} | } |
if ($GTFSREnabled) { | if ($GTFSREnabled) { |
$serviceAlertCause = Array( | $serviceAlertCause = Array( |
'UNKNOWN_CAUSE' => 'Unknown cause', | 'UNKNOWN_CAUSE' => 'Unknown cause', |
'OTHER_CAUSE' => 'Other cause', | 'OTHER_CAUSE' => 'Other cause', |
'TECHNICAL_PROBLEM' => 'Technical problem', | 'TECHNICAL_PROBLEM' => 'Technical problem', |
'STRIKE' => 'Strike', | 'STRIKE' => 'Strike', |
'DEMONSTRATION' => 'Demonstration', | 'DEMONSTRATION' => 'Demonstration', |
'ACCIDENT' => 'Accident', | 'ACCIDENT' => 'Accident', |
'HOLIDAY' => 'Holiday', | 'HOLIDAY' => 'Holiday', |
'WEATHER' => 'Weather', | 'WEATHER' => 'Weather', |
'MAINTENANCE' => 'Maintenance', | 'MAINTENANCE' => 'Maintenance', |
'CONSTRUCTION' => 'Construction', | 'CONSTRUCTION' => 'Construction', |
'POLICE_ACTIVITY' => 'Police activity', | 'POLICE_ACTIVITY' => 'Police activity', |
'MEDICAL_EMERGENCY' => 'Medical emergency' | 'MEDICAL_EMERGENCY' => 'Medical emergency' |
); | ); |
$serviceAlertEffect = Array( | $serviceAlertEffect = Array( |
'NO_SERVICE' => 'No service', | 'NO_SERVICE' => 'No service', |
'REDUCED_SERVICE' => 'Reduced service', | 'REDUCED_SERVICE' => 'Reduced service', |
'SIGNIFICANT_DELAYS' => 'Significant delays', | 'SIGNIFICANT_DELAYS' => 'Significant delays', |
'DETOUR' => 'Detour', | 'DETOUR' => 'Detour', |
'ADDITIONAL_SERVICE' => 'Additional service', | 'ADDITIONAL_SERVICE' => 'Additional service', |
'MODIFIED_SERVICE' => 'Modified service', | 'MODIFIED_SERVICE' => 'Modified service', |
'OTHER_EFFECT' => 'Other effect', | 'OTHER_EFFECT' => 'Other effect', |
'UNKNOWN_EFFECT' => 'Unknown effect', | 'UNKNOWN_EFFECT' => 'Unknown effect', |
'STOP_MOVED' => 'Stop moved'); | 'STOP_MOVED' => 'Stop moved'); |
set_include_path(get_include_path() . PATH_SEPARATOR . (ROOT. '/../lib/Protobuf-PHP/library/DrSlump/')); | set_include_path(get_include_path() . PATH_SEPARATOR . (ROOT. '/../lib/Protobuf-PHP/library/DrSlump/')); |
include_once('Protobuf.php'); | include_once('Protobuf.php'); |
include_once('Protobuf/Message.php'); | include_once('Protobuf/Message.php'); |
include_once('Protobuf/Registry.php'); | include_once('Protobuf/Registry.php'); |
include_once('Protobuf/Descriptor.php'); | include_once('Protobuf/Descriptor.php'); |
include_once('Protobuf/Field.php'); | include_once('Protobuf/Field.php'); |
include_once(ROOT. '/../lib/Protobuf-PHP/gtfs-realtime.php'); | include_once(ROOT. '/../lib/Protobuf-PHP/gtfs-realtime.php'); |
include_once('Protobuf/CodecInterface.php'); | include_once('Protobuf/CodecInterface.php'); |
include_once('Protobuf/Codec/PhpArray.php'); | include_once('Protobuf/Codec/PhpArray.php'); |
include_once('Protobuf/Codec/Binary.php'); | include_once('Protobuf/Codec/Binary.php'); |
include_once('Protobuf/Codec/Binary/Writer.php'); | include_once('Protobuf/Codec/Binary/Writer.php'); |
include_once('Protobuf/Codec/Json.php'); | include_once('Protobuf/Codec/Json.php'); |
function getServiceAlerts($filter_class = '', $filter_id = '') { | function getServiceAlerts($filter_class = '', $filter_id = '') { |
/* | /* |
also need last modified epoch of client gtfs | also need last modified epoch of client gtfs |
- add,remove,patch,inform (null) | - add,remove,patch,inform (null) |
- stop | - stop |
- trip | - trip |
- network | - network |
- classes (WHERE=) | - classes (WHERE=) |
- route (short_name or route_id) | - route (short_name or route_id) |
- street | - street |
- stop | - stop |
- trip | - trip |
Currently support: | Currently support: |
network inform | network inform |
trip patch: stop remove | trip patch: stop remove |
street inform: route inform, trip inform, stop inform | street inform: route inform, trip inform, stop inform |
route patch: trip remove | route patch: trip remove |
*/ | */ |
$current_alerts = getCurrentAlerts(); | $current_alerts = getCurrentAlerts(); |
$informed_count = 0; | $informed_count = 0; |
if (sizeof($current_alerts) > 0) { | if (sizeof($current_alerts) > 0) { |
$fm = new transit_realtime\FeedMessage(); | $fm = new transit_realtime\FeedMessage(); |
$fh = new transit_realtime\FeedHeader(); | $fh = new transit_realtime\FeedHeader(); |
$fh->setGtfsRealtimeVersion(1); | $fh->setGtfsRealtimeVersion(1); |
$fh->setTimestamp(time()); | $fh->setTimestamp(time()); |
$fm->setHeader($fh); | $fm->setHeader($fh); |
foreach ($current_alerts as $current_alert) { | foreach ($current_alerts as $current_alert) { |
$affectsFilteredEntities = false; | $affectsFilteredEntities = false; |
$fe = new transit_realtime\FeedEntity(); | $fe = new transit_realtime\FeedEntity(); |
$fe->setId($current_alert['id']); | $fe->setId($current_alert['id']); |
$fe->setIsDeleted(false); | $fe->setIsDeleted(false); |
$alert = new transit_realtime\Alert(); | $alert = new transit_realtime\Alert(); |
$tr = new transit_realtime\TimeRange(); | $tr = new transit_realtime\TimeRange(); |
$tr->setStart($current_alert['start']); | $tr->setStart($current_alert['start']); |
$tr->setEnd($current_alert['end']); | $tr->setEnd($current_alert['end']); |
$alert->addActivePeriod($tr); | $alert->addActivePeriod($tr); |
$informedEntities = getInformedAlerts($current_alert['id'], $filter_class, $filter_id); | $informedEntities = getInformedAlerts($current_alert['id'], $filter_class, $filter_id); |
if (sizeof($informedEntities) > 0) { | if (sizeof($informedEntities) > 0) { |
$affectsFilteredEntities = true; | $affectsFilteredEntities = true; |
foreach ($informedEntities as $informedEntity) { | foreach ($informedEntities as $informedEntity) { |
$informed_count++; | $informed_count++; |
$informed = Array(); | $informed = Array(); |
$es = new transit_realtime\EntitySelector(); | $es = new transit_realtime\EntitySelector(); |
if ($informedEntity['informed_class'] == 'agency') { | if ($informedEntity['informed_class'] == 'agency') { |
$es->setAgencyId($informedEntity['informed_id']); | $es->setAgencyId($informedEntity['informed_id']); |
} | } |
if ($informedEntity['informed_class'] == 'stop') { | if ($informedEntity['informed_class'] == 'stop') { |
$es->setStopId($informedEntity['informed_id']); | $es->setStopId($informedEntity['informed_id']); |
} | } |
if ($informedEntity['informed_class'] == 'route') { | if ($informedEntity['informed_class'] == 'route') { |
$es->setRouteId($informedEntity['informed_id']); | $es->setRouteId($informedEntity['informed_id']); |
} | } |
if ($informedEntity['informed_class'] == 'trip') { | if ($informedEntity['informed_class'] == 'trip') { |
$td = new transit_realtime\TripDescriptor(); | $td = new transit_realtime\TripDescriptor(); |
$td->setTripId($informedEntity['informed_id']); | $td->setTripId($informedEntity['informed_id']); |
$es->setTrip($td); | $es->setTrip($td); |
} | } |
$alert->addInformedEntity($es); | $alert->addInformedEntity($es); |
} | } |
} | } |
if ($current_alert['cause'] != '') { | if ($current_alert['cause'] != '') { |
$alert->setCause(constant('transit_realtime\Alert\Cause::' . $current_alert['cause'])); | $alert->setCause(constant('transit_realtime\Alert\Cause::' . $current_alert['cause'])); |
} | } |
if ($current_alert['effect'] != '') { | if ($current_alert['effect'] != '') { |
$alert->setEffect(constant('transit_realtime\Alert\Effect::' . $current_alert['effect'])); | $alert->setEffect(constant('transit_realtime\Alert\Effect::' . $current_alert['effect'])); |
} | } |
if ($current_alert['url'] != '') { | if ($current_alert['url'] != '') { |
$tsUrl = new transit_realtime\TranslatedString(); | $tsUrl = new transit_realtime\TranslatedString(); |
$tUrl = new transit_realtime\TranslatedString\Translation(); | $tUrl = new transit_realtime\TranslatedString\Translation(); |
$tUrl->setText($current_alert['url']); | $tUrl->setText($current_alert['url']); |
$tUrl->setLanguage('en'); | $tUrl->setLanguage('en'); |
$tsUrl->addTranslation($tUrl); | $tsUrl->addTranslation($tUrl); |
$alert->setUrl($tsUrl); | $alert->setUrl($tsUrl); |
} | } |
if ($current_alert['header'] != '') { | if ($current_alert['header'] != '') { |
$tsHeaderText = new transit_realtime\TranslatedString(); | $tsHeaderText = new transit_realtime\TranslatedString(); |
$tHeaderText = new transit_realtime\TranslatedString\Translation(); | $tHeaderText = new transit_realtime\TranslatedString\Translation(); |
$tHeaderText->setText($current_alert['header']); | $tHeaderText->setText($current_alert['header']); |
$tHeaderText->setLanguage('en'); | $tHeaderText->setLanguage('en'); |
$tsHeaderText->addTranslation($tHeaderText); | $tsHeaderText->addTranslation($tHeaderText); |
$alert->setHeaderText($tsHeaderText); | $alert->setHeaderText($tsHeaderText); |
} | } |
if ($current_alert['description'] != '') { | if ($current_alert['description'] != '') { |
$tsDescriptionText = new transit_realtime\TranslatedString(); | $tsDescriptionText = new transit_realtime\TranslatedString(); |
$tDescriptionText = new transit_realtime\TranslatedString\Translation(); | $tDescriptionText = new transit_realtime\TranslatedString\Translation(); |
$tDescriptionText->setText(trim($current_alert['description'])); | $tDescriptionText->setText(trim($current_alert['description'])); |
$tDescriptionText->setLanguage('en'); | $tDescriptionText->setLanguage('en'); |
$tsDescriptionText->addTranslation($tDescriptionText); | $tsDescriptionText->addTranslation($tDescriptionText); |
$alert->setDescriptionText($tsDescriptionText); | $alert->setDescriptionText($tsDescriptionText); |
} | } |
$fe->setAlert($alert); | $fe->setAlert($alert); |
if ($affectsFilteredEntities) { | if ($affectsFilteredEntities) { |
$fm->addEntity($fe); | $fm->addEntity($fe); |
} | } |
} | } |
if ($informed_count > 0) { | if ($informed_count > 0) { |
return $fm; | return $fm; |
} else { | } else { |
return null; | return null; |
} | } |
} else | } else |
return null; | return null; |
} | } |
function getServiceAlertsAsArray($filter_class = '', $filter_id = '') { | function getServiceAlertsAsArray($filter_class = '', $filter_id = '') { |
$alerts = getServiceAlerts($filter_class, $filter_id); | $alerts = getServiceAlerts($filter_class, $filter_id); |
if ($alerts != null) { | if ($alerts != null) { |
$codec = new DrSlump\Protobuf\Codec\PhpArray(); | $codec = new DrSlump\Protobuf\Codec\PhpArray(); |
return $codec->encode($alerts); | return $codec->encode($alerts); |
} else { | } else { |
return null; | return null; |
} | } |
} | } |
function getServiceAlertsAsBinary($filter_class = '', $filter_id = '') { | function getServiceAlertsAsBinary($filter_class = '', $filter_id = '') { |
$codec = new DrSlump\Protobuf\Codec\Binary(); | $codec = new DrSlump\Protobuf\Codec\Binary(); |
return $codec->encode(getServiceAlerts($filter_class, $filter_id)); | return $codec->encode(getServiceAlerts($filter_class, $filter_id)); |
} | } |
function getServiceAlertsAsJSON($filter_class = '', $filter_id = '') { | function getServiceAlertsAsJSON($filter_class = '', $filter_id = '') { |
$codec = new DrSlump\Protobuf\Codec\Json(); | $codec = new DrSlump\Protobuf\Codec\Json(); |
return $codec->encode(getServiceAlerts($filter_class, $filter_id)); | return $codec->encode(getServiceAlerts($filter_class, $filter_id)); |
} | } |
function getServiceAlertsByClass() { | function getServiceAlertsByClass() { |
$return = Array(); | $return = Array(); |
$alerts = getServiceAlertsAsArray('', ''); | $alerts = getServiceAlertsAsArray('', ''); |
foreach ($alerts['entities'] as $entity) { | foreach ($alerts['entities'] as $entity) { |
foreach ($entity['informed'] as $informed) { | foreach ($entity['informed'] as $informed) { |
foreach ($informed as $key => $value) { | foreach ($informed as $key => $value) { |
if (strpos('_id', $key) > 0) { | if (strpos('_id', $key) > 0) { |
$parts = explode($key); | $parts = explode($key); |
$class = $parts[0]; | $class = $parts[0]; |
$id = $value; | $id = $value; |
} | } |
} | } |
$return[$class][$id][] = $entity; | $return[$class][$id][] = $entity; |
} | } |
} | } |
} | } |
function getTripUpdates($filter_class = '', $filter_id = '') { | function getTripUpdates($filter_class = '', $filter_id = '') { |
$fm = new transit_realtime\FeedMessage(); | $fm = new transit_realtime\FeedMessage(); |
$fh = new transit_realtime\FeedHeader(); | $fh = new transit_realtime\FeedHeader(); |
$fh->setGtfsRealtimeVersion(1); | $fh->setGtfsRealtimeVersion(1); |
$fh->setTimestamp(time()); | $fh->setTimestamp(time()); |
$fm->setHeader($fh); | $fm->setHeader($fh); |
foreach (getCurrentAlerts() as $alert) { | foreach (getCurrentAlerts() as $alert) { |
$informedEntities = getInformedAlerts($alert['id'], $_REQUEST['filter_class'], $_REQUEST['filter_id']); | $informedEntities = getInformedAlerts($alert['id'], $_REQUEST['filter_class'], $_REQUEST['filter_id']); |
$stops = Array(); | $stops = Array(); |
$routestrips = Array(); | $routestrips = Array(); |
if (sizeof($informedEntities) > 0) { | if (sizeof($informedEntities) > 0) { |
if ($informedEntity['informed_class'] == 'stop' && $informed['x-action'] == 'remove') { | if ($informedEntity['informed_class'] == 'stop' && $informed['x-action'] == 'remove') { |
$stops[] = $informedEntity['informed_id']; | $stops[] = $informedEntity['informed_id']; |
} | } |
if (($informedEntity['informed_class'] == 'route' || $informedEntity['informed_class'] == 'trip') && $informed['x-action'] == 'patch') { | if (($informedEntity['informed_class'] == 'route' || $informedEntity['informed_class'] == 'trip') && $informed['x-action'] == 'patch') { |
$routestrips[] = Array('id' => $informedEntity['informed_id'], | $routestrips[] = Array('id' => $informedEntity['informed_id'], |
'type' => $informedEntity['informed_class']); | 'type' => $informedEntity['informed_class']); |
} | } |
} | } |
foreach ($routestrips as $routetrip) { | foreach ($routestrips as $routetrip) { |
$fe = new transit_realtime\FeedEntity(); | $fe = new transit_realtime\FeedEntity(); |
$fe->setId($alert['id'] . $routetrip['id']); | $fe->setId($alert['id'] . $routetrip['id']); |
$fe->setIsDeleted(false); | $fe->setIsDeleted(false); |
$tu = new transit_realtime\TripUpdate(); | $tu = new transit_realtime\TripUpdate(); |
$td = new transit_realtime\TripDescriptor(); | $td = new transit_realtime\TripDescriptor(); |
if ($routetrip['type'] == 'route') { | if ($routetrip['type'] == 'route') { |
$td->setRouteId($routetrip['id']); | $td->setRouteId($routetrip['id']); |
} else if ($routetrip['type'] == 'trip') { | } else if ($routetrip['type'] == 'trip') { |
$td->setTripId($routetrip['id']); | $td->setTripId($routetrip['id']); |
} | } |
$tu->setTrip($td); | $tu->setTrip($td); |
foreach ($stops as $stop) { | foreach ($stops as $stop) { |
$stu = new transit_realtime\TripUpdate\StopTimeUpdate(); | $stu = new transit_realtime\TripUpdate\StopTimeUpdate(); |
$stu->setStopId($stop); | $stu->setStopId($stop); |
$stu->setScheduleRelationship(transit_realtime\TripUpdate\StopTimeUpdate\ScheduleRelationship::SKIPPED); | $stu->setScheduleRelationship(transit_realtime\TripUpdate\StopTimeUpdate\ScheduleRelationship::SKIPPED); |
$tu->addStopTimeUpdate($stu); | $tu->addStopTimeUpdate($stu); |
} | } |
$fe->setTripUpdate($tu); | $fe->setTripUpdate($tu); |
$fm->addEntity($fe); | $fm->addEntity($fe); |
} | } |
} | } |
return $fm; | return $fm; |
} | } |
function getTripUpdatesAsArray($filter_class = '', $filter_id = '') { | function getTripUpdatesAsArray($filter_class = '', $filter_id = '') { |
$codec = new DrSlump\Protobuf\Codec\PhpArray(); | $codec = new DrSlump\Protobuf\Codec\PhpArray(); |
return $codec->encode(getTripUpdates($filter_class, $filter_id)); | return $codec->encode(getTripUpdates($filter_class, $filter_id)); |
} | } |
function getTripUpdatesAsBinary($filter_class = '', $filter_id = '') { | function getTripUpdatesAsBinary($filter_class = '', $filter_id = '') { |
$codec = new DrSlump\Protobuf\Codec\Binary(); | $codec = new DrSlump\Protobuf\Codec\Binary(); |
return $codec->encode(getTripUpdates($filter_class, $filter_id)); | return $codec->encode(getTripUpdates($filter_class, $filter_id)); |
} | } |
function getTripUpdatesAsJSON($filter_class = '', $filter_id = '') { | function getTripUpdatesAsJSON($filter_class = '', $filter_id = '') { |
$codec = new DrSlump\Protobuf\Codec\Json(); | $codec = new DrSlump\Protobuf\Codec\Json(); |
return $codec->encode(getTripUpdates($filter_class, $filter_id)); | return $codec->encode(getTripUpdates($filter_class, $filter_id)); |
} | } |
} | } |
<?php | <?php |
/* | /* |
* Copyright 2010,2011 Alexander Sadleir | * Copyright 2010,2011 Alexander Sadleir |
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. |
*/ | */ |
function getRoute($routeID) { | function getRoute($routeID) { |
global $conn; | global $conn; |
$query = 'Select * from routes where route_id = :routeID LIMIT 1'; | $query = 'Select * from routes where route_id = :routeID LIMIT 1'; |
debug($query, 'database'); | debug($query, 'database'); |
$query = $conn->prepare($query); | $query = $conn->prepare($query); |
$query->bindParam(':routeID', $routeID); | $query->bindParam(':routeID', $routeID); |
$query->execute(); | $query->execute(); |
if (!$query) { | if (!$query) { |
databaseError($conn->errorInfo()); | databaseError($conn->errorInfo()); |
return Array(); | return Array(); |
} | } |
return $query->fetch(PDO :: FETCH_ASSOC); | return $query->fetch(PDO :: FETCH_ASSOC); |
} | } |
function getRoutesByShortName($routeShortName) { | function getRoutesByShortName($routeShortName) { |
global $conn; | global $conn; |
$query = 'Select distinct route_id, route_short_name from routes where route_short_name = :routeShortName'; | $query = 'Select distinct route_id, route_short_name from routes where route_short_name = :routeShortName'; |
debug($query, 'database'); | debug($query, 'database'); |
$query = $conn->prepare($query); | $query = $conn->prepare($query); |
$query->bindParam(':routeShortName', $routeShortName); | $query->bindParam(':routeShortName', $routeShortName); |
$query->execute(); | $query->execute(); |
if (!$query) { | if (!$query) { |
databaseError($conn->errorInfo()); | databaseError($conn->errorInfo()); |
return Array(); | return Array(); |
} | } |
return $query->fetchAll(); | return $query->fetchAll(); |
} | } |
function getRouteHeadsigns($routeID) { | function getRouteHeadsigns($routeID) { |
global $conn; | global $conn; |
$query = 'select stops.stop_name, trip_headsign, direction_id,max(service_id) as service_id, count(*) | $query = 'select stops.stop_name, trip_headsign, direction_id,max(service_id) as service_id, count(*) |
from routes join trips on trips.route_id = routes.route_id | from routes join trips on trips.route_id = routes.route_id |
join stop_times on stop_times.trip_id = trips.trip_id join stops on | join stop_times on stop_times.trip_id = trips.trip_id join stops on |
stop_times.stop_id = stops.stop_id where trips.route_id = :routeID | stop_times.stop_id = stops.stop_id where trips.route_id = :routeID |
and stop_times.stop_sequence = 1 group by stops.stop_name, trip_headsign, direction_id having count(*) > 2'; | and stop_times.stop_sequence = 1 group by stops.stop_name, trip_headsign, direction_id having count(*) > 2'; |
debug($query, 'database'); | debug($query, 'database'); |
$query = $conn->prepare($query); | $query = $conn->prepare($query); |
$query->bindParam(':routeID', $routeID); | $query->bindParam(':routeID', $routeID); |
$query->execute(); | $query->execute(); |
if (!$query) { | if (!$query) { |
databaseError($conn->errorInfo()); | databaseError($conn->errorInfo()); |
return Array(); | return Array(); |
} | } |
$results = $query->fetchAll(); | $results = $query->fetchAll(); |
if (is_array($results)) { | if (is_array($results)) { |
return $results; | return $results; |
} else { | } else { |
return Array($results); | return Array($results); |
} | } |
} | } |
function getRouteDescription($routeID, $directionID) { | function getRouteDescription($routeID, $directionID) { |
$trip = getRouteNextTrip($routeID, $directionID); | $trip = getRouteNextTrip($routeID, $directionID); |
$start = getTripStartingPoint($trip['trip_id']); | $start = getTripStartingPoint($trip['trip_id']); |
$end = getTripDestination($trip['trip_id']); | $end = getTripDestination($trip['trip_id']); |
return 'From ' . $start['stop_name'] . ' to ' . $end['stop_name']; | return 'From ' . $start['stop_name'] . ' to ' . $end['stop_name']; |
} | } |
function getRouteByFullName($routeFullName) { | function getRouteByFullName($routeFullName) { |
global $conn; | global $conn; |
$query = 'Select * from routes where route_short_name||route_long_name = :routeFullName LIMIT 1'; | $query = 'Select * from routes where route_short_name||route_long_name = :routeFullName LIMIT 1'; |
debug($query, 'database'); | debug($query, 'database'); |
$query = $conn->prepare($query); | $query = $conn->prepare($query); |
$query->bindParam(':routeFullName', $routeFullName); | $query->bindParam(':routeFullName', $routeFullName); |
$query->execute(); | $query->execute(); |
if (!$query) { | if (!$query) { |
databaseError($conn->errorInfo()); | databaseError($conn->errorInfo()); |
return Array(); | return Array(); |
} | } |
return $query->fetch(PDO :: FETCH_ASSOC); | return $query->fetch(PDO :: FETCH_ASSOC); |
} | } |
function getRoutes() { | function getRoutes() { |
global $conn; | global $conn; |
$query = 'Select * from routes order by route_short_name;'; | $query = 'Select * from routes order by route_short_name;'; |
debug($query, 'database'); | debug($query, 'database'); |
$query = $conn->prepare($query); | $query = $conn->prepare($query); |
$query->execute(); | $query->execute(); |
if (!$query) { | if (!$query) { |
databaseError($conn->errorInfo()); | databaseError($conn->errorInfo()); |
return Array(); | return Array(); |
} | } |
return $query->fetchAll(); | return $query->fetchAll(); |
} | } |
function getRoutesByNumberSeries($routeNumberSeries = '') { | function getRoutesByNumberSeries($routeNumberSeries = '') { |
global $conn; | global $conn; |
if (strlen($routeNumberSeries) == 1) { | if (strlen($routeNumberSeries) == 1) { |
return getRoute($routeNumberSeries); | return getRoute($routeNumberSeries); |
} | } |
$seriesMin = substr($routeNumberSeries, 0, -1) . '0'; | $seriesMin = substr($routeNumberSeries, 0, -1) . '0'; |
$seriesMax = substr($routeNumberSeries, 0, -1) . '9'; | $seriesMax = substr($routeNumberSeries, 0, -1) . '9'; |
$query = 'Select distinct routes.route_id,routes.route_short_name,routes.route_long_name,service_id from routes join trips on trips.route_id = | $query = 'Select distinct routes.route_id,routes.route_short_name,routes.route_long_name,service_id from routes join trips on trips.route_id = |
routes.route_id join stop_times on stop_times.trip_id = trips.trip_id where to_number(route_short_name, \'FM999\') between :seriesMin and :seriesMax OR route_short_name LIKE :routeNumberSeries order by route_short_name;'; | routes.route_id join stop_times on stop_times.trip_id = trips.trip_id where to_number(route_short_name, \'FM999\') between :seriesMin and :seriesMax OR route_short_name LIKE :routeNumberSeries order by route_short_name;'; |
debug($query, 'database'); | debug($query, 'database'); |
$query = $conn->prepare($query); | $query = $conn->prepare($query); |
$query->bindParam(':seriesMin', $seriesMin); | $query->bindParam(':seriesMin', $seriesMin); |
$query->bindParam(':seriesMax', $seriesMax); | $query->bindParam(':seriesMax', $seriesMax); |
$routeNumberSeries = '% ' . substr($routeNumberSeries, 0, -1) . '%'; | $routeNumberSeries = '% ' . substr($routeNumberSeries, 0, -1) . '%'; |
$query->bindParam(':routeNumberSeries', $routeNumberSeries); | $query->bindParam(':routeNumberSeries', $routeNumberSeries); |
$query->execute(); | $query->execute(); |
if (!$query) { | if (!$query) { |
databaseError($conn->errorInfo()); | databaseError($conn->errorInfo()); |
return Array(); | return Array(); |
} | } |
return $query->fetchAll(); | return $query->fetchAll(); |
} | } |
function getRouteNextTrip($routeID, $directionID) { | function getRouteNextTrip($routeID, $directionID) { |
global $conn; | global $conn; |
$query = 'select routes.route_id,routes.route_url,direction_id,trips.trip_id,trip_headsign,departure_time,service_id from routes join trips on trips.route_id = routes.route_id | $query = 'select routes.route_id,routes.route_url,direction_id,trips.trip_id,trip_headsign,departure_time,service_id from routes join trips on trips.route_id = routes.route_id |
join stop_times on stop_times.trip_id = trips.trip_id where arrival_time between :currentTime and :futureTime | join stop_times on stop_times.trip_id = trips.trip_id where arrival_time between :currentTime and :futureTime |
and routes.route_id = :routeID and trips.direction_id = :directionID order by | and routes.route_id = :routeID and trips.direction_id = :directionID order by |
arrival_time limit 1'; | arrival_time limit 1'; |
debug($query, 'database'); | debug($query, 'database'); |
$query = $conn->prepare($query); | $query = $conn->prepare($query); |
$query->bindParam(':currentTime', current_time()); | $query->bindParam(':currentTime', current_time()); |
$futureTime = current_time(strtotime(current_time() . ' +2h')); | $futureTime = current_time(strtotime(current_time() . ' +2h')); |
if (date('h', strtotime(current_time()) > 22)) | if (date('h', strtotime(current_time()) > 22)) |
$futureTime = '23:59:59'; | $futureTime = '23:59:59'; |
$query->bindParam(':futureTime', $futureTime); | $query->bindParam(':futureTime', $futureTime); |
$query->bindParam(':routeID', $routeID); | $query->bindParam(':routeID', $routeID); |
$query->bindParam(':directionID', $directionID); | $query->bindParam(':directionID', $directionID); |
$query->execute(); | $query->execute(); |
databaseError($conn->errorInfo()); | databaseError($conn->errorInfo()); |
if (!$query) { | if (!$query) { |
databaseError($conn->errorInfo()); | databaseError($conn->errorInfo()); |
return Array(); | return Array(); |
} | } |
$r = $query->fetch(PDO :: FETCH_ASSOC); | $r = $query->fetch(PDO :: FETCH_ASSOC); |
return $r; | return $r; |
} | } |
function getRouteFirstTrip($routeID, $directionID) { | function getRouteFirstTrip($routeID, $directionID) { |
global $conn; | global $conn; |
$query = 'select * from routes join trips on trips.route_id = routes.route_id | $query = 'select * from routes join trips on trips.route_id = routes.route_id |
join stop_times on stop_times.trip_id = trips.trip_id where routes.route_id = :routeID | join stop_times on stop_times.trip_id = trips.trip_id where routes.route_id = :routeID |
and trips.direction_id = :directionID order by | and trips.direction_id = :directionID order by |
arrival_time DESC limit 1'; | arrival_time DESC limit 1'; |
debug($query, 'database'); | debug($query, 'database'); |
$query = $conn->prepare($query); | $query = $conn->prepare($query); |
$query->bindParam(':routeID', $routeID); | $query->bindParam(':routeID', $routeID); |
$query->bindParam(':directionID', $directionID); | $query->bindParam(':directionID', $directionID); |
$query->execute(); | $query->execute(); |
if (!$query) { | if (!$query) { |
databaseError($conn->errorInfo()); | databaseError($conn->errorInfo()); |
return Array(); | return Array(); |
} | } |
$r = $query->fetch(PDO :: FETCH_ASSOC); | $r = $query->fetch(PDO :: FETCH_ASSOC); |
return $r; | return $r; |
} | } |
function getRouteAtStop($routeID, $directionID, $stop_id) { | function getRouteAtStop($routeID, $directionID, $stop_id) { |
$nextTrip = getRouteNextTrip($routeID, $directionID); | $nextTrip = getRouteNextTrip($routeID, $directionID); |
if ($nextTrip['trip_id']) { | if ($nextTrip['trip_id']) { |
foreach (getTripStopTimes($nextTrip['trip_id']) as $tripStop) { | foreach (getTripStopTimes($nextTrip['trip_id']) as $tripStop) { |
if ($tripStop['stop_id'] == $stop_id) | if ($tripStop['stop_id'] == $stop_id) |
return $tripStop; | return $tripStop; |
} | } |
} | } |
return Array(); | return Array(); |
} | } |
function getRouteTrips($routeID, $directionID = '', $service_period = '') { | function getRouteTrips($routeID, $directionID = '', $service_period = '') { |
global $conn; | global $conn; |
if ($service_period == '') | if ($service_period == '') |
$service_period = service_period(); | $service_period = service_period(); |
$service_ids = service_ids($service_period); | $service_ids = service_ids($service_period); |
$sidA = $service_ids[0]; | $sidA = $service_ids[0]; |
$sidB = $service_ids[1]; | $sidB = $service_ids[1]; |
$directionSQL = ''; | $directionSQL = ''; |
if ($directionID != '') | if ($directionID != '') |
$directionSQL = ' and direction_id = :directionID '; | $directionSQL = ' and direction_id = :directionID '; |
$query = 'select routes.route_id,trips.trip_id,service_id,arrival_time, stop_id, stop_sequence from routes join trips on trips.route_id = routes.route_id | $query = 'select routes.route_id,trips.trip_id,service_id,arrival_time, stop_id, stop_sequence from routes join trips on trips.route_id = routes.route_id |
join stop_times on stop_times.trip_id = trips.trip_id where (service_id=:service_periodA OR service_id=:service_periodB) | join stop_times on stop_times.trip_id = trips.trip_id where (service_id=:service_periodA OR service_id=:service_periodB) |
AND (routes.route_id = :routeID) ' . $directionSQL . ' and stop_sequence = \'1\' order by | AND (routes.route_id = :routeID) ' . $directionSQL . ' and stop_sequence = \'1\' order by |
arrival_time '; | arrival_time '; |
debug($query, 'database'); | debug($query, 'database'); |
$query = $conn->prepare($query); | $query = $conn->prepare($query); |
$query->bindParam(':routeID', $routeID); | $query->bindParam(':routeID', $routeID); |
$query->bindParam(':service_periodA', $sidA); | $query->bindParam(':service_periodA', $sidA); |
$query->bindParam(':service_periodB', $sidB); | $query->bindParam(':service_periodB', $sidB); |
if ($directionSQL != '') | if ($directionSQL != '') |
$query->bindParam(':directionID', $directionID); | $query->bindParam(':directionID', $directionID); |
$query->execute(); | $query->execute(); |
if (!$query) { | if (!$query) { |
databaseError($conn->errorInfo()); | databaseError($conn->errorInfo()); |
return Array(); | return Array(); |
} | } |
return $query->fetchAll(); | return $query->fetchAll(); |
} | } |
function getRoutesByDestination($destination = '', $service_period = '') { | function getRoutesByDestination($destination = '', $service_period = '') { |
global $conn; | global $conn; |
if ($service_period == '') | if ($service_period == '') |
$service_period = service_period(); | $service_period = service_period(); |
$service_ids = service_ids($service_period); | $service_ids = service_ids($service_period); |
$sidA = $service_ids[0]; | $sidA = $service_ids[0]; |
$sidB = $service_ids[1]; | $sidB = $service_ids[1]; |
if ($destination != '') { | if ($destination != '') { |
/* $query = 'SELECT DISTINCT trips.route_id,route_short_name,route_long_name, service_id | /* $query = 'SELECT DISTINCT trips.route_id,route_short_name,route_long_name, service_id |
FROM stop_times join trips on trips.trip_id = | FROM stop_times join trips on trips.trip_id = |
stop_times.trip_id join routes on trips.route_id = routes.route_id | stop_times.trip_id join routes on trips.route_id = routes.route_id |
WHERE route_long_name = :destination AND (service_id=:service_periodA OR service_id=:service_periodB) | WHERE route_long_name = :destination AND (service_id=:service_periodA OR service_id=:service_periodB) |
order by route_short_name'; */ | order by route_short_name'; */ |
$query = 'select route_id, direction_id, stop_name, b.trip_id, b.stop_sequence from (select route_id, direction_id, max(stop_sequence) as stop_sequence, max(a.trip_id) as trip_id from stop_times inner join (SELECT route_id, direction_id, max(trip_id) as trip_id | $query = 'select route_id, direction_id, stop_name, b.trip_id, b.stop_sequence from (select route_id, direction_id, max(stop_sequence) as stop_sequence, max(a.trip_id) as trip_id from stop_times inner join (SELECT route_id, direction_id, max(trip_id) as trip_id |
from trips group by route_id,direction_id) as a on stop_times.trip_id = a.trip_id group by route_id, direction_id) as b inner join stop_times on b.trip_id = stop_times.trip_id inner join stops on stop_times.stop_id = stops.stop_id where stop_times.stop_sequence = b.stop_sequence and stop_name = :destination order by route_id;'; | from trips group by route_id,direction_id) as a on stop_times.trip_id = a.trip_id group by route_id, direction_id) as b inner join stop_times on b.trip_id = stop_times.trip_id inner join stops on stop_times.stop_id = stops.stop_id where stop_times.stop_sequence = b.stop_sequence and stop_name = :destination order by route_id;'; |
} else { | } else { |
$query = 'select stop_name from (select route_id, direction_id, max(stop_sequence) as stop_sequence, max(a.trip_id) as trip_id from stop_times inner join (SELECT route_id, direction_id, max(trip_id) as trip_id | $query = 'select stop_name from (select route_id, direction_id, max(stop_sequence) as stop_sequence, max(a.trip_id) as trip_id from stop_times inner join (SELECT route_id, direction_id, max(trip_id) as trip_id |
from trips group by route_id,direction_id) as a on stop_times.trip_id = a.trip_id group by route_id, direction_id) as b inner join stop_times on b.trip_id = stop_times.trip_id inner join stops on stop_times.stop_id = stops.stop_id where stop_times.stop_sequence = b.stop_sequence group by stop_name order by stop_name;'; | from trips group by route_id,direction_id) as a on stop_times.trip_id = a.trip_id group by route_id, direction_id) as b inner join stop_times on b.trip_id = stop_times.trip_id inner join stops on stop_times.stop_id = stops.stop_id where stop_times.stop_sequence = b.stop_sequence group by stop_name order by stop_name;'; |
} | } |
debug($query, 'database'); | debug($query, 'database'); |
$query = $conn->prepare($query); | $query = $conn->prepare($query); |
//$query->bindParam(':service_periodA', $sidA); | //$query->bindParam(':service_periodA', $sidA); |
//$query->bindParam(':service_periodB', $sidB); | //$query->bindParam(':service_periodB', $sidB); |
if ($destination != '') | if ($destination != '') |
$query->bindParam(':destination', $destination); | $query->bindParam(':destination', $destination); |
$query->execute(); | $query->execute(); |
if (!$query) { | if (!$query) { |
databaseError($conn->errorInfo()); | databaseError($conn->errorInfo()); |
return Array(); | return Array(); |
} | } |
return $query->fetchAll(); | return $query->fetchAll(); |
} | } |
function getRoutesBySuburb($suburb, $service_period = '') { | function getRoutesBySuburb($suburb, $service_period = '') { |
if ($service_period == '') | if ($service_period == '') |
$service_period = service_period(); | $service_period = service_period(); |
$service_ids = service_ids($service_period); | $service_ids = service_ids($service_period); |
$sidA = $service_ids[0]; | $sidA = $service_ids[0]; |
$sidB = $service_ids[1]; | $sidB = $service_ids[1]; |
global $conn; | global $conn; |
$query = 'SELECT DISTINCT service_id,trips.route_id,route_short_name,route_long_name | $query = 'SELECT DISTINCT service_id,trips.route_id,route_short_name,route_long_name |
FROM stop_times join trips on trips.trip_id = stop_times.trip_id | FROM stop_times join trips on trips.trip_id = stop_times.trip_id |
join routes on trips.route_id = routes.route_id | join routes on trips.route_id = routes.route_id |
join stops on stops.stop_id = stop_times.stop_id | join stops on stops.stop_id = stop_times.stop_id |
WHERE stop_desc LIKE :suburb AND (service_id=:service_periodA OR service_id=:service_periodB) | WHERE stop_desc LIKE :suburb AND (service_id=:service_periodA OR service_id=:service_periodB) |
ORDER BY route_short_name'; | ORDER BY route_short_name'; |
debug($query, 'database'); | debug($query, 'database'); |
$query = $conn->prepare($query); | $query = $conn->prepare($query); |
$query->bindParam(':service_periodA', $sidA); | $query->bindParam(':service_periodA', $sidA); |
$query->bindParam(':service_periodB', $sidB); | $query->bindParam(':service_periodB', $sidB); |
$suburb = '%Suburb: %' . $suburb . '%'; | $suburb = '%Suburb: %' . $suburb . '%'; |
$query->bindParam(':suburb', $suburb); | $query->bindParam(':suburb', $suburb); |
$query->execute(); | $query->execute(); |
databaseError($conn->errorInfo()); | databaseError($conn->errorInfo()); |
return $query->fetchAll(); | return $query->fetchAll(); |
} | } |
function getRoutesNearby($lat, $lng, $limit = '', $distance = 500) { | function getRoutesNearby($lat, $lng, $limit = '', $distance = 500) { |
// if ($service_period == '') | // if ($service_period == '') |
$service_period = service_period(); | $service_period = service_period(); |
$service_ids = service_ids($service_period); | $service_ids = service_ids($service_period); |
$sidA = $service_ids[0]; | $sidA = $service_ids[0]; |
$sidB = $service_ids[1]; | $sidB = $service_ids[1]; |
$limitSQL = ''; | $limitSQL = ''; |
if ($limit != '') | if ($limit != '') |
$limitSQL = ' LIMIT :limit '; | $limitSQL = ' LIMIT :limit '; |
global $conn; | global $conn; |
$query = 'SELECT service_id,trips.route_id,trips.direction_id,route_short_name,route_long_name,min(stops.stop_id) as stop_id, | $query = 'SELECT service_id,trips.route_id,trips.direction_id,route_short_name,route_long_name,min(stops.stop_id) as stop_id, |
min(ST_Distance(position, ST_GeographyFromText(\'SRID=4326;POINT($lng $lat)\'), FALSE)) as distance | min(ST_Distance(position, ST_GeographyFromText(\'SRID=4326;POINT($lng $lat)\'), FALSE)) as distance |
FROM stop_times | FROM stop_times |
join trips on trips.trip_id = stop_times.trip_id | join trips on trips.trip_id = stop_times.trip_id |
join routes on trips.route_id = routes.route_id | join routes on trips.route_id = routes.route_id |
join stops on stops.stop_id = stop_times.stop_id | join stops on stops.stop_id = stop_times.stop_id |
WHERE (service_id=:service_periodA OR service_id=:service_periodB) | WHERE (service_id=:service_periodA OR service_id=:service_periodB) |
AND ST_DWithin(position, ST_GeographyFromText(\'SRID=4326;POINT($lng $lat)\'), :distance, FALSE) | AND ST_DWithin(position, ST_GeographyFromText(\'SRID=4326;POINT($lng $lat)\'), :distance, FALSE) |
group by service_id,trips.route_id,trips.direction_id,route_short_name,route_long_name | group by service_id,trips.route_id,trips.direction_id,route_short_name,route_long_name |
order by distance $limitSQL'; | order by distance '.$limitSQL; |
debug($query, 'database'); | debug($query, 'database'); |
$query = $conn->prepare($query); | $query = $conn->prepare($query); |
$query->bindParam(':service_periodA', $sidA); | $query->bindParam(':service_periodA', $sidA); |
$query->bindParam(':service_periodB', $sidB); | $query->bindParam(':service_periodB', $sidB); |
$query->bindParam(':distance', $distance); | $query->bindParam(':distance', $distance); |
if ($limit != '') | if ($limit != '') |
$query->bindParam(':limit', $limit); | $query->bindParam(':limit', $limit); |
$query->execute(); | $query->execute(); |
if (!$query) { | if (!$query) { |
databaseError($conn->errorInfo()); | databaseError($conn->errorInfo()); |
return Array(); | return Array(); |
} | } |
return $query->fetchAll(); | return $query->fetchAll(); |
} | } |
<?php | <?php |
/* | /* |
* Copyright 2010,2011 Alexander Sadleir | * Copyright 2010,2011 Alexander Sadleir |
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. |
*/ | */ |
function getStop($stopID) { | function getStop($stopID) { |
global $conn; | global $conn; |
$query = 'Select * from stops where stop_id = :stopID LIMIT 1'; | $query = 'Select * from stops where stop_id = :stopID LIMIT 1'; |
debug($query, 'database'); | debug($query, 'database'); |
$query = $conn->prepare($query); | $query = $conn->prepare($query); |
$query->bindParam(':stopID', $stopID); | $query->bindParam(':stopID', $stopID); |
$query->execute(); | $query->execute(); |
if (!$query) { | if (!$query) { |
databaseError($conn->errorInfo()); | databaseError($conn->errorInfo()); |
return Array(); | return Array(); |
} | } |
return $query->fetch(PDO :: FETCH_ASSOC); | return $query->fetch(PDO :: FETCH_ASSOC); |
} | } |
function getStops($firstLetter = '', $startsWith = '') { | function getStops($firstLetter = '', $startsWith = '') { |
global $conn; | global $conn; |
$conditions = Array(); | $conditions = Array(); |
if ($firstLetter != '') | if ($firstLetter != '') |
$conditions[] = 'substr(stop_name,1,1) = :firstLetter'; | $conditions[] = 'substr(stop_name,1,1) = :firstLetter'; |
if ($startsWith != '') | if ($startsWith != '') |
$conditions[] = 'stop_name like :startsWith'; | $conditions[] = 'stop_name like :startsWith'; |
$query = 'Select * from stops'; | $query = 'Select * from stops'; |
if (sizeof($conditions) > 0) { | if (sizeof($conditions) > 0) { |
if (sizeof($conditions) > 1) { | if (sizeof($conditions) > 1) { |
$query .= ' Where ' . implode(' AND ', $conditions) . ' '; | $query .= ' Where ' . implode(' AND ', $conditions) . ' '; |
} else { | } else { |
$query .= ' Where ' . $conditions[0] . ' '; | $query .= ' Where ' . $conditions[0] . ' '; |
} | } |
} | } |
$query .= ' order by stop_name;'; | $query .= ' order by stop_name;'; |
debug($query, 'database'); | debug($query, 'database'); |
$query = $conn->prepare($query); | $query = $conn->prepare($query); |
if ($firstLetter != '') | if ($firstLetter != '') |
$query->bindParam(':firstLetter', $firstLetter); | $query->bindParam(':firstLetter', $firstLetter); |
if ($startsWith != '') { | if ($startsWith != '') { |
$startsWith = $startsWith . '%'; | $startsWith = $startsWith . '%'; |
$query->bindParam(':startsWith', $startsWith); | $query->bindParam(':startsWith', $startsWith); |
} | } |
$query->execute(); | $query->execute(); |
if (!$query) { | if (!$query) { |
databaseError($conn->errorInfo()); | databaseError($conn->errorInfo()); |
return Array(); | return Array(); |
} | } |
return $query->fetchAll(); | return $query->fetchAll(); |
} | } |
function getNearbyStops($lat, $lng, $limit = '', $distance = 1000) { | function getNearbyStops($lat, $lng, $limit = '', $distance = 1000) { |
if ($lat == null || $lng == null) | if ($lat == null || $lng == null) |
return Array(); | return Array(); |
if ($limit != '') | if ($limit != '') |
$limitSQL = ' LIMIT :limit '; | $limitSQL = ' LIMIT :limit '; |
global $conn; | global $conn; |
$query = 'Select *, ST_Distance(position, ST_GeographyFromText(\'SRID=4326;POINT($lng $lat)\'), FALSE) as distance | $query = 'Select *, ST_Distance(position, ST_GeographyFromText(\'SRID=4326;POINT('.$lng.' '.$lat.')\'), FALSE) as distance |
from stops WHERE ST_DWithin(position, ST_GeographyFromText(\'SRID=4326;POINT($lng $lat)\'), :distance, FALSE) | from stops WHERE ST_DWithin(position, ST_GeographyFromText(\'SRID=4326;POINT('.$lng.' '.$lat.')\'), :distance, FALSE) |
order by distance $limitSQL;'; | order by distance '.$limitSQL; |
debug($query, 'database'); | debug($query, 'database'); |
$query = $conn->prepare($query); | $query = $conn->prepare($query); |
$query->bindParam(':distance', $distance); | $query->bindParam(':distance', $distance); |
$query->bindParam(':limit', $limit); | $query->bindParam(':limit', $limit); |
$query->execute(); | $query->execute(); |
if (!$query) { | if (!$query) { |
databaseError($conn->errorInfo()); | databaseError($conn->errorInfo()); |
return Array(); | return Array(); |
} | } |
return $query->fetchAll(); | return $query->fetchAll(); |
} | } |
function getStopsByName($name) { | function getStopsByName($name) { |
global $conn; | global $conn; |
$query = 'Select * from stops where stop_name LIKE :name;'; | $query = 'Select * from stops where stop_name LIKE :name;'; |
debug($query, 'database'); | debug($query, 'database'); |
$query = $conn->prepare($query); | $query = $conn->prepare($query); |
$name = $name . '%'; | $name = $name . '%'; |
$query->bindParam(':name', $name); | $query->bindParam(':name', $name); |
$query->execute(); | $query->execute(); |
if (!$query) { | if (!$query) { |
databaseError($conn->errorInfo()); | databaseError($conn->errorInfo()); |
return Array(); | return Array(); |
} | } |
return $query->fetchAll(); | return $query->fetchAll(); |
} | } |
function getStopsBySuburb($suburb) { | function getStopsBySuburb($suburb) { |
global $conn; | global $conn; |
$query = 'Select * from stops where stop_desc LIKE :suburb order by stop_name;'; | $query = 'Select * from stops where stop_desc LIKE :suburb order by stop_name;'; |
debug($query, 'database'); | debug($query, 'database'); |
$query = $conn->prepare($query); | $query = $conn->prepare($query); |
$suburb = '%<br>Suburb: %' . $suburb . '%'; | $suburb = '%<br>Suburb: %' . $suburb . '%'; |
$query->bindParam(':suburb', $suburb); | $query->bindParam(':suburb', $suburb); |
$query->execute(); | $query->execute(); |
if (!$query) { | if (!$query) { |
databaseError($conn->errorInfo()); | databaseError($conn->errorInfo()); |
return Array(); | return Array(); |
} | } |
return $query->fetchAll(); | return $query->fetchAll(); |
} | } |
function getStopsByStopCode($stop_code, $startsWith = '') { | function getStopsByStopCode($stop_code, $startsWith = '') { |
global $conn; | global $conn; |
$query = 'Select * from stops where (stop_code = :stop_code OR stop_code LIKE :stop_code2)'; | $query = 'Select * from stops where (stop_code = :stop_code OR stop_code LIKE :stop_code2)'; |
if ($startsWith != '') | if ($startsWith != '') |
$query .= ' AND stop_name like :startsWith'; | $query .= ' AND stop_name like :startsWith'; |
debug($query, 'database'); | debug($query, 'database'); |
$query = $conn->prepare($query); | $query = $conn->prepare($query); |
$query->bindParam(':stop_code', $stop_code); | $query->bindParam(':stop_code', $stop_code); |
$stop_code2 = $stop_code . '%'; | $stop_code2 = $stop_code . '%'; |
$query->bindParam(':stop_code2', $stop_code2); | $query->bindParam(':stop_code2', $stop_code2); |
if ($startsWith != '') { | if ($startsWith != '') { |
$startsWith = $startsWith . '%'; | $startsWith = $startsWith . '%'; |
$query->bindParam(':startsWith', $startsWith); | $query->bindParam(':startsWith', $startsWith); |
} | } |
$query->execute(); | $query->execute(); |
if (!$query) { | if (!$query) { |
databaseError($conn->errorInfo()); | databaseError($conn->errorInfo()); |
return Array(); | return Array(); |
} | } |
return $query->fetchAll(); | return $query->fetchAll(); |
} | } |
function getStopRoutes($stopID, $service_period) { | function getStopRoutes($stopID, $service_period) { |
if ($service_period == '') { | if ($service_period == '') { |
$service_period = service_period(); | $service_period = service_period(); |
} | } |
$service_ids = service_ids($service_period); | $service_ids = service_ids($service_period); |
$sidA = $service_ids[0]; | $sidA = $service_ids[0]; |
$sidB = $service_ids[1]; | $sidB = $service_ids[1]; |
global $conn; | global $conn; |
$query = 'SELECT distinct service_id,trips.route_id,route_short_name,route_long_name | $query = 'SELECT distinct service_id,trips.route_id,route_short_name,route_long_name |
FROM stop_times join trips on trips.trip_id = | FROM stop_times join trips on trips.trip_id = |
stop_times.trip_id join routes on trips.route_id = routes.route_id WHERE stop_id = :stopID | stop_times.trip_id join routes on trips.route_id = routes.route_id WHERE stop_id = :stopID |
AND (service_id=:service_periodA OR service_id=:service_periodB)'; | AND (service_id=:service_periodA OR service_id=:service_periodB)'; |
debug($query, 'database'); | debug($query, 'database'); |
$query = $conn->prepare($query); | $query = $conn->prepare($query); |
$query->bindParam(':service_periodA', $sidA); | $query->bindParam(':service_periodA', $sidA); |
$query->bindParam(':service_periodB', $sidB); | $query->bindParam(':service_periodB', $sidB); |
$query->bindParam(':stopID', $stopID); | $query->bindParam(':stopID', $stopID); |
$query->execute(); | $query->execute(); |
if (!$query) { | if (!$query) { |
databaseError($conn->errorInfo()); | databaseError($conn->errorInfo()); |
return Array(); | return Array(); |
} | } |
return $query->fetchAll(); | return $query->fetchAll(); |
} | } |
function getStopTrips($stopID, $service_period = '', $afterTime = '', $limit = '', $route_short_name = '') { | function getStopTrips($stopID, $service_period = '', $afterTime = '', $limit = '', $route_short_name = '') { |
if ($service_period == '') { | if ($service_period == '') { |
$service_period = service_period(); | $service_period = service_period(); |
} | } |
$service_ids = service_ids($service_period); | $service_ids = service_ids($service_period); |
$sidA = $service_ids[0]; | $sidA = $service_ids[0]; |
$sidB = $service_ids[1]; | $sidB = $service_ids[1]; |
$limitSQL = ''; | $limitSQL = ''; |
if ($limit != '') | if ($limit != '') |
$limitSQL .= ' LIMIT :limit '; | $limitSQL .= ' LIMIT :limit '; |
global $conn; | global $conn; |
if ($afterTime != '') { | if ($afterTime != '') { |
$query = ' SELECT stop_times.trip_id,stop_times.arrival_time,stop_times.stop_id,stop_sequence,service_id,trips.route_id,trips.direction_id,trips.trip_headsign,route_short_name,route_long_name,end_times.arrival_time as end_time | $query = ' SELECT stop_times.trip_id,stop_times.arrival_time,stop_times.stop_id,stop_sequence,service_id,trips.route_id,trips.direction_id,trips.trip_headsign,route_short_name,route_long_name,end_times.arrival_time as end_time |
FROM stop_times | FROM stop_times |
join trips on trips.trip_id = | join trips on trips.trip_id = |
stop_times.trip_id | stop_times.trip_id |
join routes on trips.route_id = routes.route_id , (SELECT trip_id,max(arrival_time) as arrival_time from stop_times | join routes on trips.route_id = routes.route_id , (SELECT trip_id,max(arrival_time) as arrival_time from stop_times |
WHERE stop_times.arrival_time IS NOT NULL group by trip_id) as end_times | WHERE stop_times.arrival_time IS NOT NULL group by trip_id) as end_times |
WHERE stop_times.stop_id = :stopID | WHERE stop_times.stop_id = :stopID |
AND stop_times.trip_id = end_times.trip_id | AND stop_times.trip_id = end_times.trip_id |
AND (service_id=:service_periodA OR service_id=:service_periodB) ' . ($route_short_name != '' ? ' AND route_short_name = :route_short_name ' : '') . ' | AND (service_id=:service_periodA OR service_id=:service_periodB) ' . ($route_short_name != '' ? ' AND route_short_name = :route_short_name ' : '') . ' |
AND end_times.arrival_time > :afterTime | AND end_times.arrival_time > :afterTime |
ORDER BY end_time $limitSQL'; | ORDER BY end_time '.$limitSQL; |
} else { | } else { |
$query = 'SELECT stop_times.trip_id,arrival_time,stop_times.stop_id,stop_sequence,service_id,trips.route_id,route_short_name,route_long_name | $query = 'SELECT stop_times.trip_id,arrival_time,stop_times.stop_id,stop_sequence,service_id,trips.route_id,route_short_name,route_long_name |
FROM stop_times | FROM stop_times |
join trips on trips.trip_id = | join trips on trips.trip_id = |
stop_times.trip_id | stop_times.trip_id |
join routes on trips.route_id = routes.route_id | join routes on trips.route_id = routes.route_id |
WHERE stop_times.stop_id = :stopID | WHERE stop_times.stop_id = :stopID |
AND (service_id=:service_periodA OR service_id=:service_periodB) ' . ($route_short_name != '' ? ' AND route_short_name = :route_short_name ' : '') . ' | AND (service_id=:service_periodA OR service_id=:service_periodB) ' . ($route_short_name != '' ? ' AND route_short_name = :route_short_name ' : '') . ' |
ORDER BY arrival_time $limitSQL'; | ORDER BY arrival_time '.$limitSQL; |
} | } |
debug($query, 'database'); | debug($query, 'database'); |
$query = $conn->prepare($query); | $query = $conn->prepare($query); |
$query->bindParam(':service_periodA', $sidA); | $query->bindParam(':service_periodA', $sidA); |
$query->bindParam(':service_periodB', $sidB); | $query->bindParam(':service_periodB', $sidB); |
$query->bindParam(':stopID', $stopID); | $query->bindParam(':stopID', $stopID); |
if ($limit != '') | if ($limit != '') |
$query->bindParam(':limit', $limit); | $query->bindParam(':limit', $limit); |
if ($afterTime != '') | if ($afterTime != '') |
$query->bindParam(':afterTime', $afterTime); | $query->bindParam(':afterTime', $afterTime); |
if ($route_short_name != '') | if ($route_short_name != '') |
$query->bindParam(':route_short_name', $route_short_name); | $query->bindParam(':route_short_name', $route_short_name); |
$query->execute(); | $query->execute(); |
if (!$query) { | if (!$query) { |
databaseError($conn->errorInfo()); | databaseError($conn->errorInfo()); |
return Array(); | return Array(); |
} | } |
return $query->fetchAll(); | return $query->fetchAll(); |
} | } |
function getStopTripsWithTimes($stopID, $time = '', $service_period = '', $time_range = '', $limit = '') { | function getStopTripsWithTimes($stopID, $time = '', $service_period = '', $time_range = '', $limit = '') { |
if ($service_period == '') | if ($service_period == '') |
$service_period = service_period(); | $service_period = service_period(); |
if ($time_range == '') | if ($time_range == '') |
$time_range = (24 * 60 * 60); | $time_range = (24 * 60 * 60); |
if ($time == '') | if ($time == '') |
$time = current_time(); | $time = current_time(); |
if ($limit == '') | if ($limit == '') |
$limit = 10; | $limit = 10; |
$trips = getStopTrips($stopID, $service_period, $time); | $trips = getStopTrips($stopID, $service_period, $time); |
$timedTrips = Array(); | $timedTrips = Array(); |
if ($trips && sizeof($trips) > 0) { | if ($trips && sizeof($trips) > 0) { |
foreach ($trips as $trip) { | foreach ($trips as $trip) { |
if ($trip['arrival_time'] != '') { | if ($trip['arrival_time'] != '') { |
if (strtotime($trip['arrival_time']) > strtotime($time) and strtotime($trip['arrival_time']) < (strtotime($time) + $time_range)) { | if (strtotime($trip['arrival_time']) > strtotime($time) and strtotime($trip['arrival_time']) < (strtotime($time) + $time_range)) { |
$timedTrips[] = $trip; | $timedTrips[] = $trip; |
} | } |
} else { | } else { |
$timedTrip = getTripAtStop($trip['trip_id'], $trip['stop_sequence']); | $timedTrip = getTripAtStop($trip['trip_id'], $trip['stop_sequence']); |
if ($timedTrip['arrival_time'] > $time and strtotime($timedTrip['arrival_time']) < (strtotime($time) + $time_range)) { | if ($timedTrip['arrival_time'] > $time and strtotime($timedTrip['arrival_time']) < (strtotime($time) + $time_range)) { |
$timedTrips[] = $timedTrip; | $timedTrips[] = $timedTrip; |
} | } |
} | } |
if (sizeof($timedTrips) > $limit) | if (sizeof($timedTrips) > $limit) |
break; | break; |
} | } |
sktimesort($timedTrips, 'arrival_time', true); | sktimesort($timedTrips, 'arrival_time', true); |
} | } |
return $timedTrips; | return $timedTrips; |
} | } |