gvsig-3d / 2.1 / trunk / org.gvsig.view3d / org.gvsig.view3d.swing / org.gvsig.view3d.swing.impl / src / main / java / org / gvsig / view3d / swing / impl / data / DefaultLayerConverter.java @ 450
History | View | Annotate | Download (7.82 KB)
1 | 446 | llmarques | /**
|
---|---|---|---|
2 | * gvSIG. Desktop Geographic Information System.
|
||
3 | *
|
||
4 | * Copyright ? 2007-2015 gvSIG Association
|
||
5 | *
|
||
6 | * This program is free software; you can redistribute it and/or
|
||
7 | * modify it under the terms of the GNU General Public License
|
||
8 | * as published by the Free Software Foundation; either version 2
|
||
9 | * of the License, or (at your option) any later version.
|
||
10 | *
|
||
11 | * This program is distributed in the hope that it will be useful,
|
||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
14 | * GNU General Public License for more details.
|
||
15 | *
|
||
16 | * You should have received a copy of the GNU General Public License
|
||
17 | * along with this program; if not, write to the Free Software
|
||
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||
19 | * MA 02110-1301, USA.
|
||
20 | *
|
||
21 | * For any additional information, do not hesitate to contact us
|
||
22 | * at info AT gvsig.com, or visit our website www.gvsig.com.
|
||
23 | */
|
||
24 | |||
25 | package org.gvsig.view3d.swing.impl.data; |
||
26 | |||
27 | 450 | llmarques | import gov.nasa.worldwind.WorldWind; |
28 | import gov.nasa.worldwind.avlist.AVKey; |
||
29 | import gov.nasa.worldwind.avlist.AVList; |
||
30 | import gov.nasa.worldwind.avlist.AVListImpl; |
||
31 | import gov.nasa.worldwind.geom.Sector; |
||
32 | import gov.nasa.worldwind.globes.ElevationModel; |
||
33 | import gov.nasa.worldwind.layers.Layer; |
||
34 | import gov.nasa.worldwind.layers.TiledImageLayer; |
||
35 | import gov.nasa.worldwindx.examples.dataimport.DataInstallUtil; |
||
36 | |||
37 | 446 | llmarques | import java.awt.geom.Point2D; |
38 | import java.io.File; |
||
39 | import java.security.MessageDigest; |
||
40 | import java.security.NoSuchAlgorithmException; |
||
41 | |||
42 | import org.cresques.cts.ICoordTrans; |
||
43 | import org.cresques.cts.IProjection; |
||
44 | import org.slf4j.Logger; |
||
45 | import org.slf4j.LoggerFactory; |
||
46 | import org.w3c.dom.Document; |
||
47 | |||
48 | import org.gvsig.fmap.crs.CRSFactory; |
||
49 | import org.gvsig.fmap.dal.coverage.datastruct.Extent; |
||
50 | import org.gvsig.fmap.dal.exception.DataException; |
||
51 | 450 | llmarques | import org.gvsig.fmap.dal.exception.ReadException; |
52 | 446 | llmarques | import org.gvsig.fmap.geom.primitive.Envelope; |
53 | import org.gvsig.fmap.mapcontext.MapContext; |
||
54 | import org.gvsig.fmap.mapcontext.ViewPort; |
||
55 | import org.gvsig.fmap.mapcontext.layers.FLayer; |
||
56 | import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect; |
||
57 | import org.gvsig.raster.fmap.layers.FLyrRaster; |
||
58 | 450 | llmarques | import org.gvsig.view3d.swing.api.MapControl3D; |
59 | 446 | llmarques | |
60 | /**
|
||
61 | * @author <a href="mailto:lmarques@disid.com">Lluis Marques</a>
|
||
62 | *
|
||
63 | */
|
||
64 | public class DefaultLayerConverter implements LayerConverter { |
||
65 | |||
66 | private static final Logger logger = LoggerFactory |
||
67 | .getLogger(DefaultLayerConverter.class); |
||
68 | |||
69 | 450 | llmarques | public Layer convertToLayer(MapContext mapContext, FLayer layer)
|
70 | throws DataException {
|
||
71 | 446 | llmarques | |
72 | AVList params = new AVListImpl();
|
||
73 | 450 | llmarques | |
74 | // Add Layer MapContext to parameters.
|
||
75 | params.setValue(MapControl3D.GVSIG_MAPCONTEXT, mapContext); |
||
76 | createRasterTiledImageLayerParams(layer, params); |
||
77 | |||
78 | // Create configuration document from parameters.
|
||
79 | Document doc =
|
||
80 | TiledImageLayer.createTiledImageLayerConfigDocument(params); |
||
81 | |||
82 | // Copy parameters to avoid problems
|
||
83 | AVList paramsLayer = params.copy(); |
||
84 | 446 | llmarques | |
85 | 450 | llmarques | RasterTiledImageLayer rasterLayer = |
86 | new RasterTiledImageLayer(doc.getDocumentElement(), paramsLayer);
|
||
87 | return rasterLayer;
|
||
88 | } |
||
89 | 446 | llmarques | |
90 | 450 | llmarques | public ElevationModel convertToElevationModel(MapContext mapContext,
|
91 | FLayer layer) { |
||
92 | // TODO Auto-generated method stub
|
||
93 | return null; |
||
94 | } |
||
95 | |||
96 | private String getUniqueCacheId(String name) { |
||
97 | // TODO Esto es insuficiente. Tener en cuenta m?s propiedades para la generaci?n
|
||
98 | // del id.
|
||
99 | try {
|
||
100 | // Create MD5 Hash
|
||
101 | MessageDigest digest =
|
||
102 | java.security.MessageDigest.getInstance("MD5");
|
||
103 | digest.update(name.getBytes()); |
||
104 | byte messageDigest[] = digest.digest(); |
||
105 | |||
106 | // Create Hex String
|
||
107 | StringBuilder hexString = new StringBuilder(); |
||
108 | hexString.append(name); |
||
109 | hexString.append("-");
|
||
110 | for (int i = 0; i < messageDigest.length; i++) |
||
111 | hexString.append(Integer.toHexString(0xFF & messageDigest[i])); |
||
112 | return hexString.toString();
|
||
113 | |||
114 | } catch (NoSuchAlgorithmException e) { |
||
115 | logger.info("MD5 algorith is not available", e);
|
||
116 | return name;
|
||
117 | } |
||
118 | } |
||
119 | |||
120 | private void createRasterTiledImageLayerParams(FLayer layer, AVList params) { |
||
121 | |||
122 | // TODO Obtener las propiedades 3D de la capa mediane
|
||
123 | // View3DManager.getProperties3D(layer)
|
||
124 | // y rellenar los parametros con las propiedades definidas.
|
||
125 | |||
126 | if (params == null) { |
||
127 | params = new AVListImpl();
|
||
128 | } |
||
129 | |||
130 | params.setValue(AVKey.DATASET_NAME, layer.getName()); |
||
131 | params.setValue(AVKey.DATA_CACHE_NAME, |
||
132 | getUniqueCacheId(layer.getName())); |
||
133 | |||
134 | 446 | llmarques | File installLocation =
|
135 | DataInstallUtil.getDefaultInstallLocation(WorldWind |
||
136 | .getDataFileStore()); |
||
137 | params.setValue(AVKey.FILE_STORE_LOCATION, |
||
138 | installLocation.getAbsolutePath()); |
||
139 | |||
140 | 450 | llmarques | MapContext mapContext = |
141 | (MapContext) params.getValue(MapControl3D.GVSIG_MAPCONTEXT); |
||
142 | 446 | llmarques | |
143 | 450 | llmarques | Sector sector = null;
|
144 | try {
|
||
145 | sector = getSector(layer, mapContext.getProjection()); |
||
146 | } catch (DataException e) {
|
||
147 | logger.info("Can't create sector from layer and projection", e);
|
||
148 | return;
|
||
149 | } |
||
150 | |||
151 | params.setValue(AVKey.SECTOR, sector); |
||
152 | |||
153 | if (layer instanceof FLyrRaster) { |
||
154 | |||
155 | params.setValue(AVKey.WIDTH, (int) ((FLyrRaster) layer)
|
||
156 | .getDataStore().getWidth()); |
||
157 | params.setValue(AVKey.HEIGHT, (int) ((FLyrRaster) layer)
|
||
158 | .getDataStore().getHeight()); |
||
159 | |||
160 | } else if (layer instanceof FLyrVect) { |
||
161 | |||
162 | ViewPort viewPort = null;
|
||
163 | try {
|
||
164 | viewPort = (ViewPort) mapContext.getViewPort().clone(); |
||
165 | viewPort.setEnvelope(((FLyrVect) layer).getFullEnvelope()); |
||
166 | // viewPort.setImageSize(new Dimension(50000, 50000));
|
||
167 | } catch (CloneNotSupportedException e) { |
||
168 | logger.info("Can't clone MapContext viewport: "
|
||
169 | + mapContext.getViewPort().toString(), e); |
||
170 | return;
|
||
171 | } catch (ReadException e) {
|
||
172 | logger.info( |
||
173 | "Can't get full envelope of " + layer.getInfoString(), e);
|
||
174 | return;
|
||
175 | } |
||
176 | |||
177 | params.setValue(AVKey.WIDTH, (int) viewPort.getImageWidth());
|
||
178 | params.setValue(AVKey.HEIGHT, (int) viewPort.getImageHeight());
|
||
179 | } |
||
180 | } |
||
181 | |||
182 | private Sector getSector(FLayer layer, IProjection projection)
|
||
183 | throws DataException {
|
||
184 | |||
185 | 446 | llmarques | ICoordTrans ct = projection.getCT(CRSFactory.getCRS("EPSG:4326"));
|
186 | Point2D p1 = null; |
||
187 | Point2D p2 = null; |
||
188 | |||
189 | if (layer instanceof FLyrVect) { |
||
190 | |||
191 | Envelope envelope = |
||
192 | ((FLyrVect) layer).getFeatureStore().getEnvelope(); |
||
193 | p1 = |
||
194 | ct.convert( |
||
195 | new Point2D.Double(envelope.getMinimum(0), envelope |
||
196 | .getMinimum(1)), null); |
||
197 | p2 = |
||
198 | ct.convert( |
||
199 | new Point2D.Double(envelope.getMaximum(0), envelope |
||
200 | .getMaximum(1)), null); |
||
201 | |||
202 | } else if (layer instanceof FLyrRaster) { |
||
203 | |||
204 | Extent extent = ((FLyrRaster) layer).getDataStore().getExtent(); |
||
205 | p1 = |
||
206 | ct.convert( |
||
207 | new Point2D.Double(extent.getLLX(), extent.getLLY()), null); |
||
208 | p2 = |
||
209 | ct.convert( |
||
210 | new Point2D.Double(extent.getURX(), extent.getURY()), null); |
||
211 | } |
||
212 | |||
213 | double minLatitude = p1.getY();
|
||
214 | double maxLatitude = p2.getY();
|
||
215 | double minLongitude = p1.getX();
|
||
216 | double maxLongitude = p2.getX();
|
||
217 | |||
218 | Sector sector = |
||
219 | new Sector(Sector.fromDegrees(minLatitude, maxLatitude,
|
||
220 | minLongitude, maxLongitude)); |
||
221 | |||
222 | 450 | llmarques | return sector;
|
223 | 446 | llmarques | } |
224 | } |