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

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

    
9
import org.gvsig.fmap.dal.exception.DataException;
10
import org.gvsig.fmap.dal.feature.Feature;
11
import org.gvsig.fmap.dal.feature.FeatureQuery;
12
import org.gvsig.fmap.dal.feature.FeatureStore;
13
import org.gvsig.fmap.dal.feature.FeatureType;
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);
38
        this.markAttributes = getBasicMarkerAttributes(legend);
39
    }
40

    
41
    @Override
42
    protected List<Renderable> getRenderable(Feature feature) {
43

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

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

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

    
95
    @Override
96
    protected FeatureQuery getFeatureQuery() throws DataException {
97
        FeatureType featureType = featureStore.getDefaultFeatureType();
98
        String geomAtt = featureType.getDefaultGeometryAttributeName();
99
        FeatureQuery featureQuery = featureStore.createFeatureQuery();
100
        featureQuery.addAttributeName(geomAtt);
101
        // Add field height to feature query
102
        String fieldHeight = ((VectorExtrusionLoaderParameters) parameters).getHeightField();
103
        if (StringUtils.isNotBlank(fieldHeight)) {
104
            featureQuery.addAttributeName(fieldHeight);
105
        }
106
        return featureQuery;
107
    }
108
    
109
    private PointPlacemarkAttributes getBasicMarkerAttributes(IVectorLegend legend) {
110

    
111
        if (this.markAttributes != null) {
112
            return this.markAttributes;
113
        }
114

    
115
        double markerSize = 0;
116
        Material fillMaterial = null;
117

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

    
143
}