Statistics
| Revision:

root / branches / Mobile_Compatible_Hito_1 / libFMap / src / es / prodevelop / gvsig / mobile / fmap / layer / FLayerGenericRaster.java @ 21606

History | View | Annotate | Download (8.95 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2006 Prodevelop and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *   Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *   +34 963862235
28
 *   gvsig@gva.es
29
 *   http://www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   Prodevelop Integraci?n de Tecnolog?as SL
34
 *   Conde Salvatierra de ?lava , 34-10
35
 *   46004 Valencia
36
 *   Spain
37
 *
38
 *   +34 963 510 612
39
 *   +34 963 510 968
40
 *   gis@prodevelop.es
41
 *   http://www.prodevelop.es
42
 *
43
 *    or
44
 *
45
 *   Instituto de Rob?tica
46
 *   Apartado de correos 2085
47
 *   46071 Valencia
48
 *   (Spain)
49
 *   
50
 *   +34 963 543 577
51
 *   jjordan@robotica.uv.es
52
 *   http://robotica.uv.es
53
 *   
54
 */
55

    
56
package es.prodevelop.gvsig.mobile.fmap.layer;
57

    
58
import java.awt.Graphics2D;
59
import java.awt.Point;
60
import java.awt.geom.Point2D;
61
import java.awt.geom.Rectangle2D;
62
import java.io.File;
63
import java.io.IOException;
64
import java.net.URL;
65
import java.util.ArrayList;
66

    
67
import org.apache.log4j.Logger;
68

    
69
import es.prodevelop.gvsig.mobile.fmap.MapContext;
70
import es.prodevelop.gvsig.mobile.fmap.driver.FMapDriverException;
71
import es.prodevelop.gvsig.mobile.fmap.driver.raster.RasterAdapter;
72
import es.prodevelop.gvsig.mobile.fmap.driver.raster.RasterDriver;
73
import es.prodevelop.gvsig.mobile.fmap.driver.raster.RasterFileAdapter;
74
import es.prodevelop.gvsig.mobile.fmap.driver.raster.RasterOperations;
75
import es.prodevelop.gvsig.mobile.fmap.driver.raster.ecw.EcwRasterDriver;
76
import es.prodevelop.gvsig.mobile.fmap.driver.raster.memory.wkformat.WKFRasterDriver;
77
import es.prodevelop.gvsig.mobile.fmap.driver.raster.wms.BadWMSResponseException;
78
import es.prodevelop.gvsig.mobile.fmap.driver.raster.wms.WMSLayerDescription;
79
import es.prodevelop.gvsig.mobile.fmap.driver.raster.wms.WMSProtocolHandler;
80
import es.prodevelop.gvsig.mobile.fmap.driver.raster.wms.WmsRasterDriver;
81
import es.prodevelop.gvsig.mobile.fmap.util.Utils;
82
import es.prodevelop.gvsig.mobile.fmap.util.cancel.Cancellable;
83
import es.prodevelop.gvsig.mobile.fmap.viewport.ViewPort;
84

    
85
public class FLayerGenericRaster extends FLyrDefault implements RasterOperations {
86
        
87
        private static Logger logger = Logger.getLogger(FLayerGenericRaster.class);
88
        private RasterAdapter adapter = null;
89
        
90
        public static FLayerGenericRaster createWMSLayer(
91
                        String url,
92
                        String srs,
93
                        String wmslayrs,
94
                        String format,
95
                        String name,
96
                        MapContext mc) {
97
                
98
                URL _url = null;
99
                try {
100
                        _url = new URL(url);
101
                } catch (Exception ex) {
102
                        logger.error("Bad url: " + url);
103
                        return null;
104
                }
105
                
106
                String _version = "";
107
                try {
108
                        _version = WMSProtocolHandler.getSuitableWMSVersion(_url);
109
                } catch (BadWMSResponseException e) {
110
                        logger.error("WMS layer was not created: " + e.getMessage() + ", returned NULL");
111
                        return null;
112
                }
113
                
114
                String _sym = WMSProtocolHandler.getSymbol(url);
115
                
116
                WMSProtocolHandler wms_handler = new WMSProtocolHandler();
117
                wms_handler.setHost(url);
118
                wms_handler.getCapabilities(_version, _sym);
119
                WMSLayerDescription d = wms_handler.getRoot();
120
                Rectangle2D ext = d.getExtentForSRS(srs);
121
                
122
                String selected_and_infoable = WMSProtocolHandler.leaveInfoable(wmslayrs, d, false);
123
                String selected_and_infoable_names = WMSProtocolHandler.leaveInfoable(wmslayrs, d, true);
124
                ArrayList info_fmts = wms_handler.getInfoFormats();
125
                
126
                WmsRasterDriver drv = new WmsRasterDriver(
127
                                url,
128
                                wmslayrs,
129
                                selected_and_infoable,
130
                                selected_and_infoable_names,
131
                                format,
132
                                srs,
133
                                ext,
134
                                info_fmts,
135
                                _version,
136
                                _sym);
137
                RasterAdapter adapter = new RasterAdapter();
138
                adapter.setDriver(drv);
139
                FLayerGenericRaster wmsLayer = new FLayerGenericRaster();
140
                wmsLayer.setMapContext(mc);
141
                wmsLayer.setSource(adapter);
142
                wmsLayer.setVisible(true);
143
                wmsLayer.setName(name);
144
                return wmsLayer;
145
        }
146
        
147
        public static FLayerGenericRaster createWKFRasterLayer(File f, String name, MapContext mc){
148
                WKFRasterDriver drv = new WKFRasterDriver(mc.getViewPort());
149
                RasterFileAdapter adapter = new RasterFileAdapter(f);
150
                adapter.setDriver(drv);
151
                
152
                logger.debug(Utils.time() + "MainWindow instancia la capa raster WKFormat.");
153
                FLayerGenericRaster layer = new FLayerGenericRaster();
154
                layer.setMapContext(mc);
155
                layer.setName(name);
156
                layer.setSource(adapter);
157
                
158
                try {
159
                        logger.debug(Utils.time() + "MainWindow llama al start() del adapter.");
160
                        adapter.start();
161
                } catch (FMapDriverException e) {
162
                        logger.error("While starting wk raster file: " + e.getMessage(), e);
163
                        return null;
164
                }
165
                return layer;
166
        }
167
        
168
        public static FLayerGenericRaster createEcwLayer(File f, String name, MapContext mc){
169
                EcwRasterDriver drv = new EcwRasterDriver(mc.getViewPort());
170
                RasterFileAdapter adapter = new RasterFileAdapter(f);
171
                adapter.setDriver(drv);
172
                
173
                logger.debug(Utils.time() + "MainWindow instancia la capa raster ECW.");
174
                FLayerGenericRaster ecwLayer = new FLayerGenericRaster();
175
                ecwLayer.setMapContext(mc);
176
                
177
                ecwLayer.setSource(adapter);
178
                
179
                try {
180
                        logger.debug(Utils.time() + "MainWindow llama al start() del adapter.");
181
                        adapter.start();
182
                } catch (FMapDriverException e) {
183
                        logger.error("While starting ecw file: " + e.getMessage(), e);
184
                }
185
                
186
                ecwLayer.setVisible(true);
187
                ecwLayer.setName(name);
188
                return ecwLayer;
189
        }
190
        public FLayerGenericRaster() {
191
                id = System.currentTimeMillis();
192
        }
193

    
194
        public Rectangle2D getFullExtent() throws FMapDriverException {
195
                return adapter.getFullExtent();
196
        }
197

    
198
        public void draw(Graphics2D g, ViewPort viewPort) throws FMapDriverException {
199

    
200
                if (isWithinScale(viewPort.getScale())) {
201
                        adapter.draw(g, viewPort);
202
                }
203
        }
204

    
205
        public boolean isWritable() {
206
                // TODO Auto-generated method stub
207
                return false;
208
        }
209

    
210
        public RasterAdapter getSource() {
211
                return adapter;
212
        }
213

    
214
        public void setSource(RasterAdapter ra) {
215
                adapter = ra;
216
        }
217

    
218
        public boolean isTiled() {
219
                // TODO Auto-generated method stub
220
                return false;
221
        }
222

    
223
        public int[] getTileSize() {
224
                // TODO Auto-generated method stub
225
                return null;
226
        }
227

    
228
        public ArrayList getInfo(Point p,
229
                        double tolerance,
230
                        Cancellable cancel, String srs) throws FMapDriverException {
231
                
232
                Point2D pReal =
233
                        getMapContext().getViewPort().toMapPoint(new Point2D.Double(p.x, p.y));
234
                
235
                ArrayList resp = new ArrayList();
236
                
237
                if (adapter.getDriver() instanceof InfoByPoint) {
238
                        
239
                        InfoByPoint ibp = (InfoByPoint) adapter.getDriver();
240
                        resp = ibp.getInfo(p, tolerance, cancel, srs);
241
                        
242
                } else {
243
                        
244
                        // -------------------------------------------------------
245
                        // driver is not info by point, return pixel's color data:
246
                        int[] pixel = adapter.getDriver().getPixel(pReal.getX(), pReal.getY());
247
                        
248
                        if (pixel == null) {
249
                                resp.add("[No data]");
250
                                resp.add(null);
251
                        } else {
252
                                if (pixel.length == 1) { // special case
253
                                        
254
                                        resp.add("[Unknown error]");
255
                                        resp.add(null);
256
                                        switch (pixel[0]) {
257
                                        case RasterDriver.ONE_PIXEL_NO_DATA:
258
                                                resp.clear();
259
                                                resp.add("[No data]");
260
                                                resp.add(null);
261
                                                break;
262
                                        case RasterDriver.ONE_PIXEL_IMAGE_ERROR:
263
                                                resp.clear();
264
                                                resp.add("[Error while reading image]");
265
                                                resp.add(null);
266
                                                break;
267
                                        }
268

    
269
                                } else {
270
                                        resp.add("Data:");
271
                                        String aux = "[";
272
                                        for (int i=0; i<pixel.length; i++) aux = aux + pixel[i] + ", ";
273
                                        aux = aux.substring(0, aux.length() - 2) + "]";
274
                                        resp.add(aux);
275
                                }
276
                        }
277

    
278
                        // -------------------------------------------------------
279
                }
280

    
281
                return resp;
282
        }
283

    
284
        public void wakeUp(boolean driver_is_already_open) {
285
        }
286

    
287
        public long getId() {
288
                return id;
289
        }
290

    
291
        public StringBuffer toXML(String name, String projectPath) {
292
                StringBuffer buff = new StringBuffer();
293
                buff.append("<" + name +">\n");
294
                
295
                        buff.append("<type>");
296
                        buff.append(this.getClass().getName());
297
                        buff.append("</type>\n");
298

    
299
                        buff.append("<path>");
300
                        String absPath = this.adapter.getDriver().getFilePath();
301
                        String relPath = Utils.relPath(projectPath, absPath);
302
                        if (relPath == null) relPath = absPath;
303
                        buff.append(relPath);
304
                        buff.append("</path>\n");
305
                
306
                buff.append("</" + name +">\n");
307
                return buff;
308
        }
309
        
310
        public String getFilePath() {
311
                return adapter.getDriver().getFilePath();
312
        }
313
        
314
        public void clean() {
315
                logger.debug("Cleaning layer: " + getName());
316
                try {
317
                        adapter.getDriver().close();
318
                        adapter.setDriver(null);
319
                } catch (IOException e) {
320
                        logger.error("While closing raster driver: " + e.getMessage());
321
                }
322
                adapter = null;
323
        }
324

    
325
}