We propose coordination mechanisms for multiple heterogeneous physical agents that operate in city-scale disaster scenarios, where they need to find and rescue people and extinguish fires. Large-scale disasters are characterized by limited and unreliable communications; dangerous events that may disable agents; uncertainty about the location, duration, and type of tasks; and stringent temporal constraints on task completion times. In our approach, agents form teams with other agents that are in the same geographical area. Our algorithms either yield stable teams formed up front and never change, fluid teams where agents can change teams as need arises, or teams that restrict the types of agents that can belong to the same team. We compare our teaming algorithms against a baseline algorithm in which agents operate independently of others and two state-of-the-art coordination mechanisms. Our algorithms are tested in city-scale disaster simulations using the RoboCup Rescue simulator. Our experiments with different city maps show that, in general, forming teams leads to increased task completion and, specifically, that our teaming method that restricts the types of agents in a team outperforms the other methods.