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 / DefaultVectorExtrusionPointRenderableLayer.java @ 772

History | View | Annotate | Download (5.67 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

    
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.FeatureStore;
14
import org.gvsig.fmap.geom.Geometry;
15
import org.gvsig.fmap.geom.Geometry.TYPES;
16
import org.gvsig.fmap.geom.aggregate.MultiPoint;
17
import org.gvsig.fmap.geom.primitive.Point;
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.marker.ISimpleMarkerSymbol;
21
import org.gvsig.view3d.vector.lib.api.VectorElevationMode;
22
import org.gvsig.view3d.vector.lib.api.VectorExtrusionLoaderParameters;
23
import org.gvsig.view3d.vector.lib.impl.AbstractRenderableLayer;
24

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

    
31
public class DefaultVectorExtrusionPointRenderableLayer extends AbstractRenderableLayer {
32
    
33
    private PointPlacemarkAttributes markAttributes;
34

    
35
    public DefaultVectorExtrusionPointRenderableLayer(VectorExtrusionLoaderParameters parameters, FeatureStore featureStore,
36
        IVectorLegend legend) {
37
        super(parameters, featureStore, legend);
38
    }
39

    
40
    @Override
41
    protected List<Renderable> getRenderables(Feature feature) {
42

    
43
        double heightFieldValue = 0;
44
        String heightField = ((VectorExtrusionLoaderParameters) parameters).getHeightField();
45
        if (StringUtils.isNoneBlank(heightField)) {
46
            heightFieldValue = feature.getDouble(heightField);
47
        }
48

    
49
        Geometry geom = feature.getDefaultGeometry();
50
        List<Renderable> renderables = new ArrayList<>();
51
        if (geom.getGeometryType().isTypeOf(TYPES.MULTIPOINT)) {
52
            MultiPoint multiPoint = (MultiPoint) geom;
53
            for (int i = 0; i < multiPoint.getPrimitivesNumber(); i++) {
54
                renderables.add(getRenderable(multiPoint.getPointAt(i), heightFieldValue));
55
            }
56
        } else {
57
            renderables.add(getRenderable((Point) geom, heightFieldValue));
58
        }
59
        return renderables;
60
    }
61

    
62
    private PointPlacemark getRenderable(Point point, double heightFieldValue) {
63
        boolean hasZ = point.getDimension() > 2;
64
        double h = 0.0;
65
        
66
        ICoordTrans coordTrans = getCoordTrans(this.parameters.getLayer().getProjection());
67
        if(coordTrans != null) {
68
            point.reProject(coordTrans);
69
        }
70
        
71
        double y = point.getY();
72
        double x = point.getX();
73
        
74
        if(VectorElevationMode.CLAMP_TO_GROUND.equals(parameters.getVectorElevationMode())) {
75
            hasZ = false;
76
        } else {
77
            if(VectorElevationMode.RELATIVE_TO_GROUND.equals(parameters.getVectorElevationMode())) {
78
                hasZ = false;
79
            }
80
            if (parameters.getConstantHeight() != null) {
81
                h = parameters.getConstantHeight();
82
            }
83
        }
84
        h += heightFieldValue;
85
        h *= ((VectorExtrusionLoaderParameters) parameters).getVerticalExaggeration();
86
        PointPlacemark marker;
87
        if (hasZ) {
88
            double z = point.getCoordinateAt(2);
89
            marker = new PointPlacemark(Position.fromDegrees(y, x, z + h));
90
        } else {
91
            Position position = Position.fromDegrees(y, x, h);
92
            marker = new PointPlacemark(position);
93
        }
94
        marker.setAltitudeMode(getAltitudeMode(parameters.getVectorElevationMode()));
95
        marker.setLineEnabled(true);
96
        marker.setAttributes(this.getBasicMarkerAttributes(legend));
97
        return marker;
98
    }
99

    
100
    @Override
101
    protected FeatureQuery getFeatureQuery() throws DataException {
102
        FeatureQuery featureQuery = super.getFeatureQuery();
103
        // Add field height to feature query
104
        String fieldHeight = ((VectorExtrusionLoaderParameters) parameters).getHeightField();
105
        if (StringUtils.isNotBlank(fieldHeight)) {
106
            featureQuery.addAttributeName(fieldHeight);
107
        }
108
        return featureQuery;
109
    }
110
    
111
    private PointPlacemarkAttributes getBasicMarkerAttributes(IVectorLegend legend) {
112

    
113
        if (this.markAttributes != null) {
114
            return this.markAttributes;
115
        }
116

    
117
        double markerSize = 0;
118
        Material fillMaterial = null;
119

    
120
        if (legend == null) {
121
            fillMaterial = new Material(parameters.getDefaultColor());
122
            markerSize = 0.3;
123
        } else {
124
            ISymbol symbol = legend.getDefaultSymbol();
125
            if (symbol instanceof ISimpleMarkerSymbol) {
126
                ISimpleMarkerSymbol markerSymbol = (ISimpleMarkerSymbol) symbol;
127
                Color fillColor = markerSymbol.getColor();
128
                markerSize = markerSymbol.getSize();
129
                fillMaterial = new Material(fillColor);
130
            } else {
131
                fillMaterial = new Material(parameters.getDefaultColor());
132
                markerSize = 4;
133
            }
134
        }
135
        markAttributes = new PointPlacemarkAttributes();
136
        Color color = fillMaterial.getDiffuse();
137
        markAttributes.setImageColor(color);
138
        markAttributes.setLineMaterial(fillMaterial);
139
        markAttributes.setLineWidth(1d);
140
        markAttributes.setUsePointAsDefaultImage(true);
141
        markAttributes.setScale(markerSize);
142
        return markAttributes;
143
    }
144

    
145
    @Override
146
    protected void clearRenderAttributes() {
147
        this.markAttributes = null;
148
    }
149

    
150
}