## 9. Trip Shapes (shapes.txt) *This file is ***optional*** in a GTFS feed.* Each trip in `trips.txt` can have a shape associated with it. The shapes.txt file defines the points that make up an individual shape in order to plot a trip on a map. Two or more records in `shapes.txt` with the same `shape_id` value define a shape. The amount of data stored in this file can be quite large. In *Optimizing Shapes* there are some strategies to efficiently reduce the amount of shape data. | Field | Required? | Description | | :----- | :-------- | :---------- | | `shape_id` | Required | An ID to uniquely identify a shape. Every point for a shape contains the same value. | | `shape_pt_lat` | Required | The latitude for a given point in the range of `-90` to `90`. | | `shape_pt_lon` | Required | The longitude for a given point in the range of `-180` to `180`. | | `shape_pt_sequence` | Required | A non-negative number that defines the ordering for points in a shape. A value must not be repeated within a single shape. | | `shape_dist_traveled` | Optional | This value represents how far along a shape a particular point exists. This is a distance in a unit such as feet or kilometers. This unit must be the same as that used in `stop_times.txt`. | ### Sample Data The following table shows a portion of a shape from the TriMet GTFS feed. It is a portion of the shape that corresponds to the sample data in the `stop_times.txt` section. | `shape_id` | `shape_pt_lat` | `shape_pt_lon` | `shape_pt_sequence` | `shape_dist_traveled` | | :--------- | :------------- | :------------- | :------------------ | :-------------------- | | 185328 | 45.52291 | -122.677372 | 1 | 0.0 | | 185328 | 45.522921 | -122.67737 | 2 | 3.7 | | 185328 | 45.522991 | -122.677432 | 3 | 34.0 | | 185328 | 45.522992 | -122.677246 | 4 | 81.5 | | 185328 | 45.523002 | -122.676567 | 5 | 255.7 | | 185328 | 45.523004 | -122.676486 | 6 | 276.4 | | 185328 | 45.523007 | -122.676386 | 7 | 302.0 | | 185328 | 45.523024 | -122.675386 | 8 | 558.4 | | 185328 | 45.522962 | -122.67538 | 9 | 581.0 | In this sample data, the `shape_dist_traveled` is listed in feet. There is no way to specify in a GTFS feed which units are used for this column -- it could be feet, miles, meters, kilometers. In actual fact, it does not really matter, just as long as the units are the same as in `stop_times.txt`. If you need to present a distance to your users (such as how far you need to travel on a bus), you can calculate it instead by adding up the distance between each point and formatting it based on the user's locale settings. ### Point Sequences In most GTFS feeds the `shape_pt_sequence` value starts at 1 and increments by 1 for every subsequent point. Additionally, points are typically listed in order of their sequence. You should not rely on these two statements though, as this is not a requirement of GTFS. Many transit agencies have automated systems that export their GTFS from a separate system, which can sometimes result in an unpredictable output format. For instance, a trip that has stop times listed with the sequences `1`, `2`, `9`, `18`, `7`, `3` is perfectly valid. ### Distance Travelled The `shape_dist_traveled` column is used so you can programmatically determine how much of a shape to draw when showing a map to users of your web site or app. If you use techniques in *Optimizing Shapes* to reduce the file size of shape data, then it becomes difficult to use this value. Alternatively, you can calculate portions of shapes by determining which point in a shape travels closest to the start and finish points of a trip.