Revision 4181 org.gvsig.raster.wms/trunk/org.gvsig.raster.wms/org.gvsig.raster.wms.app.wmsclient/src/main/java/org/gvsig/raster/wms/app/wmsclient/layer/FLyrWMS.java
FLyrWMS.java | ||
---|---|---|
2 | 2 |
* |
3 | 3 |
* Copyright (C) 2007-2008 Infrastructures and Transports Department |
4 | 4 |
* of the Valencian Government (CIT) |
5 |
*
|
|
5 |
* |
|
6 | 6 |
* This program is free software; you can redistribute it and/or |
7 | 7 |
* modify it under the terms of the GNU General Public License |
8 | 8 |
* as published by the Free Software Foundation; either version 2 |
9 | 9 |
* of the License, or (at your option) any later version. |
10 |
*
|
|
10 |
* |
|
11 | 11 |
* This program is distributed in the hope that it will be useful, |
12 | 12 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | 13 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | 14 |
* GNU General Public License for more details. |
15 |
*
|
|
15 |
* |
|
16 | 16 |
* You should have received a copy of the GNU General Public License |
17 | 17 |
* along with this program; if not, write to the Free Software |
18 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
18 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, |
|
19 | 19 |
* MA 02110-1301, USA. |
20 |
*
|
|
20 |
* |
|
21 | 21 |
*/ |
22 |
|
|
22 |
|
|
23 | 23 |
package org.gvsig.raster.wms.app.wmsclient.layer; |
24 | 24 |
|
25 | 25 |
import java.awt.Dimension; |
... | ... | |
33 | 33 |
import java.awt.geom.Rectangle2D; |
34 | 34 |
import java.awt.image.BufferedImage; |
35 | 35 |
import java.lang.ref.WeakReference; |
36 |
import java.net.URI; |
|
37 |
import java.net.URISyntaxException; |
|
36 | 38 |
import java.util.ArrayList; |
37 | 39 |
import java.util.HashMap; |
38 | 40 |
import java.util.Iterator; |
... | ... | |
45 | 47 |
|
46 | 48 |
import org.cresques.cts.ICoordTrans; |
47 | 49 |
import org.cresques.cts.IProjection; |
50 |
|
|
48 | 51 |
import org.gvsig.andami.PluginServices; |
49 | 52 |
import org.gvsig.fmap.dal.DALLocator; |
50 | 53 |
import org.gvsig.fmap.dal.DataManager; |
... | ... | |
104 | 107 |
import org.gvsig.tools.task.Cancellable; |
105 | 108 |
import org.gvsig.tools.task.SimpleTaskStatus; |
106 | 109 |
import org.gvsig.tools.task.TaskStatusManager; |
110 |
|
|
107 | 111 |
import org.slf4j.Logger; |
108 | 112 |
import org.slf4j.LoggerFactory; |
109 | 113 |
|
... | ... | |
139 | 143 |
public class FLyrWMS extends DefaultFLyrRaster { |
140 | 144 |
public static final String PERSISTENT_NAME = "FLyrWMS_Persistent"; |
141 | 145 |
public static final String PERSISTENT_DESCRIPTION = "FLyrWMS Persistent Definition"; |
142 |
|
|
146 |
|
|
143 | 147 |
private static final GeometryManager geomManager = GeometryLocator.getGeometryManager(); |
144 | 148 |
private static final Logger logger = LoggerFactory.getLogger(FLyrWMS.class); |
145 | 149 |
private boolean mustSplitRequest = false; |
... | ... | |
163 | 167 |
logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e); |
164 | 168 |
} |
165 | 169 |
} |
166 |
|
|
170 |
|
|
167 | 171 |
public FLyrWMS(DataStoreParameters dataStoreParameters) throws Exception { |
168 | 172 |
this(); |
169 | 173 |
//Create the explorer and connect |
170 | 174 |
DataManager dataManager = DALLocator.getDataManager(); |
171 |
WMSServerExplorerParameters explorerParams = (WMSServerExplorerParameters)
|
|
175 |
WMSServerExplorerParameters explorerParams = (WMSServerExplorerParameters) |
|
172 | 176 |
dataManager.createServerExplorerParameters(WMSServerExplorer.NAME); |
173 |
explorerParams.setHost((String)dataStoreParameters.getDynValue("uri"));
|
|
174 |
WMSServerExplorer wmsServerExplorer =
|
|
177 |
explorerParams.setHost((String)dataStoreParameters.getDynValue("uri")); |
|
178 |
WMSServerExplorer wmsServerExplorer = |
|
175 | 179 |
(WMSServerExplorer) dataManager.openServerExplorer(WMSServerExplorer.NAME, explorerParams); |
176 | 180 |
wmsServerExplorer.connect(null, ((RemoteStoreParameters)dataStoreParameters).isDeletingCache()); |
177 |
|
|
181 |
|
|
178 | 182 |
//Set the parameters |
179 | 183 |
setParameters((WMSDataParameters)dataStoreParameters); |
180 | 184 |
setExplorer(wmsServerExplorer); |
181 | 185 |
} |
182 |
|
|
186 |
|
|
183 | 187 |
public static DataStore createDataStore(String host, IProjection srs) throws InitializeException { |
184 | 188 |
DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager(); |
185 | 189 |
RasterDataParameters params = null; |
... | ... | |
190 | 194 |
} catch (ProviderNotRegisteredException e) { |
191 | 195 |
return null; |
192 | 196 |
} |
193 |
params.setURI(host); |
|
197 |
try { |
|
198 |
params.setURI(new URI(host)); |
|
199 |
} catch (URISyntaxException e1) { |
|
200 |
throw new InitializeException("Can't create URI from "+host, e1); |
|
201 |
} |
|
194 | 202 |
params.setSRS(srs); |
195 |
|
|
203 |
|
|
196 | 204 |
try { |
197 | 205 |
return dataman.openStore(params.getDataStoreName(), params); |
198 | 206 |
} catch (ValidateDataParametersException e) { |
... | ... | |
235 | 243 |
} |
236 | 244 |
return (String)formats.get(0); |
237 | 245 |
} |
238 |
|
|
246 |
|
|
239 | 247 |
public static void registerPersistent() { |
240 | 248 |
PersistenceManager manager = ToolsLocator.getPersistenceManager(); |
241 | 249 |
DynStruct definition = manager.getDefinition("FLyrWMS_Persistent"); |
... | ... | |
248 | 256 |
FLyrWMS.class, |
249 | 257 |
"FLyrWMS_Persistent", |
250 | 258 |
"FLyrWMS Persistent Definition", |
251 |
null,
|
|
259 |
null, |
|
252 | 260 |
null |
253 | 261 |
); |
254 |
|
|
262 |
|
|
255 | 263 |
definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE, DefaultFLyrRaster.PERSISTENT_NAME); |
256 | 264 |
} |
257 | 265 |
|
258 | 266 |
DefaultFLyrRaster.registerPersistence(definition); |
259 | 267 |
} |
260 |
|
|
268 |
|
|
261 | 269 |
public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort, |
262 | 270 |
Cancellable cancel, double scale) throws ReadException { |
263 | 271 |
TaskStatusManager manager = ToolsLocator.getTaskStatusManager(); |
... | ... | |
265 | 273 |
manager.add(taskStatus); |
266 | 274 |
taskStatus.setAutoremove(true); |
267 | 275 |
splitRequestCalculation(viewPort.getImageWidth(), viewPort.getImageHeight()); |
268 |
|
|
276 |
|
|
269 | 277 |
if(!firstLoad) { |
270 | 278 |
try { |
271 | 279 |
initFilters(); |
... | ... | |
280 | 288 |
} |
281 | 289 |
firstLoad = true; |
282 | 290 |
} |
283 |
|
|
291 |
|
|
284 | 292 |
enableStopped(); |
285 |
|
|
293 |
|
|
286 | 294 |
if(recalcLevel) { |
287 | 295 |
double pixelSize = viewPort.getEnvelope().getLength(0) / (double)viewPort.getImageWidth(); |
288 | 296 |
zoomLevel = dataStore.getNearestLevel(pixelSize); |
... | ... | |
319 | 327 |
} |
320 | 328 |
disableStopped(); |
321 | 329 |
} |
322 |
|
|
323 |
|
|
330 |
|
|
331 |
|
|
324 | 332 |
/** |
325 | 333 |
* This is the method used to draw a tile in a WMS mosaic layer. |
326 | 334 |
* @throws LoadLayerException |
... | ... | |
339 | 347 |
Rectangle2D vpRect = getRectable2DFromEnvelope(vpEnv); |
340 | 348 |
Rectangle2D layerRect = getRectable2DFromEnvelope(layerEnv); |
341 | 349 |
// 2. Intersect layer and viewport extents to get the area of interest |
342 |
Rectangle2D requestedRect = new Rectangle2D.Double();
|
|
350 |
Rectangle2D requestedRect = new Rectangle2D.Double(); |
|
343 | 351 |
Rectangle2D.intersect(layerRect, vpRect, requestedRect); |
344 | 352 |
|
345 | 353 |
// 3. Compute image size in pixels from the requested Extent |
... | ... | |
350 | 358 |
if ((wImg <= 0) || (hImg <= 0)) { |
351 | 359 |
return; |
352 | 360 |
} |
353 |
|
|
361 |
|
|
354 | 362 |
// 4. compute exactly the requested extent (from the rounded image size) |
355 | 363 |
// ensuring we are still within the layer extent |
356 | 364 |
double worldWidth = Math.abs((double)wImg/scalex); |
... | ... | |
370 | 378 |
else { |
371 | 379 |
worldY = requestedRect.getMinY(); |
372 | 380 |
} |
373 |
|
|
374 |
requestedRect.setRect(worldX, worldY, worldWidth, worldHeigh);
|
|
381 |
|
|
382 |
requestedRect.setRect(worldX, worldY, worldWidth, worldHeigh); |
|
375 | 383 |
Envelope requestedEnvelope = geomManager.createEnvelope(requestedRect.getMinX(), |
376 | 384 |
requestedRect.getMinY(), |
377 | 385 |
requestedRect.getMaxX(), |
378 | 386 |
requestedRect.getMaxY(), |
379 | 387 |
SUBTYPES.GEOM2D); |
380 | 388 |
Extent requestedExtent = rManager.getDataStructFactory().createExtent( |
381 |
requestedEnvelope.getMinimum(0),
|
|
382 |
requestedEnvelope.getMaximum(1),
|
|
383 |
requestedEnvelope.getMaximum(0),
|
|
389 |
requestedEnvelope.getMinimum(0), |
|
390 |
requestedEnvelope.getMaximum(1), |
|
391 |
requestedEnvelope.getMaximum(0), |
|
384 | 392 |
requestedEnvelope.getMinimum(1)); |
385 | 393 |
|
386 | 394 |
// 5. compute the new AffineTransform (ViewPort class can do it for us |
... | ... | |
390 | 398 |
auxVp.setImageSize(sz); |
391 | 399 |
auxVp.setEnvelope(requestedEnvelope); |
392 | 400 |
|
393 |
|
|
401 |
|
|
394 | 402 |
// 6. compute tile offeset. It is the sum of the original viewport offset |
395 | 403 |
// plus the offset introduced by intersecting layer and viewport extents |
396 | 404 |
double offsetX = vp.getOffset().getX(); |
... | ... | |
440 | 448 |
} catch (CreateEnvelopeException e) { |
441 | 449 |
drawingError(e); |
442 | 450 |
} finally { |
443 |
taskStatus.terminate();
|
|
451 |
taskStatus.terminate(); |
|
444 | 452 |
} |
445 | 453 |
} |
446 |
|
|
454 |
|
|
447 | 455 |
private void drawingError(Exception e) { |
448 | 456 |
setAvailable(false); |
449 | 457 |
JOptionPane.showMessageDialog(null, "Problems drawing this layer:" + e.getMessage(), Messages.getText("Error"), JOptionPane.ERROR_MESSAGE); |
450 | 458 |
logger.info("Problems drawing this layer:" + e.getMessage(), e); |
451 |
}
|
|
459 |
} |
|
452 | 460 |
|
453 | 461 |
/** |
454 | 462 |
* @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D, |
... | ... | |
526 | 534 |
@SuppressWarnings({ "unchecked", "rawtypes" }) |
527 | 535 |
public String toMapContext(String mapContextVersion) { |
528 | 536 |
XmlBuilder xml = new XmlBuilder(); |
529 |
|
|
537 |
|
|
530 | 538 |
String query = getParameters().getLayerQuery(); |
531 | 539 |
String[] layerNames = query.split(","); |
532 | 540 |
List<RemoteWMSStyle> styleList = getParameters().getStyles(); |
... | ... | |
672 | 680 |
public boolean isTiled() { |
673 | 681 |
return mustSplitRequest; |
674 | 682 |
} |
675 |
|
|
683 |
|
|
676 | 684 |
private void splitRequestCalculation(int width, int height) { |
677 | 685 |
RasterDataStore store = this.getDataStore(); |
678 | 686 |
if( store == null ) { |
... | ... | |
720 | 728 |
if (!getParameters().getURI().equals(aLayer.getParameters().getURI())) { |
721 | 729 |
return false; |
722 | 730 |
} |
723 |
|
|
724 |
WMSDataParameters p = getWMSParameters(getDataStore().getParameters());
|
|
725 |
|
|
731 |
|
|
732 |
WMSDataParameters p = getWMSParameters(getDataStore().getParameters()); |
|
733 |
|
|
726 | 734 |
if (!p.getFormat().equals(aLayer.getParameters().getFormat())) { |
727 | 735 |
return false; |
728 | 736 |
} |
... | ... | |
799 | 807 |
} |
800 | 808 |
return null; |
801 | 809 |
} |
802 |
|
|
810 |
|
|
803 | 811 |
public boolean isRemote() { |
804 | 812 |
return true; |
805 | 813 |
} |
... | ... | |
872 | 880 |
} |
873 | 881 |
return null; |
874 | 882 |
}*/ |
875 |
|
|
883 |
|
|
876 | 884 |
@Override |
877 | 885 |
public String getFileFormat() { |
878 | 886 |
return "WMS"; |
879 | 887 |
} |
880 |
|
|
888 |
|
|
881 | 889 |
@Override |
882 | 890 |
public FLayer getFileLayer() throws RasterDriverException { |
883 | 891 |
/*if(getDataStore() instanceof DefaultRemoteRasterStore) { |
884 | 892 |
RemoteRasterProvider prov = (RemoteRasterProvider)((DefaultRemoteRasterStore)getDataStore()).getProvider(0); |
885 | 893 |
File file = null; |
886 |
|
|
894 |
|
|
887 | 895 |
if(getParameters().isSizeFixed()) { |
888 | 896 |
file = prov.getFileLayer(); |
889 | 897 |
} else { |
890 | 898 |
file = prov.getLastRequest(); |
891 | 899 |
} |
892 |
|
|
900 |
|
|
893 | 901 |
if(file == null) |
894 | 902 |
return null; |
895 |
|
|
903 |
|
|
896 | 904 |
try { |
897 | 905 |
return DefaultFLyrRaster.createLayer("tmp", file); |
898 | 906 |
} catch (LoadLayerException e) { |
... | ... | |
944 | 952 |
return rAux; |
945 | 953 |
|
946 | 954 |
} |
947 |
|
|
955 |
|
|
948 | 956 |
public Extent getFullRasterExtent() { |
949 | 957 |
return getExtentFromEnvelope(getFullEnvelope()); |
950 | 958 |
} |
951 |
|
|
959 |
|
|
952 | 960 |
public DynObjectSet getInfo(org.gvsig.fmap.geom.primitive.Point p, double tolerance) throws LoadLayerException, DataException { |
953 | 961 |
Point p1 = new Point((int)p.getX(), (int)p.getY()); |
954 | 962 |
return getInfo(p1, tolerance, null, false); |
... | ... | |
969 | 977 |
getParameters().setWidth(viewPort.getImageWidth()); |
970 | 978 |
getParameters().setHeight(viewPort.getImageHeight()); |
971 | 979 |
} |
972 |
|
|
980 |
|
|
973 | 981 |
CancelTaskImpl cancellable = new CancelTaskImpl(cancel); |
974 | 982 |
getParameters().setCancellable(cancellable); |
975 |
|
|
983 |
|
|
976 | 984 |
String fInfo; |
977 | 985 |
try { |
978 | 986 |
//Point2D pt = new Point2D.Double(); |
... | ... | |
981 | 989 |
/*} catch (NoninvertibleTransformException e) { |
982 | 990 |
return null; |
983 | 991 |
}*/ |
984 |
|
|
992 |
|
|
985 | 993 |
Extent bbox = getExtentFromEnvelope(viewPort.getAdjustedEnvelope()); |
986 |
fInfo = getDataStore().getInfoByPoint(p.getX(),
|
|
987 |
p.getY(),
|
|
988 |
bbox,
|
|
989 |
viewPort.getImageWidth(),
|
|
990 |
viewPort.getImageHeight(),
|
|
994 |
fInfo = getDataStore().getInfoByPoint(p.getX(), |
|
995 |
p.getY(), |
|
996 |
bbox, |
|
997 |
viewPort.getImageWidth(), |
|
998 |
viewPort.getImageHeight(), |
|
991 | 999 |
cancellable); |
992 | 1000 |
} catch (InfoByPointException e) { |
993 | 1001 |
throw new LoadLayerException("Error in getInfoByPoint", e); |
994 | 1002 |
} |
995 | 1003 |
return new DynObjectSetWMSInfo(fInfo, getParameters().getInfoFormat()); |
996 | 1004 |
} |
997 |
|
|
1005 |
|
|
998 | 1006 |
private Extent getExtentFromEnvelope(Envelope env) { |
999 | 1007 |
double minx = env.getMinimum(0); |
1000 | 1008 |
double miny = env.getMinimum(1); |
... | ... | |
1006 | 1014 |
Point2D lr = new Point2D.Double(maxx, miny); |
1007 | 1015 |
return rManager.getDataStructFactory().createExtent(ul, lr, ur, ll); |
1008 | 1016 |
} |
1009 |
|
|
1017 |
|
|
1010 | 1018 |
/** |
1011 | 1019 |
* Sets the data store parameters |
1012 | 1020 |
* @param params |
... | ... | |
1016 | 1024 |
if(params instanceof TileDataParameters) { |
1017 | 1025 |
((TileDataParameters)params).deleteCache(deleteCache); |
1018 | 1026 |
} |
1019 |
|
|
1027 |
|
|
1020 | 1028 |
DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager(); |
1021 | 1029 |
try { |
1022 | 1030 |
DataStore dStore = dataman.openStore(params.getDataStoreName(), params); |
1023 | 1031 |
this.setDataStore(dStore); |
1024 |
|
|
1032 |
|
|
1025 | 1033 |
if(params instanceof WMSDataParameters) { |
1026 |
this.setName(((WMSDataParameters)params).getURI()); |
|
1034 |
this.setName(((WMSDataParameters)params).getURI().getPath());
|
|
1027 | 1035 |
} |
1028 |
|
|
1036 |
|
|
1029 | 1037 |
if(params instanceof TileDataParameters) { |
1030 | 1038 |
DataParameters p = ((TileDataParameters) params).getDataParameters(); |
1031 | 1039 |
if(p instanceof WMSDataParameters) { |
1032 |
this.setName(((WMSDataParameters) p).getURI()); |
|
1040 |
this.setName(((WMSDataParameters) p).getURI().getPath());
|
|
1033 | 1041 |
} |
1034 | 1042 |
} |
1035 | 1043 |
} catch (ValidateDataParametersException e) { |
... | ... | |
1040 | 1048 |
throw new InitializeException(e); |
1041 | 1049 |
} |
1042 | 1050 |
} |
1043 |
|
|
1051 |
|
|
1044 | 1052 |
public WMSDataParameters getParameters() { |
1045 | 1053 |
return getWMSParameters(getDataStore().getParameters()); |
1046 | 1054 |
} |
1047 |
|
|
1055 |
|
|
1048 | 1056 |
/** |
1049 | 1057 |
* Gets <code>WMSDataParameters</code> |
1050 | 1058 |
* @param parameters |
... | ... | |
1055 | 1063 |
if(parameters instanceof WMSDataParameters) { |
1056 | 1064 |
params = (WMSDataParameters) parameters; |
1057 | 1065 |
} |
1058 |
|
|
1066 |
|
|
1059 | 1067 |
if(parameters instanceof TileDataParameters) { |
1060 | 1068 |
DataParameters p = ((TileDataParameters) parameters).getDataParameters(); |
1061 | 1069 |
if(p instanceof WMSDataParameters) { |
... | ... | |
1064 | 1072 |
} |
1065 | 1073 |
return params; |
1066 | 1074 |
} |
1067 |
|
|
1075 |
|
|
1068 | 1076 |
/** |
1069 | 1077 |
* Assigns the flag to delete this layer from the cache |
1070 | 1078 |
* @param selected |
... | ... | |
1072 | 1080 |
public void deleteCache(boolean deleteCache) { |
1073 | 1081 |
this.deleteCache = deleteCache; |
1074 | 1082 |
} |
1075 |
|
|
1083 |
|
|
1076 | 1084 |
/** |
1077 | 1085 |
* Sets the explorer |
1078 | 1086 |
* @param explorer |
... | ... | |
1081 | 1089 |
if(getDataStore() != null) |
1082 | 1090 |
getDataStore().setExplorer(explorer); |
1083 | 1091 |
} |
1084 |
|
|
1092 |
|
|
1085 | 1093 |
/** |
1086 | 1094 |
* Gets the explorer |
1087 | 1095 |
* @return |
... | ... | |
1096 | 1104 |
} |
1097 | 1105 |
return null; |
1098 | 1106 |
} |
1099 |
|
|
1107 |
|
|
1100 | 1108 |
public FLayer cloneLayer() throws Exception { |
1101 | 1109 |
RasterDataStore ds = dataStore.cloneDataStore(); |
1102 | 1110 |
FLyrWMS newLayer = new FLyrWMS(); |
... | ... | |
1104 | 1112 |
newLayer.setOpenRasterStore(ds); |
1105 | 1113 |
//newLayer.firstLoad = firstLoad; |
1106 | 1114 |
newLayer.setExplorer(getExplorer()); |
1107 |
|
|
1115 |
|
|
1108 | 1116 |
List<RasterFilter> filters = getRender().getFilterList().getStatusCloned(); |
1109 | 1117 |
|
1110 | 1118 |
//Hacemos una copia de las bandas a renderizar |
... | ... | |
1124 | 1132 |
if(dataStore.getNoDataValue().isDefined()) |
1125 | 1133 |
newLayer.setNoDataTransparent(true); |
1126 | 1134 |
newLayer.enableOpen(); |
1127 |
|
|
1135 |
|
|
1128 | 1136 |
return newLayer; |
1129 | 1137 |
} |
1130 |
|
|
1138 |
|
|
1131 | 1139 |
@Override |
1132 | 1140 |
public boolean isInside(Point2D p) { |
1133 | 1141 |
// Don't call the data store isInside method, as the data store |
Also available in: Unified diff