diff options
Diffstat (limited to 'perllib/FixMyStreet/Map/WMTSBase.pm')
-rw-r--r-- | perllib/FixMyStreet/Map/WMTSBase.pm | 195 |
1 files changed, 24 insertions, 171 deletions
diff --git a/perllib/FixMyStreet/Map/WMTSBase.pm b/perllib/FixMyStreet/Map/WMTSBase.pm index 051f8f369..e482b3f37 100644 --- a/perllib/FixMyStreet/Map/WMTSBase.pm +++ b/perllib/FixMyStreet/Map/WMTSBase.pm @@ -4,40 +4,9 @@ # methods. See, e.g. FixMyStreet::Map::Zurich or FixMyStreet::Map::Bristol. package FixMyStreet::Map::WMTSBase; +use parent FixMyStreet::Map::WMXBase; use strict; -use Math::Trig; -use Utils; -use JSON::MaybeXS; - -sub scales { - my $self = shift; - my @scales = ( - # A list of scales corresponding to zoom levels, e.g. - # '192000', - # '96000', - # '48000', - # etc... - ); - return @scales; -} - -# The copyright string to display in the corner of the map. -sub copyright { - return ''; -} - -# A hash of parameters that control the zoom options for the map -sub zoom_parameters { - my $self = shift; - my $params = { - zoom_levels => scalar $self->scales, - default_zoom => 0, - min_zoom_level => 0, - id_offset => 0, - }; - return $params; -} # A hash of parameters used in calculations for map tiles sub tile_parameters { @@ -58,162 +27,46 @@ sub tile_parameters { return $params; } -# This is used to determine which template to render the map with -sub map_template { 'fms' } +sub _get_tile_params { + my ($self, $params, $left_col, $top_row, $z, $tile_url) = @_; -# Reproject a WGS84 lat/lon into an x/y coordinate in this map's CRS. -# Subclasses will want to override this. -sub reproject_from_latlon($$$) { - my ($self, $lat, $lon) = @_; - return (0.0, 0.0); + return ($tile_url, $z, $self->tile_parameters->{suffix}); } -# Reproject a x/y coordinate from this map's CRS into WGS84 lat/lon -# Subclasses will want to override this. -sub reproject_to_latlon($$$) { - my ($self, $x, $y) = @_; - return (0.0, 0.0); +sub _get_tile_src { + my ($self, $tile_url, $z, $suffix, $col, $row) = @_; + + return sprintf( '%s/%d/%d/%d%s', + $tile_url, $z, $row, $col, $suffix); } +sub _get_tile_id { + my ($self, $tile_url, $x, $suffix, $col, $row) = @_; -sub map_tiles { - my ($self, %params) = @_; - my ($left_col, $top_row, $z) = @params{'x_left_tile', 'y_top_tile', 'matrix_id'}; - my $tile_url = $self->tile_base_url; - my $tile_suffix = $self->tile_parameters->{suffix}; - my $cols = $params{cols}; - my $rows = $params{rows}; - - my @col_offsets = (0.. ($cols-1) ); - my @row_offsets = (0.. ($rows-1) ); - - return [ - map { - my $row_offset = $_; - [ - map { - my $col_offset = $_; - my $row = $top_row + $row_offset; - my $col = $left_col + $col_offset; - my $src = sprintf '%s/%d/%d/%d%s', - $tile_url, $z, $row, $col, $tile_suffix; - my $dotted_id = sprintf '%d.%d', $col, $row; - - # return the data structure for the cell - +{ - src => $src, - row_offset => $row_offset, - col_offset => $col_offset, - dotted_id => $dotted_id, - alt => "Map tile $dotted_id", # TODO "NW map tile"? - } - } - @col_offsets - ] - } - @row_offsets - ]; + return sprintf( '%d.%d', $col, $row); } -# display_map C PARAMS -# PARAMS include: -# latitude, longitude for the centre point of the map -# CLICKABLE is set if the map is clickable -# PINS is array of pins to show, location and colour -sub display_map { - my ($self, $c, %params) = @_; - - # Map centre may be overridden in the query string - $params{latitude} = Utils::truncate_coordinate($c->get_param('lat') + 0) - if defined $c->get_param('lat'); - $params{longitude} = Utils::truncate_coordinate($c->get_param('lon') + 0) - if defined $c->get_param('lon'); - - $params{rows} //= 2; # 2x2 square is default - $params{cols} //= 2; - - my $zoom_params = $self->zoom_parameters; - - $params{zoom} = do { - my $zoom = defined $c->get_param('zoom') - ? $c->get_param('zoom') + 0 - : $c->stash->{page} eq 'report' - ? $zoom_params->{default_zoom}+1 - : $zoom_params->{default_zoom}; - $zoom = $zoom_params->{zoom_levels} - 1 - if $zoom >= $zoom_params->{zoom_levels}; - $zoom = 0 if $zoom < 0; - $zoom; - }; +sub _get_row { + my ($self, $top_row, $row_offset, $size) = @_; + return $top_row + $row_offset; +} - $c->stash->{map} = $self->get_map_hash( %params ); - - if ($params{print_report}) { - $params{zoom}++ unless $params{zoom} >= $zoom_params->{zoom_levels}; - $c->stash->{print_report_map} - = $self->get_map_hash( - %params, - img_type => 'img', - cols => 4, rows => 4, - ); - # NB: we can passthrough img_type as literal here, as only designed for print - - # NB we can do arbitrary size, including non-squares, however we'd have - # to modify .square-map style with padding-bottom percentage calculated in - # an inline style: - # <zarino> in which case, the only change that'd be required is - # removing { padding-bottom: 100% } from .square-map__outer, putting - # the percentage into an inline style on the element itself, and then - # probably renaming .square-map__* to .fixed-aspect-map__* or something - # since it's no longer necessarily square - } +sub _get_col { + my ($self, $left_col, $col_offset, $size) = @_; + return $left_col + $col_offset; } -sub get_map_hash { - my ($self, %params) = @_; - - @params{'x_centre_tile', 'y_centre_tile', 'matrix_id'} - = $self->latlon_to_tile_with_adjust( - @params{'latitude', 'longitude', 'zoom', 'rows', 'cols'}); - - # centre_(row|col) is either in middle, or just to right. - # e.g. if centre is the number in parens: - # 1 (2) 3 => 2 - int( 3/2 ) = 1 - # 1 2 (3) 4 => 3 - int( 4/2 ) = 1 - $params{x_left_tile} = $params{x_centre_tile} - int($params{cols} / 2); - $params{y_top_tile} = $params{y_centre_tile} - int($params{rows} / 2); - - $params{pins} = [ - map { - my $pin = { %$_ }; # shallow clone - ($pin->{px}, $pin->{py}) - = $self->latlon_to_px($pin->{latitude}, $pin->{longitude}, - @params{'x_left_tile', 'y_top_tile', 'zoom'}); - $pin; - } @{ $params{pins} } - ]; +sub map_type { 'OpenLayers.Layer.WMTS' } + +sub _map_hash_extras { + my $self = shift; - my @scales = $self->scales; return { - %params, - type => $self->map_template, - map_type => 'OpenLayers.Layer.WMTS', - tiles => $self->map_tiles( %params ), - copyright => $self->copyright(), - zoom => $params{zoom}, - zoomOffset => $self->zoom_parameters->{min_zoom_level}, - numZoomLevels => $self->zoom_parameters->{zoom_levels}, - tile_size => $self->tile_parameters->{size}, - tile_dpi => $self->tile_parameters->{dpi}, - tile_urls => encode_json( $self->tile_parameters->{urls} ), - tile_suffix => $self->tile_parameters->{suffix}, - layer_names => encode_json( $self->tile_parameters->{layer_names} ), layer_style => $self->tile_parameters->{layer_style}, matrix_set => $self->tile_parameters->{matrix_set}, - map_projection => $self->tile_parameters->{projection}, origin_x => force_float_format($self->tile_parameters->{origin_x}), origin_y => force_float_format($self->tile_parameters->{origin_y}), - scales => encode_json( \@scales ), + tile_suffix => $self->tile_parameters->{suffix}, }; } |