aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/FixMyStreet/Map/CheshireEast.pm
blob: 4e59f25931d935d70be50a3c4fe28758e29fa1ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package FixMyStreet::Map::CheshireEast;
use base 'FixMyStreet::Map::OSM';

use strict;
use Utils;

use constant MIN_ZOOM_LEVEL => 7;

sub map_javascript { [
    '/vendor/OpenLayers/OpenLayers.wfs.js',
    '/js/map-OpenLayers.js',
    '/js/map-cheshireeast.js',
] }

sub tile_parameters { {
    origin_x => -3276800,
    origin_y => 3276800,
} }

sub resolutions { (
    1792.003584007169,
    896.0017920035843,
    448.0008960017922,
    224.0004480008961,
    112.000224000448,
    56.000112000224014,
    28.000056000111993,
    14.000028000056004,
    7.000014000028002,
    2.8000056000112004,
    1.4000028000056002,
    0.7000014000028001,
    0.35000070000140004,
    0.14000028000056003,
) }

my $url = 'https://maps-cache.cheshiresharedservices.gov.uk/maps/?wmts/CE_OS_AllBasemaps_COLOUR/oscce_grid/%d/%d/%d.jpeg&KEY=3a3f5c60eca1404ea114e6941c9d3895';

sub map_tiles {
    my ( $self, %params ) = @_;
    my ( $x, $y, $z ) = ( $params{x_tile}, $params{y_tile}, $params{zoom_act} );
    return [
        sprintf($url, $z, $x-1, $y-1),
        sprintf($url, $z, $x, $y-1),
        sprintf($url, $z, $x-1, $y),
        sprintf($url, $z, $x, $y),
    ];
}

sub latlon_to_tile($$$$) {
    my ($self, $lat, $lon, $zoom) = @_;
    my ($x, $y) = eval { Utils::convert_latlon_to_en($lat, $lon) };
    my $tile_params = $self->tile_parameters;
    my $res = ($self->resolutions)[$zoom];
    my $fx = ( $x - $tile_params->{origin_x} ) / ($res * 256);
    my $fy = ( $tile_params->{origin_y} - $y ) / ($res * 256);
    return ( $fx, $fy );
}

sub tile_to_latlon {
    my ($self, $fx, $fy, $zoom) = @_;
    my $tile_params = $self->tile_parameters;
    my $res = ($self->resolutions)[$zoom];
    my $x = $fx * $res * 256 + $tile_params->{origin_x};
    my $y = $tile_params->{origin_y} - $fy * $res * 256;
    my ($lat, $lon) = Utils::convert_en_to_latlon($x, $y);
    return ( $lat, $lon );
}

1;