63 lines
1.7 KiB
Ruby
63 lines
1.7 KiB
Ruby
require_dependency 'carto/bounding_box_service'
|
|
|
|
module Carto::MapBoundaries
|
|
MAXIMUM_ZOOM = 18
|
|
|
|
def set_default_boundaries!
|
|
bounds = get_map_bounds
|
|
bounds ? set_viewport_from_bounds(bounds) : set_default_viewport
|
|
save
|
|
rescue => exception
|
|
CartoDB::Logger.error(exception: exception, message: 'Error setting default bounds')
|
|
end
|
|
|
|
def recalculate_bounds!
|
|
set_boundaries(get_map_bounds || Carto::BoundingBoxUtils::DEFAULT_BOUNDS)
|
|
save
|
|
end
|
|
|
|
private
|
|
|
|
def set_viewport_from_bounds(bounds)
|
|
set_boundaries(bounds)
|
|
recenter_using_bounds(bounds)
|
|
recalculate_zoom(bounds)
|
|
end
|
|
|
|
def set_default_viewport
|
|
set_boundaries(Carto::BoundingBoxUtils::DEFAULT_BOUNDS)
|
|
self.center = Carto::Map::DEFAULT_OPTIONS[:center]
|
|
self.zoom = Carto::Map::DEFAULT_OPTIONS[:zoom]
|
|
end
|
|
|
|
def set_boundaries(bounds)
|
|
# switch to (lat,lon) for the frontend
|
|
self.view_bounds_ne = "[#{bounds[:maxy]}, #{bounds[:maxx]}]"
|
|
self.view_bounds_sw = "[#{bounds[:miny]}, #{bounds[:minx]}]"
|
|
end
|
|
|
|
def recenter_using_bounds(bounds)
|
|
x = (bounds[:maxx] + bounds[:minx]) / 2
|
|
y = (bounds[:maxy] + bounds[:miny]) / 2
|
|
self.center = "[#{y},#{x}]"
|
|
end
|
|
|
|
def recalculate_zoom(bounds)
|
|
latitude_size = bounds[:maxy] - bounds[:miny]
|
|
longitude_size = bounds[:maxx] - bounds[:minx]
|
|
|
|
# Don't touch zoom if the table is empty or has no bounds
|
|
return if longitude_size.zero? && latitude_size.zero?
|
|
|
|
zoom = -1 * ((Math.log([longitude_size, latitude_size].max) / Math.log(2)) - (Math.log(360) / Math.log(2)))
|
|
zoom = [[zoom.round, 1].max, MAXIMUM_ZOOM].min
|
|
|
|
self.zoom = zoom
|
|
end
|
|
|
|
def get_map_bounds
|
|
# (lon,lat) as comes out from postgis
|
|
Carto::BoundingBoxService.new(user, table_name).table_bounds
|
|
end
|
|
end
|