source: trunk/npemap.org.uk/scripts/tile-processing/makeSmaller.pl @ 423

Last change on this file since 423 was 423, checked in by Nick Burch, 13 years ago

Generate meta files at scale 1

  • Property svn:executable set to *
File size: 3.3 KB
Line 
1#!/usr/bin/perl
2#
3use List::Util qw[min max];
4use Image::Magick;
5
6my $tilesize = 125;
7
8my $scale = shift;
9unless($scale) { $scale = 6; }
10
11# Should we rescale as we go?
12my $rescale_by = 1;
13if($scale > 20) {
14        $rescale_by = 4;
15}
16my $out_tile_size = int($tilesize / $rescale_by);
17
18my $outdir = "scaled$scale";
19
20if (! -d $outdir) {
21    mkdir $outdir or die "Unable to create dir '$outdir'"
22}
23
24my @files = glob("*/tile-*.jpg");
25my %tiles ;
26
27my $minx, $miny, $maxx, $maxy;
28
29foreach my $f (@files) {
30  $f =~ m/-(\d+)-(\d+)\./;
31  my ($x, $y) = ($1 +0, $2 +0);
32  $tiles{$x} ||= {};
33  $tiles{$x}{$y} = $f;
34}
35
36
37$maxx = max(keys %tiles);
38$maxy = max(map { max(keys %{$tiles{$_}})} keys %tiles);
39
40# The meta info's to re-create
41# (Only done for scale 1, and only record the eastings to update)
42my %update_meta;
43
44# start at 0, if there are any tiles in a WxW square, render a scale model
45# of it
46
47foreach my $x (0..($maxx/$scale)) {
48    foreach my $y (0..($maxy/$scale)) {
49        my $filename = sprintf("%s/%03d/%03d.jpg", $outdir, $x, $y);
50                my $meta_filename = sprintf("meta1/%03d.txt", $x);
51        my $outdir = sprintf("%s/%03d/", $outdir, $x);
52               
53                # Do we need to create the meta info?
54                if( ($scale == 1) && (! -f $meta_filename) ) {
55                        $update_meta{$x}++;
56                }
57
58        if( (! -f $filename) && any_tiles($x, $y, \%tiles) ) {
59            print "Making $filename\n";
60            my $out = Image::Magick->new( size => "".($out_tile_size*$scale)."x".($out_tile_size*$scale) );
61            $out ->ReadImage('xc:white');
62
63            unless(-d $outdir) {
64                mkdir($outdir);
65            }
66
67 foreach my $i (0..($scale -1)) {
68     foreach my $j (0..($scale -1)) {
69         if (defined $tiles{($x*$scale)+$i}{($y*$scale)+$j}) {
70            my $input = $tiles{($x*$scale)+$i}{($y*$scale)+$j};
71            my $image = Image::Magick->new;
72            print $image->Read($input);
73                        #print "  Including $input\n";
74
75                        if($rescale_by > 1) {
76                                $image->Resize("${out_tile_size}x${out_tile_size}");
77                                #print "Resized $input to ${out_tile_size}x${out_tile_size}\n";
78                        }
79
80            print $out->Composite(image=>$image, x=> ($i*$out_tile_size), y=> ((($scale -1)-$j)*$out_tile_size) );
81            undef $image;
82        }
83     }
84 }
85
86                        # Do we need to update the meta info?
87                        if($scale == 1) {
88                                $update_meta{$x}++;
89                        }
90                       
91                        # Resize the image to 125x125, and write it out
92            $out->Resize("${tilesize}x$tilesize");
93            $out->Set(quality=>85);
94            $out->Write("jpg:$filename");
95            undef $out;
96            print "($x,$y)\n";
97        }
98   }
99}
100
101# Re-create the meta files
102foreach my $easting (sort keys %update_meta) {
103        my $meta_filename = sprintf("meta1/%03d.txt", $easting);
104        open(META, ">$meta_filename");
105        print META "# easting,northing,sheet,year\n";
106       
107        foreach my $northing (sort keys %{$tiles{$easting}}) {
108                my $file = $tiles{$easting}{$northing};
109                my ($sheet) = ($file =~ /^(\d+\w?)\-/);
110                my ($year) = ($file =~ /^\d+\w?\-tiles\-(\d+)/);
111                print META "${easting},${northing},$sheet,$year\n";
112        }
113
114        print "Recreated $meta_filename\n";
115        close META;
116}
117
118
119use Data::Dumper;
120
121print "($maxx, $maxy)\n";
122
123sub any_tiles {
124 my ($x, $y, $tiles) = (shift, shift, shift);
125 foreach my $i (0..($scale -1)) {
126     foreach my $j (0..($scale -1)) {
127         if (defined $$tiles{($x*$scale)+$i}{($y*$scale)+$j}) {
128             return 1;
129         }
130     }
131 }
132 return 0;
133}
Note: See TracBrowser for help on using the repository browser.