This change simplifies TiledElevationCoverage construction by removing the unnecessary cachePath configuration parameter. We could limit the scope of this change by assigning any string to cachePath and leaving TiledElevationCoverage's implementation unchanged. However, TiledElevationCoverage has significant unnecessary complexity that creates and tracks unique elevation tile keys based on the notion that cachePath is necessary. Elevation tiles and elevation images are are stored in an cache unique to each instance of TiledElevationCoverage (rather than a shared cache). Given that, there is no need to generate globally unique cache keys, which is the only purpose served by cachePath. It is enough to use Tile.tileKey, which can uniquely identify each tile in the coverage's tile cache and image cache.
This iteration removes the unnecessary ElevationTile class and replaces its usages with Tile. Additionally, this iteration removes the imagePath properties that derive from cachePath, replacing them with usage of Tile.tileKey or in-place generation of a tile key string (when a tile instance is not available). Given the size of this change, i have left cachePath intact, with the intent to remove it and its usages in the various TiledElevationCoverage implementations in the next iteration.