class StopTime(Base): """A specific stop on a route on a trip. This implements stop_times.txt in the GTFS feed """ trip = models.ForeignKey(Trip, on_delete=models.CASCADE) stop = models.ForeignKey(Stop, on_delete=models.CASCADE) arrival_time = SecondsField( default=None, null=True, blank=True, help_text="Arrival time. Must be set for end stops of trip.") departure_time = SecondsField( default=None, null=True, blank=True, help_text='Departure time. Must be set for end stops of trip.') stop_sequence = models.IntegerField() stop_headsign = models.CharField( max_length=255, blank=True, help_text="Sign text that identifies the stop for passengers") pickup_type = models.CharField( max_length=1, blank=True, choices=(('0', 'Regularly scheduled pickup'), ('1', 'No pickup available'), ('2', 'Must phone agency to arrange pickup'), ('3', 'Must coordinate with driver to arrange pickup')), help_text="How passengers are picked up") drop_off_type = models.CharField( max_length=1, blank=True, choices=(('0', 'Regularly scheduled drop off'), ('1', 'No drop off available'), ('2', 'Must phone agency to arrange drop off'), ('3', 'Must coordinate with driver to arrange drop off')), help_text="How passengers are picked up") shape_dist_traveled = models.FloatField( "shape distance traveled", null=True, blank=True, help_text='Distance of stop from start of shape') extra_data = JSONField(default={}, blank=True, null=True) def __str__(self): return "%s-%s-%s" % (self.trip, self.stop.stop_id, self.stop_sequence) class Meta: db_table = 'stop_time' app_label = 'multigtfs' _column_map = ( ('trip_id', 'trip__trip_id'), ('arrival_time', 'arrival_time'), ('departure_time', 'departure_time'), ('stop_id', 'stop__stop_id'), ('stop_sequence', 'stop_sequence'), ('stop_headsign', 'stop_headsign'), ('pickup_type', 'pickup_type'), ('drop_off_type', 'drop_off_type'), ('shape_dist_traveled', 'shape_dist_traveled') ) _filename = 'stop_times.txt' _rel_to_feed = 'trip__route__feed' _sort_order = ('trip__trip_id', 'stop_sequence') _unique_fields = ('trip_id', 'stop_sequence')
class ShapePoint(Base): """A point along the shape""" shape = models.ForeignKey('Shape', related_name='points') point = models.PointField( geography=MULTIGTFS_USE_GEOGRAPHY, srid=MULTIGTFS_SRID, help_text='WGS 84 latitude/longitude of shape point') sequence = models.IntegerField() traveled = models.FloatField( null=True, blank=True, help_text='Distance of point from start of shape') def __unicode__(self): return u"%s-%d" % (self.shape, self.sequence) def getlon(self): return self.point[0] if self.point else 0.0 def setlon(self, value): if self.point: self.point[0] = value else: self.point = "POINT(%s 0)" % value lon = property(getlon, setlon, doc="WGS 84 longitude of shape point") def getlat(self): return self.point[1] if self.point else 0.0 def setlat(self, value): if self.point: self.point[1] = value else: self.point = "POINT(0 %s)" % value lat = property(getlat, setlat, doc="WGS 84 latitude of shape point") def __init__(self, *args, **kwargs): lat = kwargs.pop('lat', None) lon = kwargs.pop('lon', None) if lat is not None or lon is not None: assert kwargs.get('point') is None msg = "Setting ShapePoint location with lat and lon is deprecated" warnings.warn(msg, DeprecationWarning) kwargs['point'] = "POINT(%s %s)" % (lon or 0.0, lat or 0.0) super(ShapePoint, self).__init__(*args, **kwargs) class Meta: db_table = 'shape_point' app_label = 'multigtfs' _column_map = ( ('shape_id', 'shape__shape_id'), ('shape_pt_lat', 'point[1]'), ('shape_pt_lon', 'point[0]'), ('shape_pt_sequence', 'sequence'), ('shape_dist_traveled', 'traveled') ) _rel_to_feed = 'shape__feed' _sort_order = ('shape__shape_id', 'sequence')
class ShapePoint(Base): """A point along the shape""" shape = models.ForeignKey( 'Shape', on_delete=models.CASCADE, related_name='points') point = models.PointField( help_text='WGS 84 latitude/longitude of shape point') sequence = models.IntegerField() traveled = models.FloatField( null=True, blank=True, help_text='Distance of point from start of shape') extra_data = JSONField(default={}, blank=True, null=True) def __str__(self): return "%s-%d" % (self.shape, self.sequence) def getlon(self): return self.point[0] if self.point else 0.0 def setlon(self, value): if self.point: self.point[0] = value else: self.point = "POINT(%s 0)" % value lon = property(getlon, setlon, doc="WGS 84 longitude of shape point") def getlat(self): return self.point[1] if self.point else 0.0 def setlat(self, value): if self.point: self.point[1] = value else: self.point = "POINT(0 %s)" % value lat = property(getlat, setlat, doc="WGS 84 latitude of shape point") def __init__(self, *args, **kwargs): """Initialize a ShapePoint If the legacy lat and lon params are used, then warn and initialize the point from them. """ lat = kwargs.pop('lat', None) lon = kwargs.pop('lon', None) if lat is not None or lon is not None: assert kwargs.get('point') is None msg = "Setting ShapePoint location with lat and lon is deprecated" warnings.warn(msg, DeprecationWarning) kwargs['point'] = "POINT(%s %s)" % (lon or 0.0, lat or 0.0) super(ShapePoint, self).__init__(*args, **kwargs) class Meta: db_table = 'shape_point' app_label = 'multigtfs' _column_map = ( ('shape_id', 'shape__shape_id'), ('shape_pt_lat', 'point[1]'), ('shape_pt_lon', 'point[0]'), ('shape_pt_sequence', 'sequence'), ('shape_dist_traveled', 'traveled') ) _filename = 'shapes.txt' _rel_to_feed = 'shape__feed' _sort_order = ('shape__shape_id', 'sequence') _unique_fields = ('shape_id', 'shape_pt_sequence')