root / trunk / extensions / extArcims / src / es / prodevelop / cit / gvsig / arcims / fmap / layers / FFeatureLyrArcIMSCollection.java @ 8110
History | View | Annotate | Download (14.1 KB)
1 |
package es.prodevelop.cit.gvsig.arcims.fmap.layers; |
---|---|
2 |
|
3 |
import java.awt.Graphics2D; |
4 |
import java.awt.geom.Rectangle2D; |
5 |
import java.awt.image.BufferedImage; |
6 |
import java.net.URL; |
7 |
import java.util.ArrayList; |
8 |
import java.util.Collections; |
9 |
import java.util.ConcurrentModificationException; |
10 |
import java.util.Iterator; |
11 |
import java.util.List; |
12 |
import java.util.Map; |
13 |
import java.util.Vector; |
14 |
|
15 |
import org.apache.log4j.Logger; |
16 |
import org.cresques.cts.IProjection; |
17 |
import org.cresques.cts.ProjectionPool; |
18 |
import org.gvsig.remoteClient.arcims.ArcImsFeatureClient; |
19 |
import org.gvsig.remoteClient.arcims.ArcImsProtocolHandler; |
20 |
import org.gvsig.remoteClient.arcims.utils.MyCancellable; |
21 |
import org.gvsig.remoteClient.arcims.utils.ServiceInfoTags; |
22 |
import org.gvsig.remoteClient.arcims.utils.ServiceInformation; |
23 |
import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayer; |
24 |
import org.gvsig.remoteClient.arcims.utils.ServiceInformationLayerFeatures; |
25 |
|
26 |
import com.iver.cit.gvsig.fmap.DriverException; |
27 |
import com.iver.cit.gvsig.fmap.MapContext; |
28 |
import com.iver.cit.gvsig.fmap.ViewPort; |
29 |
import com.iver.cit.gvsig.fmap.crs.CRSFactory; |
30 |
import com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter; |
31 |
import com.iver.cit.gvsig.fmap.layers.CancelationException; |
32 |
import com.iver.cit.gvsig.fmap.layers.FLayer; |
33 |
import com.iver.cit.gvsig.fmap.layers.FLayers; |
34 |
import com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent; |
35 |
import com.iver.cit.gvsig.fmap.layers.LayerCollectionListener; |
36 |
import com.iver.cit.gvsig.fmap.layers.LayerDrawEvent; |
37 |
import com.iver.cit.gvsig.fmap.layers.LayerPositionEvent; |
38 |
import com.iver.cit.gvsig.fmap.layers.SelectionEvent; |
39 |
import com.iver.cit.gvsig.fmap.layers.SelectionListener; |
40 |
import com.iver.cit.gvsig.fmap.layers.XMLException; |
41 |
import com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection; |
42 |
import com.iver.utiles.XMLEntity; |
43 |
import com.iver.utiles.connections.ConnectionException; |
44 |
import com.iver.utiles.swing.threads.Cancellable; |
45 |
import com.iver.utiles.swing.threads.DefaultCancellableMonitorable; |
46 |
|
47 |
import es.prodevelop.cit.gvsig.arcims.fmap.drivers.ArcImsVectorialAdapter; |
48 |
import es.prodevelop.cit.gvsig.arcims.fmap.drivers.FMapFeatureArcImsDriver; |
49 |
|
50 |
public class FFeatureLyrArcIMSCollection extends FLayers implements SelectionListener, LayerCollectionListener { |
51 |
|
52 |
private static Logger logger = Logger.getLogger(FFeatureLyrArcIMSCollection.class.getName()); |
53 |
private ArrayList layerlist = new ArrayList(); |
54 |
|
55 |
private boolean mustBeSeparated = false; |
56 |
|
57 |
private MapContext myFMap;
|
58 |
|
59 |
public FFeatureLyrArcIMSCollection(MapContext fmap, FLayers parent, boolean willbesep) { |
60 |
super(fmap, parent);
|
61 |
myFMap = fmap; |
62 |
mustBeSeparated = willbesep; |
63 |
} |
64 |
|
65 |
public FFeatureLyrArcIMSCollection() {
|
66 |
super(null, null); |
67 |
} |
68 |
|
69 |
public MapContext getMapContext() {
|
70 |
return myFMap;
|
71 |
} |
72 |
|
73 |
public boolean mustBeSeparated() { |
74 |
return mustBeSeparated;
|
75 |
} |
76 |
|
77 |
public void hasBeenSeparated() { |
78 |
mustBeSeparated = false;
|
79 |
} |
80 |
|
81 |
public void setParentLayer(FLayers lyr) { |
82 |
|
83 |
super.setParentLayer(lyr);
|
84 |
|
85 |
if (lyr == null) { |
86 |
return;
|
87 |
} |
88 |
|
89 |
myFMap = lyr.getMapContext(); |
90 |
if (lyr instanceof LayerCollection) { |
91 |
LayerCollection lyrcol = (LayerCollection) lyr; |
92 |
lyrcol.addLayerCollectionListener(this);
|
93 |
} |
94 |
} |
95 |
|
96 |
private List myGetList() { |
97 |
List resp = Collections.synchronizedList(new ArrayList()); |
98 |
|
99 |
int count = getLayersCount();
|
100 |
for (int i=0; i<count; i++) { |
101 |
resp.add(getLayer(i)); |
102 |
} |
103 |
return resp;
|
104 |
} |
105 |
|
106 |
// we need to rewrite this method because we dont have access to fmap
|
107 |
// and list
|
108 |
public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort, |
109 |
Cancellable cancel,double scale) throws DriverException { |
110 |
|
111 |
List myList = myGetList();
|
112 |
|
113 |
Iterator iter = myList.iterator();
|
114 |
try {
|
115 |
while (iter.hasNext()) {
|
116 |
if (cancel.isCanceled()) {
|
117 |
break; // M?s que nada porque las capas raster no son interrumpibles por ahora. |
118 |
} |
119 |
FLayer lyr = (FLayer) iter.next(); |
120 |
LayerDrawEvent beforeEvent = new LayerDrawEvent(lyr, g, viewPort, LayerDrawEvent.LAYER_BEFORE_DRAW);
|
121 |
|
122 |
myFMap.fireLayerDrawingEvent(beforeEvent); |
123 |
|
124 |
if (lyr.isVisible()) {
|
125 |
long t1 = System.currentTimeMillis(); |
126 |
try {
|
127 |
lyr.draw(image, g, viewPort, cancel,scale); |
128 |
} catch (DriverException e) {
|
129 |
myFMap.addLayerError("La capa " + lyr.getName() + " es err?nea."); |
130 |
e.printStackTrace(); |
131 |
} |
132 |
long t2 = System.currentTimeMillis(); |
133 |
System.out.println("Layer " + lyr.getName() + " " |
134 |
+ (t2-t1) + " milisecs.");
|
135 |
} |
136 |
LayerDrawEvent afterEvent = new LayerDrawEvent(lyr, g, viewPort, LayerDrawEvent.LAYER_AFTER_DRAW);
|
137 |
myFMap.fireLayerDrawingEvent(afterEvent); |
138 |
} |
139 |
if (getVirtualLayers() != null) { |
140 |
getVirtualLayers().draw(image, g, viewPort, cancel,scale); |
141 |
} |
142 |
} catch (ConcurrentModificationException e) { |
143 |
System.err.println(e.getMessage());
|
144 |
} |
145 |
} |
146 |
|
147 |
public void addLayer(FLayer layer) throws CancelationException { |
148 |
if (! (layer instanceof FFeatureLyrArcIMS)) { |
149 |
logger.error("Only FFeatureLyrArcIMS layers allowed in this collection. ");
|
150 |
return;
|
151 |
} |
152 |
FFeatureLyrArcIMS lyr = (FFeatureLyrArcIMS) layer; |
153 |
// lyr.addSelectionListener(this);
|
154 |
super.addLayer(layer);
|
155 |
layerlist.add(layer); |
156 |
} |
157 |
|
158 |
public void selectionChanged(SelectionEvent e) { |
159 |
// e.get
|
160 |
getMapContext().invalidate(); |
161 |
// System.out.println("==========> Selection changed somewhere....");
|
162 |
// TODO Auto-generated method stub
|
163 |
|
164 |
} |
165 |
|
166 |
public void setXMLEntity(XMLEntity xml) throws XMLException{ |
167 |
|
168 |
setActive(xml.getBooleanProperty("active"));
|
169 |
setName(xml.getStringProperty("name"));
|
170 |
setMinScale(xml.getDoubleProperty("minScale"));
|
171 |
setMaxScale(xml.getDoubleProperty("maxScale"));
|
172 |
setVisible(xml.getBooleanProperty("visible"));
|
173 |
|
174 |
if (xml.contains("proj")) { |
175 |
setProjection(CRSFactory.getCRS(xml.getStringProperty("proj")));
|
176 |
} |
177 |
|
178 |
if (xml.contains("transparency")) { |
179 |
setTransparency(xml.getIntProperty("transparency"));
|
180 |
} |
181 |
|
182 |
// ------------
|
183 |
|
184 |
int numLayers = xml.getIntProperty("numLayers"); |
185 |
String[] s = xml.getStringArrayProperty("LayerNames"); |
186 |
|
187 |
for (int i = 0; i < numLayers; i++) { |
188 |
FLayer layer = null;
|
189 |
try {
|
190 |
String className = xml.getChild(i).getStringProperty("className"); |
191 |
Class clase = Class.forName(className); |
192 |
layer = (FLayer) clase.newInstance(); |
193 |
layer.setName(s[i]); |
194 |
layer.setXMLEntity(xml.getChild(i)); |
195 |
layer.load(); |
196 |
logger.debug("Layer: "+ layer.getName() +" has been loaded."); |
197 |
} catch (Exception e) { |
198 |
logger.error("While loading layer: " + layer.getName() + " (visible = false)", e); |
199 |
layer.setVisible(false);
|
200 |
} |
201 |
addLayer(layer); |
202 |
} |
203 |
} |
204 |
|
205 |
public XMLEntity getXMLEntity() throws XMLException { |
206 |
|
207 |
XMLEntity xml = new XMLEntity();
|
208 |
xml.putProperty("className", this.getClass().getName()); |
209 |
xml.putProperty("active", isActive());
|
210 |
xml.putProperty("name", getName());
|
211 |
xml.putProperty("minScale", getMinScale());
|
212 |
xml.putProperty("maxScale", getMaxScale());
|
213 |
xml.putProperty("visible", isVisible());
|
214 |
|
215 |
if (getProjection() != null) { |
216 |
xml.putProperty("proj", getProjection().getAbrev());
|
217 |
} |
218 |
xml.putProperty("transparency", getTransparency());
|
219 |
|
220 |
// --------------------
|
221 |
|
222 |
xml.putProperty("numLayers", layerlist.size());
|
223 |
|
224 |
String[] s = new String[layerlist.size()]; |
225 |
|
226 |
for (int i = 0; i < layerlist.size(); i++) { |
227 |
s[i] = ((FFeatureLyrArcIMS) layerlist.get(i)).getName(); |
228 |
} |
229 |
|
230 |
xml.putProperty("LayerNames", s);
|
231 |
|
232 |
for (int i = 0; i < layerlist.size(); i++) { |
233 |
xml.addChild(((FFeatureLyrArcIMS) layerlist.get(i)).getXMLEntity()); |
234 |
} |
235 |
|
236 |
return xml;
|
237 |
} |
238 |
|
239 |
public void layerAdded(LayerCollectionEvent e) { |
240 |
// this layer has been added to a collection
|
241 |
// if it has to be separated, it will be separated now:
|
242 |
|
243 |
if (!mustBeSeparated) {
|
244 |
return;
|
245 |
} |
246 |
|
247 |
hasBeenSeparated(); |
248 |
|
249 |
FLayers lyr = getParentLayer(); |
250 |
if (lyr == null) { |
251 |
return;
|
252 |
} |
253 |
|
254 |
FLayer item; |
255 |
int count;
|
256 |
|
257 |
if (lyr instanceof LayerCollection) { |
258 |
LayerCollection lyrcol = (LayerCollection) lyr; |
259 |
count = getLayersCount(); |
260 |
while (count > 0) { |
261 |
item = getLayer(count - 1);
|
262 |
removeLayer(item); |
263 |
lyrcol.addLayer(item); |
264 |
count = getLayersCount(); |
265 |
} |
266 |
lyrcol.removeLayer(this);
|
267 |
} |
268 |
} |
269 |
|
270 |
public void layerMoved(LayerPositionEvent e) { |
271 |
// TODO Auto-generated method stub
|
272 |
|
273 |
} |
274 |
|
275 |
public void layerRemoved(LayerCollectionEvent e) { |
276 |
// TODO Auto-generated method stub
|
277 |
|
278 |
} |
279 |
|
280 |
public void layerAdding(LayerCollectionEvent e) throws CancelationException { |
281 |
// TODO Auto-generated method stub
|
282 |
|
283 |
} |
284 |
|
285 |
public void layerMoving(LayerPositionEvent e) throws CancelationException { |
286 |
// TODO Auto-generated method stub
|
287 |
|
288 |
} |
289 |
|
290 |
public void layerRemoving(LayerCollectionEvent e) throws CancelationException { |
291 |
// TODO Auto-generated method stub
|
292 |
|
293 |
} |
294 |
|
295 |
public void activationChanged(LayerCollectionEvent e) throws CancelationException { |
296 |
// TODO Auto-generated method stub
|
297 |
|
298 |
} |
299 |
|
300 |
public void visibilityChanged(LayerCollectionEvent e) throws CancelationException { |
301 |
// TODO Auto-generated method stub
|
302 |
|
303 |
} |
304 |
|
305 |
public void setXMLEntity03(XMLEntity xml) throws XMLException{ |
306 |
// TODO
|
307 |
} |
308 |
|
309 |
public void replaceLayer(String layerName, FLayer layer) { |
310 |
// TODO
|
311 |
} |
312 |
|
313 |
/**
|
314 |
* The extCatalogYNomenclator needs this creator.
|
315 |
*
|
316 |
* @param p a Map object with the following keys:
|
317 |
*
|
318 |
* (key, object type returned)
|
319 |
* ---------------------------
|
320 |
* "host", String (with or without the servlet path)
|
321 |
* "service_name", String (remote service name)
|
322 |
* "srs", String (coordinate system)
|
323 |
* "layer_name", String (local layer name)
|
324 |
*
|
325 |
* @return a FFeatureLyrArcIMSCollection layer
|
326 |
* @throws ConnectionException
|
327 |
*/
|
328 |
public FFeatureLyrArcIMSCollection(Map m) throws ConnectionException { |
329 |
|
330 |
super(null, null); |
331 |
|
332 |
try {
|
333 |
String _host = (String) m.get("host"); |
334 |
String host = ArcImsProtocolHandler.getUrlWithServlet(new URL(_host)).toString(); |
335 |
String service = (String) m.get("service_name"); |
336 |
String _srs = (String) m.get("srs"); |
337 |
String name = (String) m.get("layer_name"); |
338 |
|
339 |
// in case layer_name is missing or equals the empty string:
|
340 |
if ((name == null) || (name.length() == 0)) { |
341 |
name = service; |
342 |
} |
343 |
// --------------------------------------------
|
344 |
|
345 |
IProjection srs = CRSFactory.getCRS(_srs); |
346 |
|
347 |
MyCancellable myCanc = new MyCancellable(new DefaultCancellableMonitorable()); |
348 |
FMapFeatureArcImsDriver drv = new FMapFeatureArcImsDriver(host, service);
|
349 |
if (!drv.connect(myCanc)) {
|
350 |
throw new Exception("Unable to connect to server. "); |
351 |
} |
352 |
ServiceInformation si = drv.getClient().getServiceInformation(); |
353 |
int layercount = si.getLayers().size();
|
354 |
String layerQuery = ""; |
355 |
for (int i=0; i<layercount; i++) { |
356 |
if (isTrueString(((ServiceInformationLayer) si.getLayer(i)).getVisible())) {
|
357 |
layerQuery = layerQuery + "," + ((ServiceInformationLayer) si.getLayer(i)).getId();
|
358 |
} |
359 |
} |
360 |
|
361 |
if (layerQuery.length() == 0) { |
362 |
throw new Exception("No layers are visible by default "); |
363 |
} else {
|
364 |
layerQuery = layerQuery.substring(1);
|
365 |
} |
366 |
|
367 |
String[] selectedLayerIds = layerQuery.split(","); |
368 |
int count = selectedLayerIds.length;
|
369 |
|
370 |
FFeatureLyrArcIMS[] individualLayers = new FFeatureLyrArcIMS[count]; |
371 |
|
372 |
String item;
|
373 |
|
374 |
for (int i=0; i<count; i++) { |
375 |
|
376 |
item = selectedLayerIds[i]; |
377 |
|
378 |
drv = new FMapFeatureArcImsDriver(host, service, item);
|
379 |
if (!(drv.connect(myCanc))) throw new Exception(); |
380 |
|
381 |
ArcImsVectorialAdapter oldadapter = new ArcImsVectorialAdapter(drv);
|
382 |
VectorialEditableAdapter adapter = new VectorialEditableAdapter();
|
383 |
|
384 |
/* 1 */ individualLayers[i] = new FFeatureLyrArcIMS(adapter); |
385 |
/* 2 */ drv.setLayer(individualLayers[i]);
|
386 |
|
387 |
si = drv.getClient().getServiceInformation(); |
388 |
ServiceInformationLayerFeatures silf = (ServiceInformationLayerFeatures) si.getLayerById(item); |
389 |
String lyrname = silf.getName();
|
390 |
|
391 |
individualLayers[i].setProjectionInStatus(srs.getAbrev()); |
392 |
individualLayers[i].setHostInStatus(new URL(host)); |
393 |
individualLayers[i].setServiceInStatus(service); |
394 |
|
395 |
String units = si.getMapunits();
|
396 |
int theDpi = si.getScreen_dpi();
|
397 |
long scale;
|
398 |
if (silf.getMaxscale()!=-1){ |
399 |
scale = LayerScaleData.getTrueScaleFromRelativeScaleAndMapUnits(silf.getMaxscale(), units, theDpi); |
400 |
individualLayers[i].setMaxScale((double) scale);
|
401 |
} |
402 |
if (silf.getMinscale()!=-1){ |
403 |
scale = LayerScaleData.getTrueScaleFromRelativeScaleAndMapUnits(silf.getMinscale(), units, theDpi); |
404 |
individualLayers[i].setMinScale((double) scale);
|
405 |
} |
406 |
|
407 |
individualLayers[i].setServiceInformationInStatus(si); |
408 |
Vector ids = new Vector(); ids.add(item); |
409 |
individualLayers[i].setLayerIdsInStatus((Vector) ids.clone());
|
410 |
individualLayers[i].setSubfieldsInStatus(); |
411 |
/* 3 */
|
412 |
// individualLayers[i].setLegend(new VectorialUniqueValueLegend());
|
413 |
individualLayers[i].setHost(new URL(host)); |
414 |
individualLayers[i].setService(service); |
415 |
individualLayers[i].setServiceType(ServiceInfoTags.vFEATURESERVICE); |
416 |
individualLayers[i].setTransparency(0);
|
417 |
individualLayers[i].setLayerQuery(item); |
418 |
individualLayers[i].setProjection(srs); |
419 |
individualLayers[i].setName(lyrname); |
420 |
|
421 |
Rectangle2D fext = ((ArcImsFeatureClient) drv.getClient()).getLayerExtent(individualLayers[i].getArcimsStatus());
|
422 |
drv.setFullExtent(fext); |
423 |
// individualLayers[i].setF. setFullExtent(((ArcImsProtImageHandler) drv.getClient().getHandler()).getServiceExtent(srs, individualLayers[i].getArcimsStatus()));
|
424 |
|
425 |
// ------ -------------
|
426 |
drv.setAdapter(adapter); |
427 |
// adapter.setRecordSet(drv.getRecordSet());
|
428 |
adapter.setOriginalDataSource(drv.getRecordSet()); |
429 |
adapter.setOriginalVectorialAdapter(oldadapter); |
430 |
drv.declareTable(); |
431 |
individualLayers[i].setInitialLegend(); |
432 |
individualLayers[i].setShapeType(adapter.getShapeType()); |
433 |
individualLayers[i].setRecordset(drv.getRecordSet()); |
434 |
// ------ -------------
|
435 |
|
436 |
if ((si.getFeaturecoordsys() == null) || (si.getFeaturecoordsys().equals(""))) { |
437 |
si.setFeaturecoordsys(srs.getAbrev().substring(ServiceInfoTags.vINI_SRS.length()).trim()); |
438 |
logger.warn("Server provides no SRS. ");
|
439 |
} |
440 |
} |
441 |
setName(name); |
442 |
setProjection(srs); |
443 |
for (int i=0; i<count; i++) { |
444 |
addLayer(individualLayers[i]); |
445 |
} |
446 |
} catch (Exception e) { |
447 |
throw new ConnectionException("Unable to create ArcIMS feature layer collection ", e); |
448 |
} |
449 |
} |
450 |
|
451 |
private boolean isTrueString(String visible) { |
452 |
if (visible.compareToIgnoreCase("true") == 0) { |
453 |
return true; |
454 |
} |
455 |
return false; |
456 |
} |
457 |
} |