cartodb/app/model_factories/carto/layer_factory.rb
2020-06-15 10:58:47 +08:00

75 lines
2.3 KiB
Ruby

module Carto
class LayerFactory
def self.build_default_base_layer(user)
basemap = user.default_basemap.except('default')
options = if basemap['className'] === 'googlemaps'
{ kind: 'gmapsbase', options: basemap }
else
{ kind: 'tiled', options: basemap }
end
Carto::Layer.new(options)
end
def self.build_default_labels_layer(base_layer)
base_layer_options = base_layer.options
Carto::Layer.new(
kind: 'tiled',
options: base_layer_options.except('className', 'labels').merge(
'type' => 'Tiled',
'name' => "#{base_layer_options['name']} Labels"
).merge(base_layer_options['labels'])
)
end
def self.build_data_layer(user_table)
user = user_table.user
geometry_type = user_table.geometry_type
data_layer = Carto::Layer.new(Cartodb.config[:layer_opts]['data'].deep_dup)
layer_options = data_layer.options
layer_options['table_name'] = user_table.name
layer_options['user_name'] = user.username
layer_options['tile_style'] = tile_style(user, geometry_type)
data_layer.infowindow ||= {}
data_layer.infowindow['fields'] = []
data_layer.tooltip ||= {}
data_layer.tooltip['fields'] = []
if user.builder_enabled?
data_layer.options['style_properties'] = style_properties(geometry_type)
end
data_layer
end
# private
def self.style_properties(geometry_type)
{
type: 'simple',
properties: Carto::Form.new(geometry_type).to_hash
}
end
private_class_method :style_properties
def self.tile_style(user, geometry_type)
user.builder_enabled? ? builder_tile_style(geometry_type) : legacy_tile_style(geometry_type)
end
private_class_method :tile_style
def self.builder_tile_style(geometry_type)
style_class = Carto::Styles::Style.style_for_geometry_type(geometry_type)
style_class ? style_class.new.to_cartocss : legacy_tile_style(geometry_type)
end
private_class_method :builder_tile_style
def self.legacy_tile_style(geometry_type)
"#layer #{Cartodb.config[:layer_opts]['default_tile_styles'][geometry_type]}"
end
private_class_method :legacy_tile_style
end
end