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

History | View | Annotate | Download (5.33 KB)

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

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

    
8
import org.cresques.cts.ICoordTrans;
9
import org.cresques.cts.IProjection;
10
import org.slf4j.Logger;
11
import org.slf4j.LoggerFactory;
12

    
13
import org.gvsig.fmap.crs.CRSFactory;
14
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
import org.gvsig.fmap.dal.feature.FeatureType;
20
import org.gvsig.fmap.geom.primitive.OrientablePrimitive;
21
import org.gvsig.fmap.geom.primitive.Point;
22
import org.gvsig.tools.dispose.DisposableIterator;
23
import org.gvsig.view3d.vector.lib.api.VectorElevationMode;
24
import org.gvsig.view3d.vector.lib.api.VectorLoaderParameters;
25

    
26
import gov.nasa.worldwind.WorldWind;
27
import gov.nasa.worldwind.geom.Position;
28
import gov.nasa.worldwind.layers.RenderableLayer;
29
import gov.nasa.worldwind.render.Renderable;
30

    
31
public abstract class AbstractRenderableLayer extends RenderableLayer {
32

    
33
    private static final Logger LOG = LoggerFactory.getLogger(AbstractRenderableLayer.class);
34

    
35
    protected FeatureStore featureStore;
36

    
37
    protected VectorLoaderParameters parameters;
38

    
39
    public AbstractRenderableLayer(VectorLoaderParameters parameters, FeatureStore featureStore) {
40
        this.featureStore = featureStore;
41
        this.parameters = parameters;
42
        ExecutorService executor = Executors.newSingleThreadExecutor();
43
        executor.execute(addRenderableObjects());
44
    }
45

    
46
    protected Runnable addRenderableObjects() {
47
        
48
        return new Runnable() {
49
            
50
            @Override
51
            public void run() {
52
                FeatureQuery featureQuery;
53
                try {
54
                    featureQuery = getFeatureQuery();
55
                } catch (DataException e) {
56
                    LOG.error(String.format("Can not access to feature type of %1s", featureStore.getFullName()), e);
57
                    removeAllRenderables();
58
                    return;
59
                }
60

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

    
89
    protected int getAltitudeMode(VectorElevationMode mode) {
90
        
91
        if(mode == null) {
92
            LOG.debug("Setting clamp to ground altitude mode by default");
93
            return WorldWind.CLAMP_TO_GROUND;
94
        }
95
        
96
        switch (mode) {
97
        case CLAMP_TO_GROUND:
98
            return WorldWind.CLAMP_TO_GROUND;
99
        case ABSOLUTE:
100
            return WorldWind.ABSOLUTE;
101
        case RELATIVE_TO_GROUND:
102
            return WorldWind.RELATIVE_TO_GROUND;
103
        default:
104
            throw new IllegalArgumentException(
105
                "Vector elevation mode not reconized. Only CLAMP_TO_GROUND, ABSOLUTE and RELATIVE_TO_GROUND are valid");
106
        }
107
    }
108
    
109
    protected FeatureQuery getFeatureQuery() throws DataException {
110
        FeatureType featureType = featureStore.getDefaultFeatureType();
111
        String geomAtt = featureType.getDefaultGeometryAttributeName();
112
        FeatureQuery featureQuery = featureStore.createFeatureQuery();
113
        featureQuery.addAttributeName(geomAtt);
114
        return featureQuery;
115
    }
116
    
117
    protected List<Position> getVertices(OrientablePrimitive primitive, double h, boolean hasZ, ICoordTrans coordTrans) {
118
        List<Position> verticesList = new ArrayList<>(primitive.getNumVertices());
119
        for (int i = 0; i < primitive.getNumVertices(); i++) {
120
            Point vertex = primitive.getVertex(i);
121
            
122
            // Reproject point if there is a coordinate transformation
123
            if (coordTrans != null) {
124
                vertex.reProject(coordTrans);
125
            }
126
            
127
            if (hasZ) {
128
                double z = vertex.getCoordinateAt(2);
129
                verticesList.add(Position.fromDegrees(vertex.getY(), vertex.getX(), z + h));
130
            } else {
131
                verticesList.add(Position.fromDegrees(vertex.getY(), vertex.getX(), h));
132
            }
133
        }
134
        return verticesList;
135
    }
136
    
137
    protected ICoordTrans getCoordTrans(IProjection origProj) {
138
        IProjection destProj = CRSFactory.getCRS("EPSG:4326");
139
        return origProj.getCT(destProj);
140
    }
141

    
142
    protected abstract List<Renderable> getRenderables(Feature feature);
143
}