1 Boarding 2 Next Page 3 4

Haiku

Trying
At least and
Not badly, they
Know their role

Stuck!
Only working here for now
Ready to defend
The way things
Are

Haiku is dumb. Or perhaps just poorly transliterated?

Iambic tetrameter???

I rode the TANK and I did see
a friendly driver condescend
to stop the bus and wait for me
the only rider end to end.

“Remove your hoods!” the speaker blares,
the driver has gone mute it seems.
Uncivil  stretch from here to there,
we nod our heads and sheath our dreams.

I think these work better for English, but maybe I just like rhymes like some sort of poetic simpleton.

And fuck SORTA, by the way. Those damn speakers are dehumanizing and awful. They said they were for ad revenues and now they have the system in place they’re abusing us with their own radio voice actor shit every ten damn seconds.

Comments: Leave one?
Posted in: Aphorism
Tags: | | |

Dreaming of Open Data

As SORTA continues it’s endless dissembling, and TANK more honestly lacks the resources, I wonder if the bikeshare of all things will beat both to the postmodern age and release real-time fleet location data.

Dare a boy dream of such things? Perhaps a less cynical one might.

But in the meantime, if anyone is curious to¬†see the actual locations of the bike share stations as they’re installed(which, oddly I have not seen anywhere else yet), I’ve been adding them to OpenStreetMap as I find them. Look for nodes tagged ‘amenity’=’bicycle_rental’ and ‘network’=’Red Bike’, or Tiny Bike on the main OSM map stylesheet. Or just follow that link for a map with dynamic query results ;-)

I know of 11 stations as I write this.

Comments: 4
Posted in: Data
Tags: | | | |

TANK’s Failure of Communication

Fireworks are worth shutting down a major city.

Said no one ever, but for the dipshit who decided that’s what Cincinnati was going to do.

For the second year in a row, I have been confounded by a preposterous barrier: at 7pm today, all the bridges shut down. Every one of them. For everyone. For the second year in a row, this has disrupted well laid plans with my boyfriend in Kentucky. This year it was fireworks at a friend’s house. Last year it was an anniversary dinner already in the oven.

Now let’s be clear; disruptions are normal in some transportation systems and that’s why we have redundancies. Bus not working? Take a bike. No go there? Hail a cab. Still no? Walk!
What we’re dealing with here is a complete breakdown in the whole system for every mode. There is no tunnel under the river. Every crossing is shut. With the number of boats in the water, swimming isn’t even safe. I was lucky last year though: one of my redundancies worked. After trying to bike across literally every bridge, the fourth police officer I talked to told me TANK might be running. It was, and I caught the last one over with my bike, arriving very late to dinner, but still, arriving.

This time though, I didn’t make it. Seeing the bridges were closed, and remembering last year, I headed directly to the TANK stop on fourth. I got there and was relieved to see half a dozen people at the stop. Now normally, this is a good sign. It means that the bus is almost there, because people have had time to pile up.

But in this case, it was a sign of TANK’s complete failure to communicate the fact that they simply stopped operating the most critical link in their whole system.1

When SORTA shuts down a stop, or changes service on short notice, at least they post signs literally over top of the bus stop signs. “This stop is closed temporarily. Walk to …” Something like that. (Other agencies often go quite a bit beyond that.)

For TANK’s downtown stops tonight, there was absolutely nothing. And as I write this, I’m certain that there are people sitting on those dirty little benches in front of the Federal Reserve cursing a late bus that they don’t know will simply never come.

Now, without defending the logic of the shut-down decision, I presume that it goes something like this: People driving on bridges would get distracted and wreck their cars…yadda yadda yadda. Now let’s not even get into why humans on foot cant cross (I can feel my blood pressure really starting to rise at this point). Let’s assume that that’s the logic and point out that the only people who can and do drive TANK buses are professional drivers who presumably can’t be so easily distracted, and certainly not on an otherwise empty road. Why the flying fuck can’t TANK keep running normally through the fireworks??? I understand that some stupid car-blind engineer might think to shut down the bridges, but what really gets me is that no one at TANK had the balls or the ability or perhaps the desire to stand up for themselves and insist that they continue to operate a critical service through this silly spectacle.

