Refactor to use PostGIS database instead of gtfs tools
[busui.git] / include / db / stop-dao.inc.php
blob:a/include/db/stop-dao.inc.php -> blob:b/include/db/stop-dao.inc.php
<?php <?php
/* def StopZoneToTuple(stop):  
"""Return tuple as expected by javascript function addStopMarkerFromList""" /*
return (stop.stop_id, stop.stop_name, float(stop.stop_lat), * Copyright 2010,2011 Alexander Sadleir
float(stop.stop_lon), stop.location_type, stop.stop_code, stop.zone_id)  
*/ Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
   
  http://www.apache.org/licenses/LICENSE-2.0
   
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
  */
   
function getStop($stopID) { function getStop($stopID) {
  global $conn;
} $query = "Select * from stops where stop_id = :stopID LIMIT 1";
  debug($query, "database");
function getStops($timingPointsOnly = false) { $query = $conn->prepare($query);
  $query->bindParam(":stopID", $stopID);
} $query->execute();
  if (!$query) {
function stopsNear($lat,$lng,$limit) { databaseError($conn->errorInfo());
  return Array();
/* }
-- Show a distance query and note, London is outside the 1000km tolerance return $query->fetch(PDO :: FETCH_ASSOC);
SELECT name FROM global_points WHERE ST_DWithin(location, ST_GeographyFromText('SRID=4326;POINT(-110 29)'), 1000000, FALSE); }
// All the geography functions have the option of using a sphere calculation, by setting a final boolean parameter to 'FALSE'. This will somewhat speed up calculations, particularly for cases where the geometries are very simple.  
*/ function getStops($timingPointsOnly = false, $firstLetter = "", $startsWith = "") {
} global $conn;
  $conditions = Array();
function stopsBySuburb($suburb) { if ($timingPointsOnly)
  $conditions[] = "substr(stop_code,1,2) != 'Wj'";
} if ($firstLetter != "")
  $conditions[] = "substr(stop_name,1,1) = :firstLetter";
function stopRoutes($stopID,$service_period) if ($startsWith != "")
/* $conditions[] = "stop_name like :startsWith";
def handle_json_GET_stoproutes(self, params): $query = "Select * from stops";
"""Given a stop_id return all routes to visit the stop.""" if (sizeof($conditions) > 0) {
schedule = self.server.schedule if (sizeof($conditions) > 1) {
stop = schedule.GetStop(params.get('stop', None)) $query .= " Where " . implode(" AND ", $conditions) . " ";
service_period = params.get('service_period', None) } else {
trips = stop.GetTrips(schedule) $query .= " Where " . $conditions[0] . " ";
result = {} }
for trip in trips: }
route = schedule.GetRoute(trip.route_id) $query .= " order by stop_name;";
if service_period == None or trip.service_id == service_period: $query = $conn->prepare($query);
if not route.route_short_name+route.route_long_name+trip.service_id in result: if ($firstLetter != "")
result[route.route_short_name+route.route_long_name+trip.service_id] = (route.route_id, route.route_short_name, route.route_long_name, trip.trip_id, trip.service_id) $query->bindParam(":firstLetter", $firstLetter);
return result  
*/ if ($startsWith != "") {
  $startsWith = $startsWith . "%";
function stopTrips($stopID) { $query->bindParam(":startsWith", $startsWith);
/* }
def handle_json_GET_stopalltrips(self, params): $query->execute();
"""Given a stop_id return all trips to visit the stop (without times).""" if (!$query) {
schedule = self.server.schedule databaseError($conn->errorInfo());
stop = schedule.GetStop(params.get('stop', None)) return Array();
service_period = params.get('service_period', None) }
trips = stop.GetTrips(schedule) return $query->fetchAll();
result = [] }
for trip in trips:  
if service_period == None or trip.service_id == service_period: function getNearbyStops($lat, $lng, $limit = "", $distance = 1000) {
result.append((trip.trip_id, trip.service_id)) if ($lat == null || $lng == null)
return result return Array();
*/ if ($limit != "")
} $limitSQL = " LIMIT :limit ";
function stopTripsWithTimes($stopID, $time, $service_period) { global $conn;
/* $query = "Select *, ST_Distance(position, ST_GeographyFromText('SRID=4326;POINT($lng $lat)'), FALSE) as distance
def handle_json_GET_stoptrips(self, params): from stops WHERE ST_DWithin(position, ST_GeographyFromText('SRID=4326;POINT($lng $lat)'), :distance, FALSE)
"""Given a stop_id and time in seconds since midnight return the next order by distance $limitSQL;";
trips to visit the stop.""" debug($query, "database");
schedule = self.server.schedule $query = $conn->prepare($query);
stop = schedule.GetStop(params.get('stop', None)) $query->bindParam(":distance", $distance);
requested_time = int(params.get('time', 0)) $query->bindParam(":limit", $limit);
limit = int(params.get('limit', 15)) $query->execute();
service_period = params.get('service_period', None) if (!$query) {
time_range = int(params.get('time_range', 24*60*60)) databaseError($conn->errorInfo());
  return Array();
filtered_time_trips = [] }
for trip, index in stop._GetTripIndex(schedule): return $query->fetchAll();
tripstarttime = trip.GetStartTime() }
if tripstarttime > requested_time and tripstarttime < (requested_time + time_range):  
time, stoptime, tp = trip.GetTimeInterpolatedStops()[index] function getStopsByName($name) {
if time > requested_time and time < (requested_time + time_range): global $conn;
bisect.insort(filtered_time_trips, (time, (trip, index), tp)) $query = "Select * from stops where stop_name LIKE :name;";
result = [] debug($query, "database");
for time, (trip, index), tp in filtered_time_trips: $query = $conn->prepare($query);
if len(result) > limit: $name = "%" . $name . ";%";
break $query->bindParam(":name", $name);
route = schedule.GetRoute(trip.route_id) $query->execute();
trip_name = '' if (!$query) {
if route.route_short_name: databaseError($conn->errorInfo());
trip_name += route.route_short_name return Array();
if route.route_long_name: }
if len(trip_name): return $query->fetchAll();
trip_name += " - " }
trip_name += route.route_long_name  
if service_period == None or trip.service_id == service_period: function getStopsBySuburb($suburb) {
result.append((time, (trip.trip_id, trip_name, trip.service_id), tp)) global $conn;
return result $query = "Select * from stops where zone_id LIKE :suburb order by stop_name;";
*/ debug($query, "database");
} $query = $conn->prepare($query);
  $suburb = "%" . $suburb . ";%";
  $query->bindParam(":suburb", $suburb);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  return $query->fetchAll();
  }
   
  function getStopsByStopCode($stop_code, $startsWith = "") {
  global $conn;
  $query = "Select * from stops where (stop_code = :stop_code OR stop_code LIKE :stop_code2)";
  if ($startsWith != "")
  $query .= " AND stop_name like :startsWith";
   
  debug($query, "database");
  $query = $conn->prepare($query);
   
  $query->bindParam(":stop_code", $stop_code);
  $stop_code2 = $stop_code . "%";
  $query->bindParam(":stop_code2", $stop_code2);
  if ($startsWith != "") {
  $startsWith = $startsWith . "%";
  $query->bindParam(":startsWith", $startsWith);
  }
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  return $query->fetchAll();
  }
   
  function getStopRoutes($stopID, $service_period) {
  if ($service_period == "")
  $service_period = service_period();
  global $conn;
  $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 join routes on trips.route_id = routes.route_id WHERE stop_id = :stopID AND service_id=:service_period";
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":service_period", $service_period);
  $query->bindParam(":stopID", $stopID);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  return $query->fetchAll();
  }
   
  function getStopTrips($stopID, $service_period = "", $afterTime = "", $limit = "") {
  if ($service_period == "")
  $service_period = service_period();
  if ($limit != "")
  $limitSQL = " LIMIT :limit ";
  global $conn;
  if ($afterTime != "") {
  $query = " SELECT stop_times.trip_id,stop_times.arrival_time,stop_times.stop_id,stop_sequence,service_id,trips.route_id,route_short_name,route_long_name, end_times.arrival_time as end_time
  FROM stop_times
  join trips on trips.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
  WHERE stop_times.arrival_time IS NOT NULL group by trip_id) as end_times
  WHERE stop_times.stop_id = :stopID
  AND stop_times.trip_id = end_times.trip_id
  AND service_id=:service_period
  AND end_times.arrival_time > :afterTime
  ORDER BY end_time $limitSQL";
  } 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
  FROM stop_times
  join trips on trips.trip_id =
  stop_times.trip_id
  join routes on trips.route_id = routes.route_id
  WHERE stop_times.stop_id = :stopID
  AND service_id=:service_period
  ORDER BY arrival_time $limitSQL";
  }
  debug($query, "database");
  $query = $conn->prepare($query);
  $query->bindParam(":service_period", $service_period);
  $query->bindParam(":stopID", $stopID);
  if ($limit != "")
  $query->bindParam(":limit", $limit);
  if ($afterTime != "")
  $query->bindParam(":afterTime", $afterTime);
  $query->execute();
  if (!$query) {
  databaseError($conn->errorInfo());
  return Array();
  }
  return $query->fetchAll();
  }
   
  function getStopTripsWithTimes($stopID, $time = "", $service_period = "", $time_range = "", $limit = "") {
  if ($service_period == "")
  $service_period = service_period();
  if ($time_range == "")
  $time_range = (24 * 60 * 60);
  if ($time == "")
  $time = current_time();
  if ($limit == "")
  $limit = 10;
  $trips = getStopTrips($stopID, $service_period, $time);
  $timedTrips = Array();
  if ($trips && sizeof($trips) > 0) {
  foreach ($trips as $trip) {
  if ($trip['arrival_time'] != "") {
  if (strtotime($trip['arrival_time']) > strtotime($time) and strtotime($trip['arrival_time']) < (strtotime($time) + $time_range)) {
  $timedTrips[] = $trip;
  }
  } else {
  $timedTrip = getTimeInterpolatedTripAtStop($trip['trip_id'], $trip['stop_sequence']);
  if ($timedTrip['arrival_time'] > $time and strtotime($timedTrip['arrival_time']) < (strtotime($time) + $time_range)) {
  $timedTrips[] = $timedTrip;
  }
  }
  if (sizeof($timedTrips) > $limit)
  break;
  }
  sktimesort($timedTrips, "arrival_time", true);
  }
  return $timedTrips;
  }
   
?> ?>