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 @ 772

History | View | Annotate | Download (6.13 KB)

1 761 llmarques
package org.gvsig.view3d.vector.lib.impl;
2
3 767 llmarques
import java.util.ArrayList;
4 761 llmarques
import java.util.List;
5
import java.util.concurrent.ExecutorService;
6
import java.util.concurrent.Executors;
7
8 767 llmarques
import org.cresques.cts.ICoordTrans;
9
import org.cresques.cts.IProjection;
10 761 llmarques
import org.slf4j.Logger;
11
import org.slf4j.LoggerFactory;
12
13 767 llmarques
import org.gvsig.fmap.crs.CRSFactory;
14 761 llmarques
import org.gvsig.fmap.dal.exception.DataException;
15
import org.gvsig.fmap.dal.feature.Feature;
16
import org.gvsig.fmap.dal.feature.FeatureQuery;
17
import org.gvsig.fmap.dal.feature.FeatureSet;
18
import org.gvsig.fmap.dal.feature.FeatureStore;
19 763 llmarques
import org.gvsig.fmap.dal.feature.FeatureType;
20 767 llmarques
import org.gvsig.fmap.geom.primitive.OrientablePrimitive;
21
import org.gvsig.fmap.geom.primitive.Point;
22 772 llmarques
import org.gvsig.fmap.mapcontext.rendering.legend.IVectorLegend;
23 761 llmarques
import org.gvsig.tools.dispose.DisposableIterator;
24
import org.gvsig.view3d.vector.lib.api.VectorElevationMode;
25
import org.gvsig.view3d.vector.lib.api.VectorLoaderParameters;
26
27
import gov.nasa.worldwind.WorldWind;
28 767 llmarques
import gov.nasa.worldwind.geom.Position;
29 761 llmarques
import gov.nasa.worldwind.layers.RenderableLayer;
30
import gov.nasa.worldwind.render.Renderable;
31
32 762 llmarques
public abstract class AbstractRenderableLayer extends RenderableLayer {
33 761 llmarques
34 762 llmarques
    private static final Logger LOG = LoggerFactory.getLogger(AbstractRenderableLayer.class);
35 761 llmarques
36
    protected FeatureStore featureStore;
37 772 llmarques
    protected IVectorLegend legend;
38 761 llmarques
39
    protected VectorLoaderParameters parameters;
40
41 772 llmarques
    public AbstractRenderableLayer(VectorLoaderParameters parameters, FeatureStore featureStore, IVectorLegend legend) {
42 761 llmarques
        this.featureStore = featureStore;
43 772 llmarques
        this.legend = legend;
44 761 llmarques
        this.parameters = parameters;
45 772 llmarques
        addRenderableObjects();
46
    }
47
48
    protected void addRenderableObjects() {
49 761 llmarques
        ExecutorService executor = Executors.newSingleThreadExecutor();
50 772 llmarques
        executor.execute( new Runnable() {
51 761 llmarques
52
            @Override
53
            public void run() {
54
                FeatureQuery featureQuery;
55
                try {
56
                    featureQuery = getFeatureQuery();
57
                } catch (DataException e) {
58
                    LOG.error(String.format("Can not access to feature type of %1s", featureStore.getFullName()), e);
59
                    removeAllRenderables();
60
                    return;
61
                }
62
63
                FeatureSet featureSet = null;
64
                DisposableIterator it = null;
65
                try {
66
                    featureSet = featureStore.getFeatureSet(featureQuery);
67
                    it = featureSet.fastIterator();
68
                    while (it.hasNext()) {
69
                        Feature feature = (Feature) it.next();
70 767 llmarques
                        List<Renderable> renderables = getRenderables(feature);
71 761 llmarques
                        for (Renderable renderable : renderables) {
72
                            addRenderable(renderable);
73
                        }
74
                    }
75
                } catch (DataException e) {
76
                    LOG.error(String.format("Can not access to %1s data", featureStore.getFullName()), e);
77
                    removeAllRenderables();
78
                    return;
79
                } finally {
80
                    if (it != null) {
81
                        it.dispose();
82
                    }
83
                    if (featureSet != null) {
84
                        featureSet.dispose();
85
                    }
86
                }
87
            }
88 772 llmarques
        });
89 761 llmarques
    }
90
91
    protected int getAltitudeMode(VectorElevationMode mode) {
92 770 llmarques
93
        if(mode == null) {
94
            LOG.debug("Setting clamp to ground altitude mode by default");
95
            return WorldWind.CLAMP_TO_GROUND;
96
        }
97
98 761 llmarques
        switch (mode) {
99
        case CLAMP_TO_GROUND:
100
            return WorldWind.CLAMP_TO_GROUND;
101
        case ABSOLUTE:
102
            return WorldWind.ABSOLUTE;
103
        case RELATIVE_TO_GROUND:
104
            return WorldWind.RELATIVE_TO_GROUND;
105
        default:
106
            throw new IllegalArgumentException(
107
                "Vector elevation mode not reconized. Only CLAMP_TO_GROUND, ABSOLUTE and RELATIVE_TO_GROUND are valid");
108
        }
109
    }
110 763 llmarques
111
    protected FeatureQuery getFeatureQuery() throws DataException {
112
        FeatureType featureType = featureStore.getDefaultFeatureType();
113
        String geomAtt = featureType.getDefaultGeometryAttributeName();
114
        FeatureQuery featureQuery = featureStore.createFeatureQuery();
115
        featureQuery.addAttributeName(geomAtt);
116
        return featureQuery;
117
    }
118 767 llmarques
119
    protected List<Position> getVertices(OrientablePrimitive primitive, double h, boolean hasZ, ICoordTrans coordTrans) {
120
        List<Position> verticesList = new ArrayList<>(primitive.getNumVertices());
121
        for (int i = 0; i < primitive.getNumVertices(); i++) {
122
            Point vertex = primitive.getVertex(i);
123
124
            // Reproject point if there is a coordinate transformation
125
            if (coordTrans != null) {
126
                vertex.reProject(coordTrans);
127
            }
128
129
            if (hasZ) {
130
                double z = vertex.getCoordinateAt(2);
131
                verticesList.add(Position.fromDegrees(vertex.getY(), vertex.getX(), z + h));
132
            } else {
133
                verticesList.add(Position.fromDegrees(vertex.getY(), vertex.getX(), h));
134
            }
135
        }
136
        return verticesList;
137
    }
138
139
    protected ICoordTrans getCoordTrans(IProjection origProj) {
140
        IProjection destProj = CRSFactory.getCRS("EPSG:4326");
141
        return origProj.getCT(destProj);
142
    }
143 772 llmarques
144
    @Override
145
    public void setExpiryTime(long expiryTime) {
146
        // If expiry time is greater than last expiry time, reload
147
        // renderables
148
        if (expiryTime > this.getExpiryTime()) {
149
            reloadRenderables();
150
        }
151
        super.setExpiryTime(expiryTime);
152
    }
153 761 llmarques
154 772 llmarques
    protected void reloadRenderables() {
155
        // Clear renderables
156
        clearRenderables();
157
        // Clear render attibutes
158
        clearRenderAttributes();
159
        // Reload renderables
160
        addRenderableObjects();
161
    }
162
163
    /**
164
     *
165
     */
166
    protected abstract void clearRenderAttributes();
167
168
    /**
169
     *
170
     * @param feature
171
     * @return
172
     */
173 767 llmarques
    protected abstract List<Renderable> getRenderables(Feature feature);
174 761 llmarques
}