That failure being swallowed of necessity, it’s even more galling that they didn’t think to post even one notice at their single most active stop2 where, as I say, people are almost certainly still waiting at this very moment for a bus that won’t ever come.

I’m properly pissed. I’m pissed at the City. I’m pissed at TANK for not standing up for themselves, and I’m pissed at TANK doubly for not telling it’s passengers that they won’t be coming. To my mind, this is as big a (short-term) failure as a transit system is capable of making.

TANK, you should be ashamed. Learn from it, but feel shame no less for that pragmatic consolation. TANK failed it’s riders tonight.

Show 2 footnotes

  1. I am prepared to back this up with data already provided by TANK.
  2. Again, I can prove this.
Comments: Leave one?
Posted in: Talking about Transit
Tags: | | |

Stop Dispersion, Inter-agency Comparison

Interagency-Transit-Stop-Dispersion-Chart

That last post was fun. Here’s some more :-)

All data is from current(April 2014) public GTFS feeds listed here. I calculated the straight-line distance, in feet, using the appropriate US state-plane projections, from each and every stop on each line to the next scheduled stop in that line. I then weighted each segment distance thus created by the number of times the agency traverses that segment each week. Weekday trips count 5 times Saturday-only trips, etc. That should give us something like the average person’s experience of the distance to the next stop, if people are evenly distributed across vehicles. The chart was plotted in R using the density() function, output to SVG, and then tweaked and reoriented in Inkscape.

Draw your own conclusions!

EDIT: Some useful SQL code using the basic table structure from GTFS; I simply imported the calendar.txt, trips.txt, stop_times.txt & stops.txt from each agency’s feed into a POSTGIS DB and ran a spatial query on that. Here’s the basic procedure for Muni:


--create the whole table, even though we only need a few things
--it's easier than editing the CSV
CREATE TABLE sfmta_calendar (
	service_id varchar,
	monday integer,
	tuesday integer,
	wednesday integer,
	thursday integer,
	friday integer,
	saturday integer,
	sunday integer,
	start_date varchar,
	end_date varchar
);
CREATE TABLE sfmta_trips (
	route_id varchar,
	service_id varchar,
	trip_id varchar,
	trip_headsign varchar,
	direction_id varchar,
	block_id varchar,
	shape_id varchar
);
CREATE TABLE sfmta_stop_times (
	trip_id varchar,
	arrival_time varchar,
	departure_time varchar,
	stop_id varchar,
	stop_sequence integer,
	headsign varchar,
	pickup_type varchar,
	drop_off_type varchar,
	dist_travelled varchar
);
CREATE TABLE sfmta_stops (
	stop_id varchar,
	--stop_code varchar,
	stop_name varchar,
	stop_desc varchar,
	stop_lat varchar,
	stop_lon varchar,
	zone_id varchar,
	url varchar
);

-- bring in the data
-- mind you get rid of the headers first
COPY sfmta_calendar FROM '/home/nate/calendar.txt' DELIMITER ',' CSV;
COPY sfmta_trips FROM '/home/nate/trips.txt' DELIMITER ',' CSV;
COPY sfmta_stop_times FROM '/home/nate/stop_times.txt' DELIMITER ',' CSV;
COPY sfmta_stops FROM '/home/nate/stops.txt' DELIMITER ',' CSV;

-- add a geometry column
ALTER TABLE sfmta_stops ADD COLUMN the_geom geometry(POINT,3494);
UPDATE sfmta_stops SET the_geom = 
	ST_Transform(
		ST_GeomFromText('POINT('|| stop_lon ||' '|| stop_lat ||')', 4326)
		,3494
	);
