Statistics
| Revision:

gvsig-3d / 2.1 / trunk / org.gvsig.view3d / org.gvsig.view3d.vector / org.gvsig.view3d.vector.lib / org.gvsig.view3d.vector.lib.impl / src / main / java / org / gvsig / view3d / vector / lib / impl / AbstractRenderableLayer.java @ 763

History | View | Annotate | Download (3.87 KB)

1
package org.gvsig.view3d.vector.lib.impl;
2

    
3
import java.util.List;
4
import java.util.concurrent.ExecutorService;
5
import java.util.concurrent.Executors;
6

    
7
import org.slf4j.Logger;
8
import org.slf4j.LoggerFactory;
9

    
10
import org.gvsig.fmap.dal.exception.DataException;
11
import org.gvsig.fmap.dal.feature.Feature;
12
import org.gvsig.fmap.dal.feature.FeatureQuery;
13
import org.gvsig.fmap.dal.feature.FeatureSet;
14
import org.gvsig.fmap.dal.feature.FeatureStore;
15
import org.gvsig.fmap.dal.feature.FeatureType;
16
import org.gvsig.tools.dispose.DisposableIterator;
17
import org.gvsig.view3d.vector.lib.api.VectorElevationMode;
18
import org.gvsig.view3d.vector.lib.api.VectorLoaderParameters;
19

    
20
import gov.nasa.worldwind.WorldWind;
21
import gov.nasa.worldwind.layers.RenderableLayer;
22
import gov.nasa.worldwind.render.Renderable;
23

    
24
public abstract class AbstractRenderableLayer extends RenderableLayer {
25

    
26
    private static final Logger LOG = LoggerFactory.getLogger(AbstractRenderableLayer.class);
27

    
28
    protected FeatureStore featureStore;
29

    
30
    protected VectorLoaderParameters parameters;
31

    
32
    public AbstractRenderableLayer(VectorLoaderParameters parameters, FeatureStore featureStore) {
33
        this.featureStore = featureStore;
34
        this.parameters = parameters;
35
        ExecutorService executor = Executors.newSingleThreadExecutor();
36
        executor.execute(addRenderableObjects());
37
    }
38

    
39
    protected Runnable addRenderableObjects() {
40
        
41
        return new Runnable() {
42
            
43
            @Override
44
            public void run() {
45
                FeatureQuery featureQuery;
46
                try {
47
                    featureQuery = getFeatureQuery();
48
                } catch (DataException e) {
49
                    LOG.error(String.format("Can not access to feature type of %1s", featureStore.getFullName()), e);
50
                    removeAllRenderables();
51
                    return;
52
                }
53

    
54
                FeatureSet featureSet = null;
55
                DisposableIterator it = null;
56
                try {
57
                    featureSet = featureStore.getFeatureSet(featureQuery);
58
                    it = featureSet.fastIterator();
59
                    while (it.hasNext()) {
60
                        Feature feature = (Feature) it.next();
61
                        List<Renderable> renderables = getRenderable(feature);
62
                        for (Renderable renderable : renderables) {
63
                            addRenderable(renderable);
64
                        }
65
                    }
66
                } catch (DataException e) {
67
                    LOG.error(String.format("Can not access to %1s data", featureStore.getFullName()), e);
68
                    removeAllRenderables();
69
                    return;
70
                } finally {
71
                    if (it != null) {
72
                        it.dispose();
73
                    }
74
                    if (featureSet != null) {
75
                        featureSet.dispose();
76
                    }
77
                }
78
            }
79
        };
80
    }
81

    
82
    protected int getAltitudeMode(VectorElevationMode mode) {
83
        switch (mode) {
84
        case CLAMP_TO_GROUND:
85
            return WorldWind.CLAMP_TO_GROUND;
86
        case ABSOLUTE:
87
            return WorldWind.ABSOLUTE;
88
        case RELATIVE_TO_GROUND:
89
            return WorldWind.RELATIVE_TO_GROUND;
90
        default:
91
            throw new IllegalArgumentException(
92
                "Vector elevation mode not reconized. Only CLAMP_TO_GROUND, ABSOLUTE and RELATIVE_TO_GROUND are valid");
93
        }
94
    }
95
    
96
    protected FeatureQuery getFeatureQuery() throws DataException {
97
        FeatureType featureType = featureStore.getDefaultFeatureType();
98
        String geomAtt = featureType.getDefaultGeometryAttributeName();
99
        FeatureQuery featureQuery = featureStore.createFeatureQuery();
100
        featureQuery.addAttributeName(geomAtt);
101
        return featureQuery;
102
    }
103

    
104
    protected abstract List<Renderable> getRenderable(Feature feature);
105
}