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 / vector / DefaultVectorPolygonRenderableLayer.java @ 767

History | View | Annotate | Download (5.72 KB)

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

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

    
7
import org.cresques.cts.ICoordTrans;
8

    
9
import org.gvsig.fmap.dal.feature.Feature;
10
import org.gvsig.fmap.dal.feature.FeatureStore;
11
import org.gvsig.fmap.geom.Geometry;
12
import org.gvsig.fmap.geom.Geometry.TYPES;
13
import org.gvsig.fmap.geom.aggregate.MultiPolygon;
14
import org.gvsig.fmap.geom.primitive.Point;
15
import org.gvsig.fmap.geom.primitive.Polygon;
16
import org.gvsig.fmap.geom.primitive.Ring;
17
import org.gvsig.fmap.mapcontext.layers.FLayer;
18
import org.gvsig.fmap.mapcontext.rendering.legend.IVectorLegend;
19
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
20
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.fill.IFillSymbol;
21
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.line.ILineSymbol;
22
import org.gvsig.view3d.vector.lib.api.VectorElevationMode;
23
import org.gvsig.view3d.vector.lib.api.VectorLoaderParameters;
24
import org.gvsig.view3d.vector.lib.impl.AbstractRenderableLayer;
25

    
26
import gov.nasa.worldwind.geom.Position;
27
import gov.nasa.worldwind.render.BasicShapeAttributes;
28
import gov.nasa.worldwind.render.Material;
29
import gov.nasa.worldwind.render.Renderable;
30

    
31
public class DefaultVectorPolygonRenderableLayer extends AbstractRenderableLayer {
32

    
33
    private BasicShapeAttributes normalShapeAttributes;
34

    
35
    public DefaultVectorPolygonRenderableLayer(VectorLoaderParameters parameters, FeatureStore featureStore,
36
        IVectorLegend legend) {
37
        super(parameters, featureStore);
38
        this.normalShapeAttributes = getNormalBasicShapeAttributes(legend);
39
    }
40

    
41
    @Override
42
    protected List<Renderable> getRenderables(Feature feature) {
43
        Geometry geom = feature.getDefaultGeometry();
44
        List<Renderable> renderables = new ArrayList<>();
45
        if (geom.getGeometryType().isTypeOf(TYPES.MULTIPOLYGON)) {
46
            MultiPolygon multiPolygon = (MultiPolygon) geom;
47
            for (int i = 0; i < multiPolygon.getPrimitivesNumber(); i++) {
48
                Polygon polygon = (Polygon) multiPolygon.getSurfaceAt(i);
49
                if (polygon.getNumVertices() >= 4) {
50
                    renderables.add(getRenderable(polygon));
51
                }
52
            }
53
        } else {
54
            Polygon polygon = (Polygon) geom;
55
            if (polygon.getNumVertices() >= 4) {
56
                renderables.add(getRenderable(polygon));
57
            }
58
        }
59
        return renderables;
60
    }
61

    
62
    private gov.nasa.worldwind.render.Polygon getRenderable(Polygon polygon) {
63
        gov.nasa.worldwind.render.Polygon renderable = new gov.nasa.worldwind.render.Polygon();
64
        boolean hasZ = polygon.getDimension() > 2;
65
        double h = 0.0;
66

    
67
        if (VectorElevationMode.CLAMP_TO_GROUND.equals(parameters.getVectorElevationMode())) {
68
            hasZ = false;
69
        } else {
70
            if (VectorElevationMode.RELATIVE_TO_GROUND.equals(parameters.getVectorElevationMode())) {
71
                hasZ = false;
72
            }
73
            if (parameters.getConstantHeight() != null) {
74
                h = parameters.getConstantHeight();
75
            }
76
        }
77
        
78
        ICoordTrans coordTrans = getCoordTrans(this.parameters.getLayer().getProjection());
79
        List<Position> verticesList = getVertices(polygon, h, hasZ, coordTrans);
80
        renderable.setOuterBoundary(verticesList);
81
        
82
        int numInteriorRings = polygon.getNumInteriorRings();
83
        for (int i = 0; i < numInteriorRings; i++) {
84
            renderable.addInnerBoundary(getInteriorRing(polygon.getInteriorRing(i), hasZ, h));
85
        }
86
        renderable.setAltitudeMode(getAltitudeMode(this.parameters.getVectorElevationMode()));
87
        renderable.setAttributes(normalShapeAttributes);
88
        return renderable;
89
    }
90

    
91
    private List<Position> getInteriorRing(Ring interiorRing, boolean hasZ, double h) {
92
        int internalNumVertices = interiorRing.getNumVertices();
93
        List<Position> internalVerticesList = new ArrayList<>(internalNumVertices);
94
        for (int j = 0; j < internalNumVertices; j++) {
95
            Point vertex = interiorRing.getVertex(j);
96
            if (hasZ) {
97
                double z = vertex.getCoordinateAt(2);
98
                internalVerticesList.add(Position.fromDegrees(vertex.getY(), vertex.getX(), z + h));
99
            } else {
100
                internalVerticesList.add(Position.fromDegrees(vertex.getY(), vertex.getX(), h));
101
            }
102
        }
103
        return internalVerticesList;
104
    }
105

    
106
    private BasicShapeAttributes getNormalBasicShapeAttributes(IVectorLegend legend) {
107

    
108
        Material fillMaterial = Material.LIGHT_GRAY;
109
        Material outlineMaterial = Material.BLACK;
110
        double fillOpacity = 0.7;
111
        double outlineWidth = 2;
112

    
113
        ISymbol symbol = legend.getDefaultSymbol();
114
        if (symbol instanceof IFillSymbol) {
115
            IFillSymbol fillSymbol = (IFillSymbol) symbol;
116
            Color fillColor = fillSymbol.getFillColor();
117
            int fillAlpha = fillSymbol.getFillAlpha();
118
            ILineSymbol outline = fillSymbol.getOutline();
119
            Color lineColor = outline.getColor();
120
            fillMaterial = new Material(fillColor);
121
            outlineMaterial = new Material(lineColor);
122
            fillOpacity = fillAlpha / 255.0;
123
            outlineWidth = outline.getLineWidth();
124
        } else {
125
            outlineMaterial = new Material(this.parameters.getDefaultColor());
126
            fillMaterial = new Material(this.parameters.getDefaultColor());
127
            fillOpacity = 0.7;
128
            outlineWidth = 2;
129
        }
130
        BasicShapeAttributes attr = new BasicShapeAttributes();
131
        attr.setInteriorMaterial(fillMaterial);
132
        attr.setInteriorOpacity(fillOpacity);
133
        attr.setOutlineMaterial(outlineMaterial);
134
        attr.setOutlineWidth(outlineWidth);
135
        return attr;
136
    }
137
}