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 / extrusion / DefaultVectorExtrusionLineRenderableLayer.java @ 767

History | View | Annotate | Download (5.42 KB)

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

    
3
import java.awt.Color;
4
import java.util.ArrayList;
5
import java.util.List;
6

    
7
import org.apache.commons.lang3.StringUtils;
8
import org.cresques.cts.ICoordTrans;
9
import org.cresques.cts.IProjection;
10

    
11
import org.gvsig.fmap.crs.CRSFactory;
12
import org.gvsig.fmap.dal.exception.DataException;
13
import org.gvsig.fmap.dal.feature.Feature;
14
import org.gvsig.fmap.dal.feature.FeatureQuery;
15
import org.gvsig.fmap.dal.feature.FeatureStore;
16
import org.gvsig.fmap.geom.Geometry;
17
import org.gvsig.fmap.geom.Geometry.TYPES;
18
import org.gvsig.fmap.geom.aggregate.MultiLine;
19
import org.gvsig.fmap.geom.primitive.Curve;
20
import org.gvsig.fmap.geom.primitive.Line;
21
import org.gvsig.fmap.geom.primitive.Point;
22
import org.gvsig.fmap.mapcontext.layers.FLayer;
23
import org.gvsig.fmap.mapcontext.rendering.legend.IVectorLegend;
24
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
25
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.line.ILineSymbol;
26
import org.gvsig.view3d.vector.lib.api.VectorElevationMode;
27
import org.gvsig.view3d.vector.lib.api.VectorExtrusionLoaderParameters;
28
import org.gvsig.view3d.vector.lib.api.VectorLoaderParameters;
29
import org.gvsig.view3d.vector.lib.impl.AbstractRenderableLayer;
30

    
31
import gov.nasa.worldwind.geom.Position;
32
import gov.nasa.worldwind.render.BasicShapeAttributes;
33
import gov.nasa.worldwind.render.Material;
34
import gov.nasa.worldwind.render.Path;
35
import gov.nasa.worldwind.render.Renderable;
36

    
37
public class DefaultVectorExtrusionLineRenderableLayer extends AbstractRenderableLayer {
38

    
39
    private BasicShapeAttributes normalShapeAttributes;
40

    
41
    public DefaultVectorExtrusionLineRenderableLayer(VectorLoaderParameters parameters, FeatureStore featureStore,
42
        IVectorLegend legend) {
43
        super(parameters, featureStore);
44
        this.normalShapeAttributes = getNormalShapAttributes(legend);
45
    }
46

    
47
    @Override
48
    protected List<Renderable> getRenderables(Feature feature) {
49

    
50
        double heightFieldValue = 0;
51
        String heightField = ((VectorExtrusionLoaderParameters) parameters).getHeightField();
52
        if (StringUtils.isNoneBlank(heightField)) {
53
            heightFieldValue = feature.getDouble(heightField);
54
        }
55

    
56
        Geometry geom = feature.getDefaultGeometry();
57
        List<Renderable> renderables = new ArrayList<>();
58
        if (geom.getGeometryType().isTypeOf(TYPES.MULTILINE)) {
59
            MultiLine multiLine = (MultiLine) geom;
60
            for (int i = 0; i < multiLine.getPrimitivesNumber(); i++) {
61
                if (multiLine.getCurveAt(i).getNumVertices() >= 2) {
62
                    renderables.add(getRenderable(multiLine.getCurveAt(i), heightFieldValue));
63
                }
64
            }
65
        } else {
66
            if (((Line) geom).getNumVertices() >= 2) {
67
                renderables.add(getRenderable((Line) geom, heightFieldValue));
68
            }
69
        }
70
        return renderables;
71
    }
72

    
73
    private Renderable getRenderable(Curve curve, double heightFieldValue) {
74
        boolean hasZ = curve.getDimension() > 2;
75
        double h = 0.0;
76

    
77
        if (VectorElevationMode.CLAMP_TO_GROUND.equals(parameters.getVectorElevationMode())) {
78
            hasZ = false;
79
        } else {
80
            if (VectorElevationMode.RELATIVE_TO_GROUND.equals(parameters.getVectorElevationMode())) {
81
                hasZ = false;
82
            }
83
            if (parameters.getConstantHeight() != null) {
84
                h = parameters.getConstantHeight();
85
            }
86
        }
87

    
88
        h += heightFieldValue;
89
        h *= ((VectorExtrusionLoaderParameters) parameters).getVerticalExaggeration();
90
        ICoordTrans coordTrans = getCoordTrans(this.parameters.getLayer().getProjection());
91
        List<Position> verticesList = getVertices(curve, h, hasZ, coordTrans);
92
        Path path = new Path(verticesList);
93
        path.setAltitudeMode(getAltitudeMode(this.parameters.getVectorElevationMode()));
94
        path.setAttributes(normalShapeAttributes);
95
        path.setExtrude(true);
96
        return path;
97
    }
98

    
99
    private BasicShapeAttributes getNormalShapAttributes(IVectorLegend legend) {
100

    
101
        Material outlineMaterial;
102
        double outlineOpacity = 1.0;
103
        double outlineWidth = 3.0;
104

    
105
        ISymbol symbol = legend.getDefaultSymbol();
106
        if (symbol instanceof ILineSymbol) {
107
            ILineSymbol lineSymbol = (ILineSymbol) symbol;
108
            Color lineColor = lineSymbol.getColor();
109
            int lineAlpha = lineSymbol.getAlpha();
110
            outlineMaterial = new Material(lineColor);
111
            outlineOpacity = lineAlpha / 255.0;
112
            outlineWidth = lineSymbol.getLineWidth();
113
        } else {
114
            outlineMaterial = new Material(this.parameters.getDefaultColor());
115
            outlineOpacity = 1.0;
116
            outlineWidth = 3.0;
117
        }
118
        normalShapeAttributes = new BasicShapeAttributes();
119
        normalShapeAttributes.setOutlineMaterial(outlineMaterial);
120
        normalShapeAttributes.setOutlineWidth(outlineWidth);
121
        normalShapeAttributes.setOutlineOpacity(outlineOpacity);
122
        return normalShapeAttributes;
123
    }
124
    
125
    @Override
126
    protected FeatureQuery getFeatureQuery() throws DataException {
127
        FeatureQuery featureQuery = super.getFeatureQuery();
128
        // Add field height to feature query
129
        String fieldHeight = ((VectorExtrusionLoaderParameters) parameters).getHeightField();
130
        if (StringUtils.isNotBlank(fieldHeight)) {
131
            featureQuery.addAttributeName(fieldHeight);
132
        }
133
        return featureQuery;
134
    }
135

    
136
}