addLayer(layer, beforeId) {
        const me = this;

        if (layer.type === 'three') {
            new ThreeLayer(layer).onAdd(me, beforeId);
        } else if (layer.type === 'geojson') {
            new GeoJsonLayer(layer).onAdd(me, beforeId);
        } else if (layer.type === 'tile-3d') {
            new Tile3DLayer(layer).onAdd(me, beforeId);
        } else {
            me.map.addLayer(layer, beforeId || 'poi');
        }
        return me;
    }
Adds a layer to the map.
@param {Object | CustomLayerInterface | GeoJsonLayerInterface | ThreeLayerInterface | Tile3DLayerInterface} layer
    - The layer to add, conforming to either the Mapbox Style Specification's
    layer definition, the CustomLayerInterface specification, the
    GeoJsonLayerInterface specification, the ThreeLayerInterface specification
    or the Tile3DLayerInterface specification
@param {string} beforeId - The ID of an existing layer to insert the new
    layer before
@returns {Map} Returns itself to allow for method chaining