gvsig-raster / org.gvsig.raster.wmts / trunk / org.gvsig.raster.wmts / org.gvsig.raster.wmts.app.wmtsclient / src / main / java / org / gvsig / raster / wmts / app / wmtsclient / layer / FLyrWMTS.java @ 4439
History | View | Annotate | Download (21.6 KB)
1 | 2485 | nbrodin | package org.gvsig.raster.wmts.app.wmtsclient.layer; |
---|---|---|---|
2 | |||
3 | import java.awt.Dimension; |
||
4 | import java.awt.Graphics2D; |
||
5 | import java.awt.Image; |
||
6 | import java.awt.Point; |
||
7 | import java.awt.geom.Point2D; |
||
8 | import java.awt.geom.Rectangle2D; |
||
9 | import java.awt.image.BufferedImage; |
||
10 | import java.lang.ref.WeakReference; |
||
11 | 4272 | fdiaz | import java.net.URI; |
12 | import java.net.URISyntaxException; |
||
13 | 2485 | nbrodin | import java.util.ArrayList; |
14 | import java.util.HashMap; |
||
15 | import java.util.Iterator; |
||
16 | import java.util.List; |
||
17 | |||
18 | import javax.print.attribute.PrintRequestAttributeSet; |
||
19 | |||
20 | import org.cresques.cts.ICoordTrans; |
||
21 | import org.cresques.cts.IProjection; |
||
22 | 4439 | fdiaz | import org.slf4j.Logger; |
23 | import org.slf4j.LoggerFactory; |
||
24 | 4272 | fdiaz | |
25 | 2485 | nbrodin | import org.gvsig.fmap.dal.DALLocator; |
26 | import org.gvsig.fmap.dal.DataManager; |
||
27 | import org.gvsig.fmap.dal.DataParameters; |
||
28 | import org.gvsig.fmap.dal.DataStore; |
||
29 | import org.gvsig.fmap.dal.DataStoreParameters; |
||
30 | import org.gvsig.fmap.dal.coverage.RasterLocator; |
||
31 | import org.gvsig.fmap.dal.coverage.RasterManager; |
||
32 | import org.gvsig.fmap.dal.coverage.datastruct.Extent; |
||
33 | import org.gvsig.fmap.dal.coverage.datastruct.NoData; |
||
34 | import org.gvsig.fmap.dal.coverage.datastruct.ViewPortData; |
||
35 | import org.gvsig.fmap.dal.coverage.exception.FilePaletteException; |
||
36 | import org.gvsig.fmap.dal.coverage.exception.InfoByPointException; |
||
37 | import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException; |
||
38 | import org.gvsig.fmap.dal.coverage.exception.QueryException; |
||
39 | import org.gvsig.fmap.dal.coverage.grid.RasterFilter; |
||
40 | import org.gvsig.fmap.dal.coverage.store.RasterDataStore; |
||
41 | import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters; |
||
42 | import org.gvsig.fmap.dal.coverage.store.parameter.TileDataParameters; |
||
43 | import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation; |
||
44 | import org.gvsig.fmap.dal.exception.DataException; |
||
45 | import org.gvsig.fmap.dal.exception.InitializeException; |
||
46 | import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException; |
||
47 | import org.gvsig.fmap.dal.exception.ReadException; |
||
48 | import org.gvsig.fmap.dal.exception.ValidateDataParametersException; |
||
49 | import org.gvsig.fmap.dal.spi.DataManagerProviderServices; |
||
50 | import org.gvsig.fmap.geom.Geometry.SUBTYPES; |
||
51 | import org.gvsig.fmap.geom.GeometryLocator; |
||
52 | import org.gvsig.fmap.geom.GeometryManager; |
||
53 | import org.gvsig.fmap.geom.exception.CreateEnvelopeException; |
||
54 | import org.gvsig.fmap.geom.primitive.Envelope; |
||
55 | import org.gvsig.fmap.mapcontext.ViewPort; |
||
56 | import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException; |
||
57 | import org.gvsig.fmap.mapcontext.layers.FLayer; |
||
58 | import org.gvsig.fmap.mapcontext.layers.operations.IHasImageLegend; |
||
59 | import org.gvsig.fmap.mapcontext.rendering.legend.ILegend; |
||
60 | import org.gvsig.raster.fmap.layers.DefaultFLyrRaster; |
||
61 | import org.gvsig.raster.fmap.layers.IRasterLayerActions; |
||
62 | import org.gvsig.raster.fmap.layers.NotAvailableStateException; |
||
63 | import org.gvsig.raster.fmap.legend.ImageLegend; |
||
64 | import org.gvsig.raster.util.CancelTaskImpl; |
||
65 | import org.gvsig.raster.wmts.io.WMTSDataParameters; |
||
66 | import org.gvsig.raster.wmts.io.WMTSServerExplorer; |
||
67 | import org.gvsig.raster.wmts.io.WMTSServerExplorerParameters; |
||
68 | import org.gvsig.tools.ToolsLocator; |
||
69 | import org.gvsig.tools.dynobject.DynObjectSet; |
||
70 | import org.gvsig.tools.dynobject.DynStruct; |
||
71 | import org.gvsig.tools.persistence.PersistenceManager; |
||
72 | 4175 | jbadia | import org.gvsig.tools.persistence.PersistentState; |
73 | import org.gvsig.tools.persistence.exception.PersistenceException; |
||
74 | import org.gvsig.tools.persistence.exception.PersistenceRuntimeException; |
||
75 | 2485 | nbrodin | import org.gvsig.tools.task.Cancellable; |
76 | import org.gvsig.tools.task.SimpleTaskStatus; |
||
77 | import org.gvsig.tools.task.TaskStatusManager; |
||
78 | 4272 | fdiaz | |
79 | 2485 | nbrodin | /**
|
80 | * WMTS Layer class.
|
||
81 | *
|
||
82 | * @author Nacho Brodin (nachobrodin@gmail.com)
|
||
83 | *
|
||
84 | */
|
||
85 | public class FLyrWMTS extends DefaultFLyrRaster implements IHasImageLegend { |
||
86 | private static final GeometryManager geomManager = GeometryLocator.getGeometryManager(); |
||
87 | private static final Logger logger = LoggerFactory.getLogger(FLyrWMTS.class); |
||
88 | private List<WeakReference<Thread>> disableUpdateDrawVersion; |
||
89 | private Envelope fullEnvelope = null; |
||
90 | private boolean firstLoad = false; |
||
91 | private RasterManager rManager = RasterLocator.getManager();
|
||
92 | private DataStoreParameters params = null; |
||
93 | private WMTSServerExplorer wmtsExplorer = null; |
||
94 | private boolean deleteCache = false; |
||
95 | |||
96 | 4439 | fdiaz | /**
|
97 | * Register the persistence
|
||
98 | */
|
||
99 | 2485 | nbrodin | public static void registerPersistent() { |
100 | PersistenceManager manager = ToolsLocator.getPersistenceManager(); |
||
101 | DynStruct definition = manager.getDefinition("FLyrWMTS_Persistent");
|
||
102 | if( definition == null ) { |
||
103 | if (manager.getDefinition(DefaultFLyrRaster.class) == null) { |
||
104 | 3066 | jjdelcerro | DefaultFLyrRaster.registerPersistence(); |
105 | 2485 | nbrodin | } |
106 | |||
107 | definition = manager.addDefinition( |
||
108 | FLyrWMTS.class, |
||
109 | "FLyrWMTS_Persistent",
|
||
110 | "FLyrWMTS Persistent Definition",
|
||
111 | 4272 | fdiaz | null,
|
112 | 2485 | nbrodin | null
|
113 | ); |
||
114 | 4272 | fdiaz | |
115 | 2485 | nbrodin | definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE, DefaultFLyrRaster.PERSISTENT_NAME); |
116 | } |
||
117 | |||
118 | DefaultFLyrRaster.registerPersistence(definition); |
||
119 | } |
||
120 | 4272 | fdiaz | |
121 | 4439 | fdiaz | /**
|
122 | * Constructor
|
||
123 | */
|
||
124 | 2485 | nbrodin | public FLyrWMTS() {
|
125 | super();
|
||
126 | this.updateDrawVersion();
|
||
127 | try {
|
||
128 | enableAwake(); |
||
129 | } catch (NotAvailableStateException e) {
|
||
130 | logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e); |
||
131 | } |
||
132 | } |
||
133 | 4272 | fdiaz | |
134 | 4439 | fdiaz | /**
|
135 | * @param host
|
||
136 | * @param srs
|
||
137 | * @return the data store
|
||
138 | * @throws InitializeException
|
||
139 | */
|
||
140 | 2485 | nbrodin | public static DataStore createDataStore(String host, IProjection srs) throws InitializeException { |
141 | DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager(); |
||
142 | RasterDataParameters params = null;
|
||
143 | try {
|
||
144 | params = (RasterDataParameters)dataman.createServerExplorerParameters(WMTSServerExplorer.NAME); |
||
145 | } catch (InitializeException e) {
|
||
146 | return null; |
||
147 | } catch (ProviderNotRegisteredException e) {
|
||
148 | return null; |
||
149 | } |
||
150 | 4272 | fdiaz | URI hostURI;
|
151 | try {
|
||
152 | hostURI = new URI(host); |
||
153 | } catch (URISyntaxException e1) { |
||
154 | logger.warn("Can't create URI from "+host, e1);
|
||
155 | throw new InitializeException(e1); |
||
156 | } |
||
157 | params.setURI(hostURI); |
||
158 | 2485 | nbrodin | params.setSRS(srs); |
159 | 4272 | fdiaz | |
160 | 2485 | nbrodin | try {
|
161 | return dataman.openStore(params.getDataStoreName(), params);
|
||
162 | } catch (ValidateDataParametersException e) {
|
||
163 | throw new InitializeException(e); |
||
164 | } catch (ProviderNotRegisteredException e) {
|
||
165 | throw new InitializeException(e); |
||
166 | } |
||
167 | } |
||
168 | 4272 | fdiaz | |
169 | 4175 | jbadia | public void loadFromState(PersistentState state) |
170 | throws PersistenceException {
|
||
171 | try {
|
||
172 | super.loadFromState(state);
|
||
173 | 4272 | fdiaz | |
174 | 4175 | jbadia | /*
|
175 | 4272 | fdiaz | * Needs to initialize variables using methods on setDataStore method of this class
|
176 | 4175 | jbadia | */
|
177 | this.setDataStore(getDataStore());
|
||
178 | //this.setParameters(getDataStore().getParameters());
|
||
179 | }catch (PersistenceRuntimeException e) {
|
||
180 | logger.debug("Unable to load store from persistence in layer: " + this.getName(), e); |
||
181 | this.setAvailable(false); |
||
182 | return;
|
||
183 | } catch (LoadLayerException e) {
|
||
184 | logger.debug("Unable to load store to layer: " + this.getName(), e); |
||
185 | this.setAvailable(false); |
||
186 | return;
|
||
187 | // } catch (InitializeException e) {
|
||
188 | // logger.debug("Unable to load store parameters to layer: " + this.getName(), e);
|
||
189 | // this.setAvailable(false);
|
||
190 | // return;
|
||
191 | } |
||
192 | 2485 | nbrodin | |
193 | 4175 | jbadia | } |
194 | |||
195 | 2485 | nbrodin | public void setDataStore(DataStore dataStore) throws LoadLayerException { |
196 | this.dataStore = (RasterDataStore) dataStore;
|
||
197 | try {
|
||
198 | enableOpen(); |
||
199 | } catch (NotAvailableStateException e) {
|
||
200 | logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e); |
||
201 | } |
||
202 | 4439 | fdiaz | if (this.dataStore != null) { |
203 | setProjection(this.dataStore.getProjection());
|
||
204 | setFullExtent(this.dataStore.getExtent().toRectangle2D());
|
||
205 | } |
||
206 | 2485 | nbrodin | } |
207 | |||
208 | @SuppressWarnings("deprecation") |
||
209 | public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort, |
||
210 | Cancellable cancel, double scale) throws ReadException { |
||
211 | //CancelTaskImpl cancellable = new CancelTaskImpl(cancel);
|
||
212 | |||
213 | //Solo el zoom normal recalcula el nivel dependiendo de la escala. El zoom por niveles asigna
|
||
214 | //?l el nivel de zoom por lo que no habr? que recalcularlo.
|
||
215 | if(recalcLevel) {
|
||
216 | double pixelSize = viewPort.getExtent().getWidth() / (double)viewPort.getImageWidth(); |
||
217 | zoomLevel = dataStore.getNearestLevel(pixelSize); |
||
218 | } |
||
219 | recalcLevel = true;
|
||
220 | 4272 | fdiaz | |
221 | 2485 | nbrodin | if(!firstLoad) {
|
222 | try {
|
||
223 | initFilters(); |
||
224 | try {
|
||
225 | if(!isOpen())
|
||
226 | enableOpen(); |
||
227 | } catch (NotAvailableStateException e) {
|
||
228 | throw new ReadException("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), e); |
||
229 | } |
||
230 | } catch (FilePaletteException e) {
|
||
231 | throw new ReadException(e.getMessage(), e); |
||
232 | } |
||
233 | firstLoad = true;
|
||
234 | } |
||
235 | 4272 | fdiaz | |
236 | 2485 | nbrodin | enableStopped(); |
237 | |||
238 | if (isWithinScale(scale)) {
|
||
239 | 4439 | fdiaz | Envelope adjustedExtent = viewPort.getAdjustedEnvelope(); |
240 | if (!adjustedExtent.intersects(getFullEnvelope())) {
|
||
241 | 2485 | nbrodin | return;
|
242 | 4439 | fdiaz | } |
243 | 2485 | nbrodin | Extent ext = rManager.getDataStructFactory().createExtent( |
244 | adjustedExtent.getLowerCorner().getX(), |
||
245 | 4272 | fdiaz | adjustedExtent.getUpperCorner().getY(), |
246 | 2485 | nbrodin | adjustedExtent.getUpperCorner().getX(), |
247 | adjustedExtent.getLowerCorner().getY()); |
||
248 | Dimension imgSz = viewPort.getImageSize();
|
||
249 | ViewPortData vp2 = rManager.getDataStructFactory().createViewPortData(viewPort.getProjection(), ext, imgSz ); |
||
250 | vp2.setMat(viewPort.getAffineTransform()); |
||
251 | 2851 | cmartinez | vp2.setDPI((int)viewPort.getDPI());
|
252 | 4272 | fdiaz | |
253 | 2485 | nbrodin | TaskStatusManager manager = ToolsLocator.getTaskStatusManager(); |
254 | SimpleTaskStatus taskStatus = new RasterTaskStatus("Drawing " + getName() + "...", cancel); |
||
255 | manager.add(taskStatus); |
||
256 | taskStatus.setAutoremove(true);
|
||
257 | |||
258 | try {
|
||
259 | WMTSDataParameters par = getWMTSParameters(getParameters()); |
||
260 | //getParameters().setExtent(ext.toRectangle2D());
|
||
261 | par.setWidth((int)viewPort.getImageSize().getWidth());
|
||
262 | par.setHeight((int)viewPort.getImageSize().getHeight());
|
||
263 | 4272 | fdiaz | |
264 | 2485 | nbrodin | getRender().drawTiledService(g, vp2, viewPort.getImageSize(), taskStatus); |
265 | } catch (ProcessInterruptedException e) {
|
||
266 | throw new ReadException("Problems drawing this layer: " + e.getMessage(), e); |
||
267 | } catch (QueryException e) {
|
||
268 | throw new ReadException("Problems drawing this layer: " + e.getMessage(), e); |
||
269 | } finally {
|
||
270 | taskStatus.terminate(); |
||
271 | } |
||
272 | } |
||
273 | disableStopped(); |
||
274 | } |
||
275 | |||
276 | 4272 | fdiaz | |
277 | 2485 | nbrodin | /**
|
278 | 4439 | fdiaz | * @param g
|
279 | * @param viewPort
|
||
280 | * @param cancel
|
||
281 | * @param scale
|
||
282 | * @param properties
|
||
283 | * @throws ReadException
|
||
284 | 2485 | nbrodin | * @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D,
|
285 | * com.iver.cit.gvsig.fmap.ViewPort,
|
||
286 | * com.iver.cit.gvsig.fmap.operations.Cancellable)
|
||
287 | */
|
||
288 | public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel, double scale, PrintRequestAttributeSet properties) |
||
289 | throws ReadException {
|
||
290 | 4272 | fdiaz | |
291 | 4439 | fdiaz | |
292 | 2485 | nbrodin | } |
293 | |||
294 | 4439 | fdiaz | /**
|
295 | * @param g
|
||
296 | * @param viewPort
|
||
297 | * @param cancel
|
||
298 | * @param scale
|
||
299 | * @throws ReadException
|
||
300 | */
|
||
301 | public void _print(Graphics2D g, ViewPort viewPort, Cancellable cancel, double scale) throws ReadException { |
||
302 | 2485 | nbrodin | draw(null, g, viewPort, cancel,scale);
|
303 | } |
||
304 | |||
305 | /**
|
||
306 | * Inserta la extensi?n total de la capa.
|
||
307 | *
|
||
308 | * @param fullExtent
|
||
309 | * Rectangulo.
|
||
310 | */
|
||
311 | public void setFullExtent(Rectangle2D fullExtent) { |
||
312 | this.setFullEnvelope(this.getEnvelopeFromRectable2D(fullExtent)); |
||
313 | } |
||
314 | |||
315 | /**
|
||
316 | * Inserta la extensi?n total de la capa en la proyeccion original.
|
||
317 | 4439 | fdiaz | * @param envelope
|
318 | 2485 | nbrodin | *
|
319 | */
|
||
320 | public void setFullEnvelope(Envelope envelope) { |
||
321 | Envelope cur = this.getFullEnvelope();
|
||
322 | if (cur == envelope) {
|
||
323 | return;
|
||
324 | } |
||
325 | if (cur != null && cur.equals(envelope)) { |
||
326 | return;
|
||
327 | } |
||
328 | |||
329 | this.fullEnvelope = envelope;
|
||
330 | this.updateDrawVersion();
|
||
331 | } |
||
332 | |||
333 | 4439 | fdiaz | /**
|
334 | * @return the properties.
|
||
335 | */
|
||
336 | 2485 | nbrodin | public HashMap<String, Object> getProperties() { |
337 | HashMap<String, Object> info = new HashMap<String, Object>(); |
||
338 | WMTSDataParameters par = getWMTSParameters(getParameters()); |
||
339 | String layerName = par.getLayer().getTitle();
|
||
340 | try {
|
||
341 | info.put("name", getName());
|
||
342 | info.put("selectedLayer", layerName);
|
||
343 | info.put("host", par.getURI());
|
||
344 | info.put("srs", par.getSRSCode());
|
||
345 | info.put("imageformat", par.getImageFormat());
|
||
346 | info.put("infoformat", par.getInfoFormat());
|
||
347 | //info.put("styles", getParameters().getStyles());
|
||
348 | return info;
|
||
349 | } catch (Exception e) { |
||
350 | e.printStackTrace(); |
||
351 | } |
||
352 | return null; |
||
353 | } |
||
354 | |||
355 | |||
356 | public String getTocImageIcon() { |
||
357 | return "icon-layer-wmts"; |
||
358 | } |
||
359 | |||
360 | public boolean isActionEnabled(int action) { |
||
361 | switch (action) {
|
||
362 | case IRasterLayerActions.ZOOM_PIXEL_RESOLUTION:
|
||
363 | case IRasterLayerActions.FLYRASTER_BAR_TOOLS:
|
||
364 | case IRasterLayerActions.BANDS_FILE_LIST:
|
||
365 | case IRasterLayerActions.COLOR_TABLE:
|
||
366 | case IRasterLayerActions.GEOLOCATION:
|
||
367 | case IRasterLayerActions.PANSHARPENING:
|
||
368 | case IRasterLayerActions.SAVE_COLORINTERP:
|
||
369 | case IRasterLayerActions.SAVEAS:
|
||
370 | case IRasterLayerActions.BANDS_RGB:
|
||
371 | case IRasterLayerActions.CLIPPING:
|
||
372 | case IRasterLayerActions.ENHANCED:
|
||
373 | case IRasterLayerActions.STATS:
|
||
374 | case IRasterLayerActions.NODATA:
|
||
375 | case IRasterLayerActions.HISTOGRAM:
|
||
376 | return false; |
||
377 | case IRasterLayerActions.REMOTE_ACTIONS:
|
||
378 | return true; |
||
379 | } |
||
380 | |||
381 | return super.isActionEnabled(action); |
||
382 | } |
||
383 | |||
384 | public ILegend getLegend() {
|
||
385 | if(getDataStore() != null) |
||
386 | return new ImageLegend(getDataStore().getImageLegend()); |
||
387 | return null; |
||
388 | } |
||
389 | |||
390 | public boolean isRemote() { |
||
391 | return true; |
||
392 | } |
||
393 | |||
394 | public boolean overviewsSupport() { |
||
395 | return false; |
||
396 | } |
||
397 | |||
398 | protected void updateDrawVersion() { |
||
399 | if (this.disableUpdateDrawVersion != null){ |
||
400 | |||
401 | Thread curThread = Thread.currentThread(); |
||
402 | |||
403 | Thread aThread;
|
||
404 | |||
405 | Iterator<WeakReference<Thread>> iter = this.disableUpdateDrawVersion.iterator(); |
||
406 | while (iter.hasNext()){
|
||
407 | aThread = (Thread) ((WeakReference<?>)iter.next()).get(); |
||
408 | if (aThread == null){ |
||
409 | iter.remove(); |
||
410 | } else if(aThread.equals(curThread)){ |
||
411 | return;
|
||
412 | } |
||
413 | } |
||
414 | } |
||
415 | super.updateDrawVersion();
|
||
416 | } |
||
417 | |||
418 | protected void disableUpdateDrawVersion() { |
||
419 | if (this.disableUpdateDrawVersion == null) { |
||
420 | this.disableUpdateDrawVersion = new ArrayList<WeakReference<Thread>>(); |
||
421 | } |
||
422 | this.disableUpdateDrawVersion.add(new WeakReference<Thread>(Thread.currentThread())); |
||
423 | } |
||
424 | |||
425 | protected void enableUpdateDrawVersion() { |
||
426 | if (this.disableUpdateDrawVersion == null) { |
||
427 | return;
|
||
428 | } |
||
429 | Thread curThread = Thread.currentThread(); |
||
430 | Thread aThread;
|
||
431 | |||
432 | Iterator<WeakReference<Thread>> iter = this.disableUpdateDrawVersion.iterator(); |
||
433 | while (iter.hasNext()) {
|
||
434 | aThread = (Thread) ((WeakReference<?>)iter.next()).get(); |
||
435 | if (aThread == null) { |
||
436 | iter.remove(); |
||
437 | } else if(aThread.equals(curThread)) { |
||
438 | iter.remove(); |
||
439 | break;
|
||
440 | } |
||
441 | } |
||
442 | |||
443 | } |
||
444 | |||
445 | @SuppressWarnings("unused") |
||
446 | private Rectangle2D.Double getRectable2DFromEnvelope(Envelope env) { |
||
447 | return new Rectangle2D.Double(env.getMinimum(0), env.getMinimum(1), env |
||
448 | .getLength(0), env.getLength(1)); |
||
449 | } |
||
450 | |||
451 | private Envelope getEnvelopeFromRectable2D(Rectangle2D rect) { |
||
452 | try {
|
||
453 | return geomManager.createEnvelope(rect.getMinX(), rect.getMinY(),
|
||
454 | rect.getMaxX(), rect.getMaxY(), |
||
455 | SUBTYPES.GEOM2D); |
||
456 | } catch (CreateEnvelopeException e) {
|
||
457 | logger.error("Error creating the envelope", e);
|
||
458 | } |
||
459 | return null; |
||
460 | } |
||
461 | 4272 | fdiaz | |
462 | 2485 | nbrodin | @Override
|
463 | public String getFileFormat() { |
||
464 | return "WMTS"; |
||
465 | } |
||
466 | |||
467 | 4272 | fdiaz | |
468 | 2485 | nbrodin | /**
|
469 | * Devuelve el envelope en la proyeccion de la vista
|
||
470 | */
|
||
471 | public Envelope getFullEnvelope() {
|
||
472 | Envelope rAux; |
||
473 | rAux = this.fullEnvelope;
|
||
474 | |||
475 | // Esto es para cuando se crea una capa nueva con el fullExtent de ancho
|
||
476 | // y alto 0.
|
||
477 | if (rAux == null || rAux.getMaximum(0) - rAux.getMinimum(0) == 0 |
||
478 | && rAux.getMaximum(1) - rAux.getMinimum(1) == 0) { |
||
479 | try {
|
||
480 | rAux = geomManager.createEnvelope(0, 0, 100, 100, SUBTYPES.GEOM2D); |
||
481 | } catch (CreateEnvelopeException e) {
|
||
482 | logger.error("Error creating the envelope", e);
|
||
483 | } |
||
484 | } |
||
485 | // Si existe reproyecci?n, reproyectar el extent
|
||
486 | ICoordTrans ct = getCoordTrans(); |
||
487 | if (ct != null) { |
||
488 | Point2D pt1 = new Point2D.Double(rAux.getMinimum(0), rAux |
||
489 | .getMinimum(1));
|
||
490 | Point2D pt2 = new Point2D.Double(rAux.getMaximum(0), rAux |
||
491 | .getMaximum(1));
|
||
492 | pt1 = ct.convert(pt1, null);
|
||
493 | pt2 = ct.convert(pt2, null);
|
||
494 | try {
|
||
495 | rAux = geomManager.createEnvelope(pt1.getX(), pt1.getY(), pt2 |
||
496 | .getX(), pt2.getY(), SUBTYPES.GEOM2D); |
||
497 | } catch (CreateEnvelopeException e) {
|
||
498 | logger.error("Error creating the envelope", e);
|
||
499 | }// new
|
||
500 | // Rectangle2D.Double();
|
||
501 | } |
||
502 | return rAux;
|
||
503 | |||
504 | } |
||
505 | 4272 | fdiaz | |
506 | 2485 | nbrodin | public Extent getFullRasterExtent() {
|
507 | Envelope env = getFullEnvelope(); |
||
508 | double minx = env.getMinimum(0); |
||
509 | double miny = env.getMinimum(1); |
||
510 | double maxx = env.getMaximum(0); |
||
511 | double maxy = env.getMaximum(1); |
||
512 | Point2D ul = new Point2D.Double(minx, maxy); |
||
513 | Point2D ur = new Point2D.Double(maxx, maxy); |
||
514 | Point2D ll = new Point2D.Double(minx, miny); |
||
515 | Point2D lr = new Point2D.Double(maxx, miny); |
||
516 | return rManager.getDataStructFactory().createExtent(ul, lr, ur, ll);
|
||
517 | } |
||
518 | |||
519 | public DynObjectSet getInfo(Point p, double tolerance, Cancellable cancel) |
||
520 | throws LoadLayerException, DataException {
|
||
521 | 4272 | fdiaz | |
522 | 2485 | nbrodin | return null; |
523 | } |
||
524 | 4272 | fdiaz | |
525 | 2485 | nbrodin | public DynObjectSet getInfo(Point p, double tolerance, Cancellable cancel, boolean fast) |
526 | throws LoadLayerException, DataException {
|
||
527 | |||
528 | 4439 | fdiaz | org.gvsig.fmap.geom.primitive.Point pReal = getMapContext().getViewPort().convertToMapPoint(p); |
529 | 2485 | nbrodin | String fInfo = null; |
530 | try {
|
||
531 | fInfo = getDataStore().getInfoByPoint(pReal.getX(), pReal.getY(), new CancelTaskImpl(cancel));
|
||
532 | } catch (InfoByPointException e) {
|
||
533 | throw new LoadLayerException("Error in getInfoByPoint", e); |
||
534 | } |
||
535 | int type = DynObjectSetWMTSInfo.TYPE_TEXT;
|
||
536 | WMTSDataParameters wmtsParams = getWMTSParameters(params); |
||
537 | |||
538 | if(wmtsParams.getInfoFormat() != null) { |
||
539 | if(wmtsParams.getInfoFormat().compareTo("text/html") == 0) |
||
540 | type = DynObjectSetWMTSInfo.TYPE_HTML; |
||
541 | if(wmtsParams.getInfoFormat().compareTo("application/vnd.ogc.gml") == 0) |
||
542 | type = DynObjectSetWMTSInfo.TYPE_XML; |
||
543 | } |
||
544 | return new DynObjectSetWMTSInfo(fInfo, type); |
||
545 | } |
||
546 | 4272 | fdiaz | |
547 | 2485 | nbrodin | /**
|
548 | * Sets the data store parameters
|
||
549 | * @param params
|
||
550 | * @throws InitializeException
|
||
551 | */
|
||
552 | public void setParameters(DataStoreParameters params) throws InitializeException { |
||
553 | this.params = params;
|
||
554 | |||
555 | if(params instanceof TileDataParameters) { |
||
556 | ((TileDataParameters)params).deleteCache(deleteCache); |
||
557 | } |
||
558 | 4272 | fdiaz | |
559 | 2485 | nbrodin | DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager(); |
560 | try {
|
||
561 | DataStore dStore = dataman.openStore(params.getDataStoreName(), params); |
||
562 | this.setDataStore(dStore);
|
||
563 | 4272 | fdiaz | |
564 | 2485 | nbrodin | if(params instanceof WMTSDataParameters) { |
565 | 4272 | fdiaz | this.setName(((WMTSDataParameters) params).getURI().getPath());
|
566 | 2485 | nbrodin | } |
567 | 4272 | fdiaz | |
568 | 2485 | nbrodin | if(params instanceof TileDataParameters) { |
569 | DataParameters p = ((TileDataParameters) params).getDataParameters(); |
||
570 | if(p instanceof WMTSDataParameters) { |
||
571 | 4272 | fdiaz | this.setName(((WMTSDataParameters) p).getURI().getPath());
|
572 | 2485 | nbrodin | } |
573 | } |
||
574 | 4272 | fdiaz | |
575 | 2485 | nbrodin | } catch (ValidateDataParametersException e) {
|
576 | throw new InitializeException(e); |
||
577 | } catch (ProviderNotRegisteredException e) {
|
||
578 | throw new InitializeException(e); |
||
579 | } catch (InitializeException e) {
|
||
580 | throw new InitializeException(e); |
||
581 | } catch (LoadLayerException e) {
|
||
582 | throw new InitializeException(e); |
||
583 | } |
||
584 | } |
||
585 | 4272 | fdiaz | |
586 | 4439 | fdiaz | /**
|
587 | * @return the data store parameters
|
||
588 | */
|
||
589 | 2485 | nbrodin | @SuppressWarnings("deprecation") |
590 | public DataStoreParameters getParameters() {
|
||
591 | if(params == null) { |
||
592 | DataManager datamanager = DALLocator.getDataManager(); |
||
593 | WMTSServerExplorerParameters explorerParams = null;
|
||
594 | try {
|
||
595 | explorerParams = (WMTSServerExplorerParameters) datamanager.createServerExplorerParameters(WMTSServerExplorer.NAME); |
||
596 | explorerParams.setHost("");
|
||
597 | wmtsExplorer = (WMTSServerExplorer) datamanager.createServerExplorer(explorerParams); |
||
598 | params = wmtsExplorer.getStoredParameters(); |
||
599 | } catch (InitializeException e) {
|
||
600 | } catch (ProviderNotRegisteredException e) {
|
||
601 | } catch (ValidateDataParametersException e) {
|
||
602 | } |
||
603 | } |
||
604 | return getWMTSParameters(params);
|
||
605 | } |
||
606 | 4272 | fdiaz | |
607 | 2485 | nbrodin | /**
|
608 | * Gets <code>WMTSDataParameters</code>
|
||
609 | * @param parameters
|
||
610 | * @return
|
||
611 | */
|
||
612 | private WMTSDataParameters getWMTSParameters(DataStoreParameters parameters) {
|
||
613 | WMTSDataParameters params = null;
|
||
614 | if(parameters instanceof WMTSDataParameters) { |
||
615 | params = (WMTSDataParameters) parameters; |
||
616 | } |
||
617 | 4272 | fdiaz | |
618 | 2485 | nbrodin | if(parameters instanceof TileDataParameters) { |
619 | DataParameters p = ((TileDataParameters) parameters).getDataParameters(); |
||
620 | if(p instanceof WMTSDataParameters) { |
||
621 | params = (WMTSDataParameters) p; |
||
622 | } |
||
623 | } |
||
624 | return params;
|
||
625 | } |
||
626 | 4272 | fdiaz | |
627 | 2485 | nbrodin | /**
|
628 | * Sets the explorer
|
||
629 | * @param explorer
|
||
630 | */
|
||
631 | public void setExplorer(WMTSServerExplorer explorer) { |
||
632 | this.wmtsExplorer = explorer;
|
||
633 | } |
||
634 | 4272 | fdiaz | |
635 | 2485 | nbrodin | /**
|
636 | * Gets the explorer
|
||
637 | 4439 | fdiaz | * @return the server explorer
|
638 | 2485 | nbrodin | */
|
639 | public WMTSServerExplorer getExplorer() {
|
||
640 | return this.wmtsExplorer; |
||
641 | } |
||
642 | |||
643 | public Image getImageLegend() { |
||
644 | return dataStore.getImageLegend();
|
||
645 | } |
||
646 | |||
647 | public String getPathImage() { |
||
648 | return null; |
||
649 | } |
||
650 | 4272 | fdiaz | |
651 | 2485 | nbrodin | public FLayer cloneLayer() throws Exception { |
652 | RasterDataStore ds = dataStore.cloneDataStore(); |
||
653 | FLyrWMTS newLayer = new FLyrWMTS();
|
||
654 | newLayer.setName(getName()); |
||
655 | newLayer.setOpenRasterStore(ds); |
||
656 | newLayer.fullEnvelope = fullEnvelope; |
||
657 | newLayer.params = params; |
||
658 | newLayer.firstLoad = firstLoad; |
||
659 | newLayer.wmtsExplorer = wmtsExplorer; |
||
660 | 4272 | fdiaz | |
661 | 2485 | nbrodin | List<RasterFilter> filters = getRender().getFilterList().getStatusCloned();
|
662 | |||
663 | //Hacemos una copia de las bandas a renderizar
|
||
664 | ColorInterpretation ci = getRender().getRenderColorInterpretation(); |
||
665 | if(ci != null) { |
||
666 | newLayer.getRender().setRenderColorInterpretation(ci.cloneColorInterpretation()); |
||
667 | } |
||
668 | |||
669 | //Asignamos el entorno
|
||
670 | if(newLayer.getRender().getFilterList() == null) |
||
671 | newLayer.getRender().setFilterList(RasterLocator.getManager().createEmptyFilterList(getRender().getFilterList().getInitDataType())); |
||
672 | newLayer.getRender().getFilterList().setEnv(getRender().getFilterList().getEnv()); |
||
673 | newLayer.getRender().getFilterList().setStatus(filters); |
||
674 | |||
675 | // Asignamos los valores noData del original
|
||
676 | NoData nd = (NoData)getNoDataValue().clone(); |
||
677 | newLayer.setNoDataValue(nd); |
||
678 | newLayer.enableOpen(); |
||
679 | 4272 | fdiaz | |
680 | 2485 | nbrodin | return newLayer;
|
681 | } |
||
682 | |||
683 | /**
|
||
684 | * Assigns the flag to delete this layer from the cache
|
||
685 | 4439 | fdiaz | * @param deleteCache
|
686 | 2485 | nbrodin | */
|
687 | public void deleteCache(boolean deleteCache) { |
||
688 | this.deleteCache = deleteCache;
|
||
689 | } |
||
690 | 3066 | jjdelcerro | } |