Statistics
| Revision:

root / branches / Mobile_Compatible_Hito_1 / libFMap / src / es / prodevelop / gvsig / mobile / fmap / driver / raster / google / GoogleMapsTile.java @ 21606

History | View | Annotate | Download (4.49 KB)

1
package es.prodevelop.gvsig.mobile.fmap.driver.raster.google;
2

    
3
import java.awt.geom.Rectangle2D;
4
import java.net.MalformedURLException;
5
import java.net.URL;
6
import java.util.Random;
7

    
8
import org.apache.log4j.Logger;
9

    
10
public class GoogleMapsTile implements Cloneable {
11
        
12
        private static Logger logger = Logger.getLogger(GoogleMapsTile.class);
13
        
14
        private Rectangle2D extent;
15
        private int[] ppath;
16
        private Random rnd;
17
        
18
        public int[] getPath() {
19
                return ppath;
20
        }
21

    
22
        public GoogleMapsTile() {
23
                extent = new Rectangle2D.Double(
24
                                - GoogleUtils.SEMI_EQUATOR_LENGTH,
25
                                - GoogleUtils.SEMI_EQUATOR_LENGTH,
26
                                2 * GoogleUtils.SEMI_EQUATOR_LENGTH,
27
                                2 * GoogleUtils.SEMI_EQUATOR_LENGTH);
28
                ppath = new int[1];
29
                ppath[0] = 0;
30
                rnd = new Random(System.currentTimeMillis());
31
        }
32
        
33
        public URL getURL() {
34
                String u = "http://kh" + rnd.nextInt(4) + ".google.com/kh?n=404&v=23&t=";
35
                for (int i=0; i<ppath.length; i++) u = u + letter(ppath[i]);
36
                URL resp = null;
37
                try {
38
                        resp = new URL(u);
39
                } catch (MalformedURLException e) {
40
                        logger.error("Bad url: " + u);
41
                }
42
                return resp;
43
        }
44
        
45
        private String letter(int i) {
46
                
47
                if (i == 0) return "t";
48
                if (i == 1) return "s";
49
                if (i == 2) return "r";
50
                if (i == 3) return "q";
51
                return "";
52
        }
53

    
54
        public void goToQ(int q) {
55
                
56
                if ((q < 0) || (q > 3)) return;
57
                
58
                int[] aux = new int[ppath.length + 1];
59
                for (int i=0; i<ppath.length; i++) aux[i] = ppath[i];
60
                aux[ppath.length] = q;
61
                ppath = new int[aux.length];
62
                for (int i=0; i<aux.length; i++) ppath[i] = aux[i];
63
                
64
                double new_x = extent.getMinX();
65
                double new_y = extent.getMinY();
66
                double new_w = 0.5 * extent.getWidth();
67
                if (q == 1) { new_x = extent.getCenterX(); }
68
                if (q == 2) { new_x = extent.getCenterX(); new_y = extent.getCenterY(); }
69
                if (q == 3) { new_y = extent.getCenterY(); }
70
                extent = new Rectangle2D.Double(new_x, new_y, new_w, new_w);
71
                
72
        }
73

    
74
        public GoogleMapsTile(int[] _path) {
75
                
76
                extent = new Rectangle2D.Double(
77
                                - GoogleUtils.SEMI_EQUATOR_LENGTH,
78
                                - GoogleUtils.SEMI_EQUATOR_LENGTH,
79
                                2 * GoogleUtils.SEMI_EQUATOR_LENGTH,
80
                                2 * GoogleUtils.SEMI_EQUATOR_LENGTH);
81
                
82
                ppath = new int[_path.length];
83
                
84
                for (int i=0; i<_path.length; i++) {
85
                        
86
                        int q = _path[i];
87
                        if ((q < 0) || (q > 3)) break;
88
                        
89
                        ppath[i] = q;
90
                        
91
                        if (i == 0) continue;
92
                        
93
                        double new_x = extent.getMinX();
94
                        double new_y = extent.getMinY();
95
                        double new_w = 0.5 * extent.getWidth();
96
                        if (q == 1) { new_x = extent.getCenterX(); }
97
                        if (q == 2) { new_x = extent.getCenterX(); new_y = extent.getCenterY(); }
98
                        if (q == 3) { new_y = extent.getCenterY(); }
99
                        extent = new Rectangle2D.Double(new_x, new_y, new_w, new_w);
100
                }
101
                rnd = new Random(System.currentTimeMillis());
102
                
103
        }
104

    
105
        public Rectangle2D getExtent() {
106
                return extent;
107
        }
108

    
109
        // ------------- movements
110
        
111
        public Object clone() {
112
                return new GoogleMapsTile(ppath);
113
        }
114
        
115
        public GoogleMapsTile getParent() {
116
                
117
                if (ppath.length == 1) return this;
118
                int[] new_path = new int[ppath.length - 1];
119
                for (int i=0; i<(ppath.length - 1); i++) new_path[i] = ppath[i];
120
                return new GoogleMapsTile(new_path);
121
        }
122
        
123

    
124
        public GoogleMapsTile getTileToTheRight() {
125
                
126
                if (ppath.length == 1) return this;
127
                int lastq = ppath[ppath.length - 1];
128
                
129
                if (lastq == 0) {
130
                        GoogleMapsTile parent = getParent();
131
                        parent.goToQ(1);
132
                        return parent;
133
                }
134
                
135
                if (lastq == 3) {
136
                        GoogleMapsTile parent = getParent();
137
                        parent.goToQ(2);
138
                        return parent;
139
                }
140
                
141
                if (lastq == 1) {
142
                        GoogleMapsTile parent = getParent();
143
                        GoogleMapsTile parent_right = parent.getTileToTheRight();
144
                        parent_right.goToQ(0);
145
                        return parent_right;
146
                }
147
                
148
                if (lastq == 2) {
149
                        GoogleMapsTile parent = getParent();
150
                        GoogleMapsTile parent_right = parent.getTileToTheRight();
151
                        parent_right.goToQ(3);
152
                        return parent_right;
153
                }
154
                
155
                logger.error("Bad path item: " + lastq);
156
                return this;
157
        }
158
        
159
        public GoogleMapsTile getTileUnder() {
160
                
161
                if (ppath.length == 1) return this;
162
                int lastq = ppath[ppath.length - 1];
163
                
164
                if (lastq == 2) {
165
                        GoogleMapsTile parent = getParent();
166
                        parent.goToQ(1);
167
                        return parent;
168
                }
169
                
170
                if (lastq == 3) {
171
                        GoogleMapsTile parent = getParent();
172
                        parent.goToQ(0);
173
                        return parent;
174
                }
175
                
176
                if (lastq == 0) {
177
                        GoogleMapsTile parent = getParent();
178
                        GoogleMapsTile parent_under = parent.getTileUnder();
179
                        parent_under.goToQ(3);
180
                        return parent_under;
181
                }
182
                
183
                if (lastq == 1) {
184
                        GoogleMapsTile parent = getParent();
185
                        GoogleMapsTile parent_under = parent.getTileUnder();
186
                        parent_under.goToQ(2);
187
                        return parent_under;
188
                }
189
                
190
                logger.error("Bad path item: " + lastq);
191
                return this;
192
        }
193
        
194

    
195
}