source: subversion/applications/editors/osmpedit/landsattile.pm @ 34348

Last change on this file since 34348 was 734, checked in by tpersson, 14 years ago

Initial commit of osmpedit

File size: 7.1 KB
Line 
1#    Copyright (C) 2005 Tommy Persson, tpe@ida.liu.se
2#
3#    This program is free software; you can redistribute it and/or modify
4#    it under the terms of the GNU General Public License as published by
5#    the Free Software Foundation; either version 2 of the License, or
6#    (at your option) any later version.
7#
8#    This program is distributed in the hope that it will be useful,
9#    but WITHOUT ANY WARRANTY; without even the implied warranty of
10#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11#    GNU General Public License for more details.
12#
13#    You should have received a copy of the GNU General Public License
14#    along with this program; if not, write to the Free Software
15#    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA
16
17package landsattile;
18
19use strict;
20
21use FindBin qw($RealBin);
22use lib "$RealBin/../perl";
23
24use curl;
25
26#rice:~/demdata/rg> wgs84tolocal 55.723 13.471 0
27#-16.732004 -89.674796 -50.670343 --- revinge
28#rice:~/demdata/rg> wgs84tolocal 55.724 13.472 0
29#49.836450 19.512504 -50.670027 --- revinge
30# 66.5685  109.18   0.6097
31#
32# rice:~/demdata/rg> wgs84tolocal 55.724 13.4715 0
33# 18.427472 20.570532 -50.670900 --- revinge
34# rice:~/demdata/rg> wgs84tolocal 55.7235 13.472 0
35# 47.961996 -36.139303 -50.669311 --- revinge
36# 64.69  53.54  1.21
37#
38#
39
40
41sub new {
42    my $this = shift;
43    my $class = ref($this) || $this;
44    bless {
45        NAME => "UNSPECIFIED",
46        WEST => 0,
47        SOUTH => 0,
48        EAST => 0,
49        NORTH => 0,
50        DATA => "",
51        PIXELWIDTH => 600,
52        PIXELHEIGHT => 500,
53        LAT => 0,
54        LON => 0,
55        DELTALAT => 0.0005,
56        DELTALON => 0.001,   # Gives ratio 1.2 in meter
57        SCALE => 100,
58        FILENAME => "",
59        FRAME => 0,
60        CANVAS => 0,
61        IMAGE => 0,
62        IMAGEITEM => 0,
63        MARKERITEM => 0,
64        MARKERITEM2 => 0,
65        MARKERFLAG => 0,
66        @_
67        }, $class;
68}
69
70sub get_pixel_width {
71    my $self = shift;
72    return $self->{PIXELWIDTH};
73}
74
75sub get_pixel_height {
76    my $self = shift;
77    return $self->{PIXELHEIGHT};
78}
79
80sub set_filename {
81    my $self = shift;
82    my $val = shift;
83    $self->{FILENAME} = $val;
84}
85
86sub get_filename {
87    my $self = shift;
88    return $self->{FILENAME};;
89}
90
91sub set_frame {
92    my $self = shift;
93    my $val = shift;
94    $self->{FRAME} = $val;
95}
96
97sub get_frame {
98    my $self = shift;
99    return $self->{FRAME};;
100}
101
102sub set_canvas {
103    my $self = shift;
104    my $val = shift;
105    $self->{CANVAS} = $val;
106}
107
108sub get_canvas {
109    my $self = shift;
110    return $self->{CANVAS};;
111}
112
113sub set_image {
114    my $self = shift;
115    my $val = shift;
116    $self->{IMAGE} = $val;
117}
118
119sub get_image {
120    my $self = shift;
121    return $self->{IMAGE};;
122}
123
124sub set_scale {
125    my $self = shift;
126    my $val = shift;
127    $self->{SCALE} = $val;
128}
129
130sub get_scale {
131    my $self = shift;
132    return $self->{SCALE};
133}
134
135sub set_data {
136    my $self = shift;
137    my $val = shift;
138    $self->{DATA} = $val;
139}
140
141sub get_data {
142    my $self = shift;
143    return $self->{DATA};;
144}
145
146sub set_lat {
147    my $self = shift;
148    my $val = shift;
149    $self->{LAT} = $val;
150}
151
152sub get_lat {
153    my $self = shift;
154    return $self->{LAT};;
155}
156
157sub set_deltalat {
158    my $self = shift;
159    my $val = shift;
160    $self->{DELTALAT} = $val;
161}
162
163sub get_deltalat {
164    my $self = shift;
165    return $self->{DELTALAT};;
166}
167
168sub set_lon {
169    my $self = shift;
170    my $val = shift;
171    $self->{LON} = $val;
172}
173
174sub get_lon {
175    my $self = shift;
176    return $self->{LON};;
177}
178
179sub set_deltalon {
180    my $self = shift;
181    my $val = shift;
182    $self->{DELTALON} = $val;
183}
184
185sub get_deltalon {
186    my $self = shift;
187    return $self->{DELTALON};;
188}
189
190sub set_area {
191    my $self = shift;
192    my $west = shift;
193    my $south = shift;
194    my $east = shift;
195    my $north = shift;
196    $self->{WEST} = $west;
197    $self->{SOUTH} = $south;
198    $self->{EAST} = $east;
199    $self->{NORTH} = $north;
200}
201
202sub get_area {
203    my $self = shift;
204    my $west = $self->{WEST};
205    my $south = $self->{SOUTH};
206    my $east = $self->{EAST};
207    my $north = $self->{NORTH};
208    return ($west, $south, $east, $north);
209}
210
211sub set_center {
212   my $self = shift;
213   my $lat = shift;
214   my $lon = shift;
215   $self->set_lat ($lat);
216   $self->set_lon ($lon);
217   my $dlat = $self->{DELTALAT};
218   my $dlon = $self->{DELTALON};
219   my $scale = $self->get_scale ();
220   $self->set_area ($lon-$dlon*$scale/2, 
221                    $lat-$dlat*$scale/2, $lon+$dlon*$scale/2, 
222                    $lat+$dlat*$scale/2);
223}
224
225sub load  {
226    my $self = shift;
227    my $west = $self->{WEST};
228    my $south = $self->{SOUTH};
229    my $east = $self->{EAST};
230    my $north = $self->{NORTH};
231    my $w = $self->{PIXELWIDTH};
232    my $h = $self->{PIXELHEIGHT};
233    my $lat = $self->get_lat ();
234    my $lon = $self->get_lon ();
235    my $scale = $self->get_scale ();
236    my $filename = "landsat-$scale";
237    if ($lat > 0) {
238        $filename .= "+";
239    }
240    $filename .= "$lat";
241    if ($lon > 0) {
242        $filename .= "+";
243    }
244    $filename .= "$lon";
245    $filename = "$ENV{HOME}/.osmpedit/cache/$filename.jpg";
246    print STDERR "Check cache: $filename\n";
247
248    if (not -d "$ENV{HOME}/.osmpedit") {
249        mkdir "$ENV{HOME}/.osmpedit";
250    }
251
252    if (not -d "$ENV{HOME}/.osmpedit/cache") {
253        mkdir "$ENV{HOME}/.osmpedit/cache";
254    }
255
256    if (-f "$filename") {
257        open JPG, "<$filename" or die "Could not open file $filename: $!";
258        {
259            local $/;
260            my $data = <JPG>;
261            $self->set_data ($data);
262        }
263    } else {
264        my $data = curl::grab_landsat ($west, $south, $east, $north, $w, $h);
265        if ($data < 0)  {
266            print STDERR "WARNING: Failed to load landsat image\n";
267            return;
268        } else {
269            $self->set_data ($data);
270            open JPG, ">$filename" or die "Could not open file $filename: $!";
271            print JPG "$data";
272            close JPG;
273        }
274    }
275    $self->set_filename ($filename);
276    my $image = $self->get_frame ()->Photo (-format => "jpeg",
277                                            -file => "$filename"
278                                            );
279    $self->set_image ($image);
280}
281
282sub save {
283    my $self = shift;
284    my $name = shift;
285    open JPG, ">$name";
286    print JPG "$self->{DATA}";
287    close JPG;
288}
289
290sub display {
291    my $self = shift;
292    my $lat = shift;
293    my $lon = shift;
294
295    my $item = $self->{IMAGEITEM};
296    my $can = $self->get_canvas();
297   
298    if (not $item) {
299        if ($self->get_image ()) {
300            $item = $can->createImage (0, 0,
301                                       -anchor => "nw",
302                                       -image => $self->get_image (),
303                                       -tag => "image");
304            $self->{IMAGEITEM} = $item;
305        }
306        if ($self->{MARKERFLAG}) {
307            my $colour = "yellow";
308            my $obj = $can->create ('line', 0, 0, 0, 0,
309                                    -fill => $colour,
310                                    -tag => "imagemarker");
311            $self->{MARKERITEM} = $obj;
312            $obj = $can->create ('line', 0, 0, 0, 0,
313                                 -fill => $colour,
314                                 -tag => "imagemarker");
315            $self->{MARKERITEM2} = $obj;
316        }
317
318    }
319
320    my $w = $self->get_pixel_width ();
321    my $h = $self->get_pixel_height ();
322    my ($west, $south, $east, $north) = $self->get_area ();
323    my $clat = $self->get_lat ();
324    my $clon = $self->get_lon ();
325
326    my $x = -($lon-$clon)/($east-$west)*$w;
327    my $y = -($clat-$lat)/($north-$south)*$h;
328
329    $can->coords ($item, $x, $y); 
330    $can->raise ($item, "image");
331
332    if ($self->{MARKERFLAG}) {   
333        $can->coords ($self->{MARKERITEM}, $x, $y, $x+600, $y+500);   
334        $can->coords ($self->{MARKERITEM2}, $x+600, $y, $x, $y+500);   
335        $can->raise ($self->{MARKERITEM}, "image");
336        $can->raise ($self->{MARKERITEM2}, "image");
337    }
338}
339
340return 1;
Note: See TracBrowser for help on using the repository browser.