--add columns which we'll update with the values we're actually interested in
ALTER TABLE sfmta_stop_times
ADD COLUMN weight integer,
ADD COLUMN next_stop real;

--run the spatial query
--first get each stop paired up with the next one down the line.
--this should return the total number of records in the stop_times
-- table minus the number of records in the trips table
--(each trip has one final stop)
WITH temp AS (
	SELECT 
		t.route_id,
		t.trip_id,
		t.service_id,
		st.stop_sequence,
		s.the_geom
	FROM sfmta_trips AS t 
	JOIN sfmta_stop_times AS st ON t.trip_id = st.trip_id
	JOIN sfmta_stops AS s ON st.stop_id = s.stop_id),
--now get a table of weights
--most agencies use the same schedule for all week days and 
--we don't want to over-emphasize weekend-only services
--each day column simply has a true/false binary value, which we've treated as an integer
weights AS (
	SELECT 
		service_id,
		(monday+tuesday+wednesday+thursday+friday+saturday+sunday) AS weight
	FROM sfmta_calendar
)
--join all that shit and calculate the distance from each stop to the next
UPDATE sfmta_stop_times SET 
	next_stop = t1.the_geom <-> t2.the_geom,
	weight = weights.weight
FROM temp AS t1
JOIN temp AS t2 ON 
	t1.stop_sequence = t2.stop_sequence + 1
	AND t1.trip_id = t2.trip_id
	AND t1.route_id = t2.route_id
JOIN weights ON weights.service_id = t1.service_id
WHERE 
	t1.trip_id = sfmta_stop_times.trip_id AND
	t1.stop_sequence = sfmta_stop_times.stop_sequence;

-- and export the data
COPY (
	SELECT 
		next_stop,
		weight
	FROM sfmta_stop_times
	WHERE next_stop > 0
) TO '/home/nate/sfmta.csv' DELIMITER ',' CSV HEADER;

And then it’s on to R!

Comments: 2
Posted in: Access | Analysis | Data
Tags: | | | | | | | | | | | | |

Cooperation

Isn’t this refreshing?

SORTA advertises accross the river!

With the understanding that public agencies rarely get positive feedback, I want to take a moment to thank SORTA for this awesome ad that I saw on the way to class today. If I had a nickel for the number of times I’ve overheard someone (in Ohio) asking their friend how they can get to the airport only to hear ‘taxi’ as the reply1, I’d have a fist full of nickels which is still not enough to take a taxi to the airport. It’ll buy me a trip on the 2X though($2), which if I may add to the ad, has lovely plush seats that are much nicer than a dirty taxi anyway :-)

Hooray for inter-agency advertising!

Are these sorts of ads anywhere else? I’ve only seen them on UC’s campus, though I’d like to think XU, Cincy State, and (dare I dream) even some of the neigborhood business districts have advertising with their own localized, practical and relevant suggestions.

Show 1 footnote

  1. I always interject at this point.
Comments: Leave one?
Posted in: Ads
Tags: | | | | | |

An approximation of service frequency

Here is a rather crude, though I think useful, visualization of service frequency at the stop level. Basically, I used the GTFS data from SORTA and TANK to calculate the number of times a bus stops at each stop every week. Since a week is the basic cycle period of transit(service is bad on Sunday, better on monday), this should give us a an idea of basic average frequency with the huge caveat that there’s enormous variation within each week.

map of the approximate frequency of greater cincinnati transit system

Click the image to get a bigger version. There’s lot’s of interesting detail in there!

You may notice that frequency can appear vary in a single line where it doesn’t seem like it probably should:

Map of Ludlow Avenue in Clifton, Cincinnati

Ludlow Avenue

In most cases, this is simply an artifact of the way I grouped stops that were next to each other and had exactly the same name. At least 2-3,000 stops of the 6,000 stops in the dataset can reasonably be thought of as pairs with one serving each direction of travel.

Comments: 2
Posted in: Analysis | Data | Maps
Tags: | | | | | | | |
1 Boarding 2 Next Page 3 4