getTile(coord, zoom, ownerDocument) {
    var maxCoord = 1 << zoom;

    // If the position is out of bounds, return an empty tile immediately.
    if (zoom < this.minZoom || coord.y < 0 || coord.y >= maxCoord) {
      return ownerDocument.createElement('div');
    }

    // Wrap longitude around.
    var x = coord.x % maxCoord;
    if (x < 0) {
      x += maxCoord;
    }
    var normalizedCoord = new google.maps.Point(x, coord.y);

    // Create the tile.
    var uniqueId = this.getUniqueTileId_(coord, zoom);
    var tile = this.createTile(normalizedCoord, zoom, ownerDocument, uniqueId);
    tile.tileSize = this.tileSize;
    goog.style.setOpacity(tile.div, this.opacity);
    this.tilesById.set(uniqueId, tile);

    // Notify listeners when tile status changes.
    this.registerStatusChangeListener_(tile);

    // Notify listeners that the tile has been created.
    this.dispatchEvent(
        new ee.layers.TileStartEvent(this.getLoadingTilesCount()));

    // Use the current time in seconds as the priority for the tile
    // loading queue. Smaller priorities move to the front of the queue,
    // which is what we want - the Maps API loads the tiles in a spiral
    // starting from the center, and we would like to preserve this order.
    // Requests for tiles that are no longer visible won't clog the queue:
    // if the map is moved around a lot, Maps API calls our releaseTile()
    // method, and the obsolete requests will be removed from the queue.
    var priority = new Date().getTime() / 1000;

    this.tileSource.loadTile(tile, priority);

    // Return the tile's DIV, which is expected by the Maps API.
    return tile.div;
  }
Implements getTile() for the google.maps.MapType interface.
@param {?google.maps.Point} coord Position of tile.
@param {number} zoom Zoom level.
@param {?Document} ownerDocument Parent document.
@return {?Element} Element to be displayed as a map tile.