You are here
Home > galleries > transit centers
Transit centers and transportation hubs abound in the San Francisco Bay Area, from intermodal facilities like San Jose Diridon to all-bus facilities like Santa Rosa Transit Mall. To be listed as a transit center or hub, a facility must meet the following:

  • At least two transit lines (bus, rail, ferry) meet at that facility, with at least one line terminating at it
  • Timed transfers can be made at the facility

Descriptions for each of the transit centers will be developed over time.

#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .border-box {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .tabbed-box {
position: relative;
margin: 20px 0;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .tabbed-box-tab-group {
font-size: 0;
margin: 0;
padding: 0;
float: left;
list-style: none;
height: 60px;
width: 100%;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
white-space: nowrap;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .tabbed-box-tab {
margin: 0;
cursor: pointer;
height: 60px;
display: inline-block;
min-width: 19%;
position: relative;
background-color: #F7F7F7;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .tabbed-box-content-group {
clear: both;
float: left;
width: 100%;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .tabbed-box-content {
padding: 40px 20px 40px 20px;
display: none;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .scrollArrow {
width: 25px;
background-color: white;
text-align: center;
position: absolute;
z-index: 3;
top: 0;
display: none;
cursor: pointer;
height: 60px;
line-height: 60px;
font-weight: bold;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .scrollArrow.scrollArrow-left {
left: 0;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .scrollArrow.scrollArrow-right {
right: 0;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .tabbed-box.scrollable .tabbed-box-tab-group {
border-bottom: none;
overflow-x: hidden;
overflow-y: hidden;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .tabbed-box.scrollable .tabbed-box-bar:hover .scrollArrow.active {
display: block;
}
@media only screen and (min-device-width: 414px) and (max-device-width: 736px) and (-webkit-min-device-pixel-ratio: 3),only screen and (min-device-width: 375px) and (max-device-width: 667px) and (-webkit-min-device-pixel-ratio: 2),only screen and (min-device-width: 320px) and (max-device-width: 568px) and (-webkit-min-device-pixel-ratio: 2),only screen and (min-device-width: 320px) and (max-device-width: 480px) and (-webkit-min-device-pixel-ratio: 2),only screen and (max-width: 499px) {
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .tabbed-box-tab-group {
overflow-x: scroll !important;
}
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .standard .tabbed-box-tab-group {
border-left: 1px solid #CCCCCC;
border-bottom: 1px solid #CCCCCC;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .standard .tabbed-box-tab {
border: 1px solid #CCCCCC;
border-left: none;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .standard .tabbed-box-tab .paragraph {
color: #A8ABAC;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .standard .tabbed-box-tab.active {
border-bottom: 1px solid white;
background-color: white;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .standard .tabbed-box-content-group {
border: 1px solid #CCCCCC;
border-top: none;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .standard.scrollable .tabbed-box-tab-group {
border-right: 1px solid #CCCCCC;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .standard.scrollable .tabbed-box-tab-group .tabbed-box-tab:last-child {
border-right: none;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .standard.scrollable .scrollArrow-left {
border: 1px solid #CCCCCC;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .standard.scrollable .scrollArrow-right {
border: 1px solid #CCCCCC;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .line .tabbed-box-tab-group {
border: 1px solid #CCCCCC;
border-bottom: none;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .line .tabbed-box-tab {
border-bottom: 1px solid #CCCCCC;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .line .tabbed-box-tab .paragraph {
color: #BDC2C2;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .line .tabbed-box-tab.active {
border-bottom: 1px solid black;
background-color: white;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .line .tabbed-box-content-group {
border: 1px solid #CCCCCC;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .line.scrollable .tabbed-box-tab-group {
height: 61px;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .line.scrollable .tabbed-box-content-group {
border-top: none;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .line.scrollable .scrollArrow-left,
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .line.scrollable .scrollArrow-right {
border: 1px solid #CCCCCC;
border-bottom: none;
border-top: none;
height: 61px;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .simple .tabbed-box-tab {
border-bottom: 1px solid #CCCCCC;
height: 61px;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .simple .tabbed-box-tab .paragraph {
color: #BDC2C2;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .simple .tabbed-box-tab.active {
border-bottom: 1px solid black;
background-color: white;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .simple .tabbed-box-content-group {
border-top: 1px solid #CCCCCC;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .simple .tabbed-box-content {
padding: 20px 0px 20px 0px;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .simple .scrollArrow-left {
border-right: 1px solid #CCCCCC;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .simple .scrollArrow-right {
border-left: 1px solid #CCCCCC;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .s3d-shadow {
-webkit-box-shadow: #f5f5f5;
-moz-box-shadow: #f5f5f5;
box-shadow: #f5f5f5;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .s3d-content-shadow {
-webkit-box-shadow: 0px 0px 30px 4px #f5f5f5;
-moz-box-shadow: 0px 0px 30px 4px #f5f5f5;
box-shadow: 0px 0px 30px 4px #f5f5f5;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .s3d .tabbed-box-tab .paragraph {
color: #A8ABAC;
background-color: #F7F7F7;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .s3d .tabbed-box-tab.active {
border-bottom: 1px solid white;
background-color: white;
-webkit-box-shadow: 0px -10px 31px -4px #f5f5f5, -12px -4px 40px -16px #f5f5f5, 12px -4px 40px -16px #f5f5f5;
-moz-box-shadow: 0px -10px 31px -4px #f5f5f5, -12px -4px 40px -16px #f5f5f5, 12px -4px 40px -16px #f5f5f5;
box-shadow: 0px -10px 31px -4px #f5f5f5, -12px -4px 40px -16px #f5f5f5, 12px -4px 40px -16px #f5f5f5;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .s3d .tabbed-box-tab.active .paragraph {
background-color: white;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .s3d .tabbed-box-content-group {
-webkit-box-shadow: 0px 0px 30px 4px #f5f5f5;
-moz-box-shadow: 0px 0px 30px 4px #f5f5f5;
box-shadow: 0px 0px 30px 4px #f5f5f5;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .tabbed-box-tab .paragraph {
padding: 0px;
line-height: 60px !important;
text-align: center !important;
font-weight: bold;
font-size: 16px !important;
margin: 0 20px;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .tabbed-box-content .paragraph {
padding: 0;
line-height: 30px;
}
#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3 .tabbed-box-tab:last-child .w-delete-outer {
display: none;
position: relative;
float: right;
}

  • North Bay
  • San Francisco
  • East Bay
  • San Mateo County
  • Santa Clara County
<
>

Marin and Sonoma Counties

  • Windsor Transit Hub
  • Santa Rosa Transit Mall
  • Copeland Street Transit Mall (Petaluma)
  • Redwood & Grant (Novato)
  • San Rafael Transit Center
  • Larkspur Ferry Terminal
  • Donahue & Terners (Marin City)
  • Sausalito Ferry Terminal

Napa and Solano Counties

  • Vacaville Transportation Center
  • Fairfield Transportation Center
  • Vallejo Transit Center
  • Vallejo Ferry Terminal
  • Redwood Park & Ride (Napa)
  • Soscol Gateway Transit Center
  • Golden Gate Bridge Toll Plaza
  • Ferry Building
  • Transbay Terminal
  • San Francisco Caltrain (4th & King)
  • Embarcadero BART/Muni Metro
  • Powell BART/Muni Metro
  • Civic Center BART/Muni Metro
  • Van Ness Muni Metro
  • Castro Muni Metro
  • Forest Hill Muni Metro
  • West Portal Muni Metro
  • 16th Street & Mission BART
  • 24th Street & Mission BART
  • Third & 20th Muni Metro
  • Balboa Park BART/Muni Metro
  • City College Terminal (Geneva & Phelan)

East Bay: Alameda County

  • Downtown Berkeley BART
  • Emeryville Amtrak
  • Rockridge BART
  • MacArthur BART
  • 19th Street/Downtown Oakland BART
  • 12th Street/Oakland City Center BART
  • West Oakland BART
  • Fruitvale BART
  • Coliseum BART
  • Oakland International Airport
  • San Leandro BART
  • Bay Fair BART
  • Hayward BART
  • Dublin/Pleasanton BART
  • Union City BART
  • Fremont BART
  • NewPark Mall (Newark)

East Bay: Contra Costa County

  • Hillcrest Park & Ride (Antioch)
  • Pittsburg/Bay Point BART
  • Martinez Amtrak
  • Concord BART
  • Pleasant Hill BART
  • Walnut Creek BART
  • Richmond Amtrak/BART
  • El Cerrito Del Norte BART
  • San Ramon Transit Center
  • Daly City BART
  • Colma BART
  • South San Francisco BART
  • San Bruno BART
  • San Francisco International Airport
  • Millbrae Intermodal Center
  • Hillsdale Caltrain
  • Redwood City Transit Center

Palo Alto and North County

  • Palo Alto Transit Center
  • Stanford Oval
  • San Antonio Transit Center
  • Mountain View Transit Center
  • Lockheed Martin Transit Center
  • Sunnyvale Transit Center
  • Santa Clara Transit Center
  • Great Mall Transit Center
  • Great America Amtrak/ACE Station

San Jose and South County

  • Civic Center LR Station
  • Downtown San Jose
  • Alum Rock Transit Center
  • Eastridge Transit Center
  • Ohlone/Chynoweth LR Station
  • Snell LR Station
  • Santa Teresa LR Station
  • Morgan Hill Caltrain
  • Main & Hale Transit Center (Morgan Hill)
  • Gilroy Transit Center

function setupElement777170351646324275() {
var requireFunc = window.platformElementRequire || window.require;
// Relies on a global require, specific to platform elements
requireFunc([
‘w-global’,
‘underscore’,
‘jquery’,
‘backbone’,
‘util/platform/elements/PlatformElement’,
‘util/platform/elements/PlatformElementSettings’
], function(
_W,
_,
$,
Backbone,
PlatformElement,
PlatformElementSettings
) {
var dependencies = null || [];
var platform_element_id = “135397292802228534-1.3.6”;
if (typeof _W.loadedPlatformDependencies === ‘undefined’) {
_W.loadedPlatformDependencies = [];
}
if (typeof _W.platformElements === ‘undefined’) {
_W.platformElements = [];
}
if (typeof _W.platformElements[platform_element_id] === ‘undefined’) {
_W.platformElements[platform_element_id] = {};
_W.platformElements[platform_element_id].deferredObject = new $.Deferred();
_W.platformElements[platform_element_id].deferredPromise = _W.platformElements[platform_element_id].deferredObject.promise();
}
if(_.intersection(_W.loadedPlatformDependencies, dependencies).length !== dependencies.length){
_.reduce(dependencies, function(promise, nextScript){
_W.loadedPlatformDependencies.push(nextScript);
return promise.then(function(){
return $.getScript(nextScript);
});
}, $().promise()).then(function(){
_W.platformElements[platform_element_id].deferredObject.resolve();
});
}
if (dependencies.length === 0){
_W.platformElements[platform_element_id].deferredObject.resolve();
}
_W.platformElements[platform_element_id].deferredPromise.done(function(){
var _ElementDefinition = /**
* This is required for element rendering to be possible
* @type {PlatformElement}
*/
(function() {
var TabbedBox = PlatformElement.extend({
events: {
‘click .tabbed-box-tab’: ‘clickTab’,
// in case they type and that causes an overflow, we should determine scrollability here
‘keyup .tabbed-box-tab .paragraph’: ‘determineScrollability’,
‘mousedown .scrollArrow-left’: ‘scrollLeft’,
‘mousedown .scrollArrow-right’: ‘scrollRight’,
‘touchstart .scrollArrow-left’: ‘scrollLeft’,
‘touchstart .scrollArrow-right’: ‘scrollRight’
},
initialize: function() {
var view = this;
// optimization
this.scrollArrowLeft = this.$(‘> .tabbed-box > .tabbed-box-bar > .scrollArrow-left’);
this.scrollArrowRight = this.$(‘> .tabbed-box > .tabbed-box-bar > .scrollArrow-right’);
this.scrollTabsBar = this.$(‘> .tabbed-box > .tabbed-box-bar > .tabbed-box-tab-group’);
// resize handler and mouseup handler
// since we want to be able to handle mouseup wherever the user releases (not just over the element)
// we set it here as a property of the window.
$(window).resize(function() {
this.determineScrollability();
}.bind(this)).on(‘mouseup touchend’, function() {
this.stopScrolling();
}.bind(this));
// since scroll events don’t propagate up, we have to bind it here as opposed to in the events object
this.scrollTabsBar.scroll(function() {
this.determineHandlers();
}.bind(this));
// determine whether or not we should show the scroll handlers
this.determineScrollability();
// load the first tab.
$(document).ready(function() {
this.scrollTabsBar.children().first().click();
}.bind(this));
},
/*
Handle click event on a tab.
Uses ‘rel’ attribute of each tab as an index to access
the class of the corresponding content area.
*/
clickTab: function(e) {
var active = $(e.currentTarget); // Clicked tab
var content_wrapper = this.$(‘> .tabbed-box > .tabbed-box-content-group’); // wrapper for all content divs
this.stopScrolling();
this.determineClickScroll(active);
// Set new active tab
active.siblings().removeClass(‘active’);
active.addClass(‘active’);
// mark the new active tab
this.settings.set(‘activeTabIndexInternal’, this.scrollTabsBar.children().index(active));
this.settings.save();
// trigger children first
content_wrapper.find(‘.tabbed-box-tab.active’).click();
// Set new active content
content_wrapper.children().hide();
content_wrapper.find(‘> .’ + active.attr(‘rel’)).fadeIn();
this.determineHandlers();
// fire resize event to handle any deterministic elements now appearing
$(window).resize();
// Stop propagation in case this is a nested tab app
e.stopPropagation();
},
// determines whether or not the two arrows (left and right scroll handlers) should be visible or not.
determineScrollability: function() {
var group = this.scrollTabsBar[0];
if (group.scrollWidth > group.clientWidth) {
this.$el.children().addClass(‘scrollable’);
this.determineHandlers();
} else {
this.$el.children().removeClass(‘scrollable’);
}
},
// determines whether or not the two arrows (left and right scroll handlers) should be active or not.
determineHandlers: function() {
var target = this.scrollTabsBar[0];
// left handler
if (target.scrollLeft !== 0) {
this.scrollArrowLeft.addClass(‘active’);
} else {
this.scrollArrowLeft.removeClass(‘active’);
}
// right handler
if (target.scrollLeft + target.clientWidth < target.scrollWidth – 1) {
this.scrollArrowRight.addClass('active');
} else {
this.scrollArrowRight.removeClass('active');
}
},
// scrolls the tabs bar to the left.
scrollLeft: function(e) {
e.stopPropagation();
this.stopScrolling();
var scrollEl = this.scrollTabsBar[0];
var view = this;
var factor = 2;
this.scrollArrowRight.addClass('active');
this.scrollInterval = setInterval(function() {
scrollEl.scrollLeft -= Math.floor(factor);
factor *= 1.05;
if (scrollEl.scrollLeft === 0) {
view.stopScrolling();
}
}, 10);
},
// scrolls the tabs bar to the right.
scrollRight: function(e) {
e.stopPropagation();
this.stopScrolling();
var scrollEl = this.scrollTabsBar[0];
var view = this;
var factor = 2;
this.scrollArrowLeft.addClass('active');
this.scrollInterval = setInterval(function() {
scrollEl.scrollLeft += Math.floor(factor);
factor *= 1.05;
// forcefully stop the interval if it's not doing anything anymore
if (scrollEl.scrollLeft + scrollEl.clientWidth == scrollEl.scrollWidth) {
view.stopScrolling();
}
}, 10);
},
stopScrolling: function() {
clearInterval(this.scrollInterval);
this.determineHandlers();
},
determineClickScroll: function(active) {
// figure out where the element is, and if we need to change our view to show it
var scroll;
// determine where the element we're going to is in respect to the tabs bar
// 25px is the size of the scroll arrows
var leftSidePosition = active.position().left – 50;
var rightSidePosition = active.position().left + active.width() + 50;
// the gap is how much space we want there to be between the selected element
// when it's out of view, and we go to it.
var gap = 25;
if (this.scrollTabsBar.children().index(active) === 0) {
// this the first element, so define the scroll to be 0.
scroll = 0;
} else if (this.scrollTabsBar.children().index(active) == this.scrollTabsBar.children().length – 1) {
// this the last element, so define the scroll to be all the way to the right.
scroll = this.scrollTabsBar[0].scrollWidth – this.scrollTabsBar[0].clientWidth;
} else if (leftSidePosition this.scrollTabsBar.width()) {
// the right corner is out of view.
scroll = this.scrollTabsBar[0].scrollLeft + (rightSidePosition – this.scrollTabsBar.width()) + gap;
} else {
scroll = this.scrollTabsBar[0].scrollLeft;
}
// start scrolling
scroll = Math.floor(scroll);
var delta = scroll – this.scrollTabsBar[0].scrollLeft;
var startedDown = false;
if (delta !== 0) {
clearInterval(this.scrollInterval);
var distance = 0;
var direction = (delta > 0 ? 1 : -1);
var speed = 1;
var factor = 1.25; // for parabolic acceleration
this.scrollInterval = setInterval(function() {
if (distance >= Math.abs(delta)) {
this.stopScrolling();
}
this.scrollTabsBar[0].scrollLeft += (Math.max(1, Math.floor(speed)) * direction);
distance += Math.max(1, Math.floor(speed));
if (distance * 2 >= Math.abs(delta)) { // if we’ve traversed more than half
if (factor == 1.25) { // 5/4
factor = 1; // 4/4
} else {
factor = 0.8; // 4/5
}
}
speed *= factor;
}.bind(this), 20);
}
}
});
return TabbedBox;
})();
if (typeof _ElementDefinition == ‘undefined’ || typeof _ElementDefinition == ‘null’) {
var _ElementDefinition = PlatformElement.extend({});
}
var _Element = _ElementDefinition.extend({
initialize: function() {
// we still want to call the initialize function defined by the developer
// however, we don’t want to call it until placeholders have been replaced
this.placeholderInterval = setInterval(function() {
// so use setInterval to check for placeholders.
if (this.$(‘.platform-element-child-placeholder’).length == 0) {
clearInterval(this.placeholderInterval);
this.constructor.__super__.initialize.apply(this);
}
}.bind(this), 100);
}
});
_Element.prototype.settings = new PlatformElementSettings({“tabs_each”:[{“tabs_index”:0},{“tabs_index”:1},{“tabs_index”:2},{“tabs_index”:3},{“tabs_index”:4}],”theme”:”standard”,”tabs”:5,”active_tab”:”white”,”inactive_tab”:”#F7F7F7″,”border_color”:”#CCCCCC”,”activeTabIndexInternal”:0});
_Element.prototype.settings.page_element_id = “777170351646324275”;
_Element.prototype.element_id = “b9234e74-99e5-4936-b9ac-43f1d70e0da3”;
_Element.prototype.user_id = “3466466”;
_Element.prototype.site_id = “484589221176252212”;
_Element.prototype.assets_path = “//marketplace.editmysite.com/elements/135397292802228534-1.3.6/assets/”;
new _Element({
el: ‘#element-b9234e74-99e5-4936-b9ac-43f1d70e0da3’
});
});
});
}
if (typeof document.documentElement.appReady == ‘undefined’) {
document.documentElement.appReady = 0;
}
if (document.documentElement.appReady || (window.inEditor && window.inEditor())) {
setupElement777170351646324275();
} else if (document.createEvent && document.addEventListener) {
document.addEventListener(‘appReady’, setupElement777170351646324275, false);
} else {
document.documentElement.attachEvent(‘onpropertychange’, function(event){
if (event.propertyName == ‘appReady’) {
setupElement777170351646324275();
}
});
}

Top