Statistics
| Revision:

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

History | View | Annotate | Download (5.07 KB)

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

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

    
7
public class QuadTreeTile extends RemoteTile {
8
        
9
        private String endUrlSection = null;
10
        private String baseUrl = "";
11
        
12
        private String quadTreeNWTag = "";
13
        private String quadTreeNETag = "";
14
        private String quadTreeSWTag = "";
15
        private String quadTreeSETag = "";
16
        
17
        private int[] quadPath;
18
        
19
        public QuadTreeTile(
20
                        String base_url,
21
                        String nw,
22
                        String ne,
23
                        String sw,
24
                        String se,
25
                        String endSection) {
26

    
27
                quadPath = new int[1];
28
                quadPath[0] = 0;
29
                
30
                baseUrl = base_url;
31

    
32
                quadTreeNWTag = nw;
33
                quadTreeNETag = ne;
34
                quadTreeSWTag = sw;
35
                quadTreeSETag = se;
36
                
37
                endUrlSection = endSection;
38
        }
39

    
40
        public URL getURL() {
41
                String u = baseUrl;
42
                for (int i=0; i<quadPath.length; i++) u = u + letter(quadPath[i]);
43
                URL resp = null;
44
                try {
45
                        resp = new URL(u);
46
                } catch (MalformedURLException e) {
47
                        logger.error("Bad url: " + u);
48
                }
49
                return resp;
50
        }
51
        
52
        private String letter(int i) {
53
                
54
                if (i == 0) return quadTreeNWTag;
55
                if (i == 1) return quadTreeNETag;
56
                if (i == 2) return quadTreeSETag;
57
                if (i == 3) return quadTreeSWTag;
58
                return "";
59
        }
60
        
61

    
62
        public RemoteTile getParentTile() {
63
                if (quadPath.length == 1) return this;
64
                int[] new_path = new int[quadPath.length - 1];
65
                for (int i=0; i<(quadPath.length - 1); i++) new_path[i] = quadPath[i];
66
                return new         QuadTreeTile(
67
                                new_path,
68
                                baseUrl,
69
                                quadTreeNWTag,
70
                                quadTreeNETag,
71
                                quadTreeSWTag,
72
                                quadTreeSETag,
73
                                endUrlSection);
74
        }
75

    
76
        public RemoteTile getTileToTheEast() {
77
                if (quadPath.length == 1) return this;
78
                int lastq = quadPath[quadPath.length - 1];
79
                
80
                if (lastq == 0) {
81
                        QuadTreeTile parent = (QuadTreeTile) getParentTile();
82
                        parent.goToQ(1);
83
                        return parent;
84
                }
85
                
86
                if (lastq == 3) {
87
                        QuadTreeTile parent = (QuadTreeTile) getParentTile();
88
                        parent.goToQ(2);
89
                        return parent;
90
                }
91
                
92
                if (lastq == 1) {
93
                        QuadTreeTile parent = (QuadTreeTile) getParentTile();
94
                        QuadTreeTile parent_right = (QuadTreeTile) parent.getTileToTheEast();
95
                        parent_right.goToQ(0);
96
                        return parent_right;
97
                }
98
                
99
                if (lastq == 2) {
100
                        QuadTreeTile parent = (QuadTreeTile) getParentTile();
101
                        QuadTreeTile parent_right = (QuadTreeTile) parent.getTileToTheEast();
102
                        parent_right.goToQ(3);
103
                        return parent_right;
104
                }
105
                
106
                logger.error("Bad path item: " + lastq);
107
                return this;
108
        }
109

    
110
        public RemoteTile getTileToTheSouth() {
111
                if (quadPath.length == 1) return this;
112
                int lastq = quadPath[quadPath.length - 1];
113
                
114
                if (lastq == 2) {
115
                        QuadTreeTile parent = (QuadTreeTile) getParentTile();
116
                        parent.goToQ(1);
117
                        return parent;
118
                }
119
                
120
                if (lastq == 3) {
121
                        QuadTreeTile parent = (QuadTreeTile) getParentTile();
122
                        parent.goToQ(0);
123
                        return parent;
124
                }
125
                
126
                if (lastq == 0) {
127
                        QuadTreeTile parent = (QuadTreeTile) getParentTile();
128
                        QuadTreeTile parent_under = (QuadTreeTile) parent.getTileToTheSouth();
129
                        parent_under.goToQ(3);
130
                        return parent_under;
131
                }
132
                
133
                if (lastq == 1) {
134
                        QuadTreeTile parent = (QuadTreeTile) getParentTile();
135
                        QuadTreeTile parent_under = (QuadTreeTile) parent.getTileToTheSouth();
136
                        parent_under.goToQ(2);
137
                        return parent_under;
138
                }
139
                
140
                logger.error("Bad path item: " + lastq);
141
                return this;
142
        }
143

    
144
        public Object clone() {
145
                return new         QuadTreeTile(
146
                                quadPath,
147
                                baseUrl,
148
                                quadTreeNWTag,
149
                                quadTreeNETag,
150
                                quadTreeSWTag,
151
                                quadTreeSETag,
152
                                endUrlSection);
153
        }
154
        
155
        public int[] getQuadPath() {
156
                return quadPath;
157
        }
158
        
159
        public void goToQ(int q) {
160
                
161
                if ((q < 0) || (q > 3)) return;
162
                
163
                int[] aux = new int[quadPath.length + 1];
164
                for (int i=0; i<quadPath.length; i++) aux[i] = quadPath[i];
165
                aux[quadPath.length] = q;
166
                quadPath = new int[aux.length];
167
                for (int i=0; i<aux.length; i++) quadPath[i] = aux[i];
168
                
169
                double new_x = extent.getMinX();
170
                double new_y = extent.getMinY();
171
                double new_w = 0.5 * extent.getWidth();
172
                if (q == 1) { new_x = extent.getCenterX(); }
173
                if (q == 2) { new_x = extent.getCenterX(); new_y = extent.getCenterY(); }
174
                if (q == 3) { new_y = extent.getCenterY(); }
175
                extent = new Rectangle2D.Double(new_x, new_y, new_w, new_w);
176
                
177
        }
178
        
179
        private QuadTreeTile(
180
                        int[] path,
181
                        String base_url,
182
                        String nw,
183
                        String ne,
184
                        String sw,
185
                        String se,
186
                        String end_sect) {
187
                
188
                
189
                extent = new Rectangle2D.Double(
190
                                - Util.SEMI_EQUATOR_LENGTH,
191
                                - Util.SEMI_EQUATOR_LENGTH,
192
                                2 * Util.SEMI_EQUATOR_LENGTH,
193
                                2 * Util.SEMI_EQUATOR_LENGTH);
194
                
195
                quadPath = new int[quadPath.length];
196
                
197
                for (int i=0; i<quadPath.length; i++) {
198
                        
199
                        int q = quadPath[i];
200
                        if ((q < 0) || (q > 3)) break;
201
                        
202
                        quadPath[i] = q;
203
                        
204
                        if (i == 0) continue;
205
                        
206
                        double new_x = extent.getMinX();
207
                        double new_y = extent.getMinY();
208
                        double new_w = 0.5 * extent.getWidth();
209
                        if (q == 1) { new_x = extent.getCenterX(); }
210
                        if (q == 2) { new_x = extent.getCenterX(); new_y = extent.getCenterY(); }
211
                        if (q == 3) { new_y = extent.getCenterY(); }
212
                        extent = new Rectangle2D.Double(new_x, new_y, new_w, new_w);
213
                }
214
                
215
                baseUrl = base_url;
216

    
217
                quadTreeNWTag = nw;
218
                quadTreeNETag = ne;
219
                quadTreeSWTag = sw;
220
                quadTreeSETag = se;
221
                
222
                endUrlSection = end_sect;
223
                
224
        }
225
        
226
        
227

    
228

    
229
}