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

History | View | Annotate | Download (3.99 KB)

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

    
3
import java.util.ArrayList;
4
import java.util.List;
5

    
6
import org.apache.commons.lang3.StringUtils;
7

    
8
import org.gvsig.fmap.dal.exception.DataException;
9
import org.gvsig.fmap.dal.feature.Feature;
10
import org.gvsig.fmap.dal.feature.FeatureQuery;
11
import org.gvsig.fmap.dal.feature.FeatureStore;
12
import org.gvsig.fmap.dal.feature.FeatureType;
13
import org.gvsig.fmap.geom.Geometry;
14
import org.gvsig.fmap.geom.Geometry.TYPES;
15
import org.gvsig.fmap.geom.aggregate.MultiPoint;
16
import org.gvsig.fmap.geom.primitive.Point;
17
import org.gvsig.fmap.mapcontext.rendering.legend.IVectorLegend;
18
import org.gvsig.view3d.vector.lib.api.VectorElevationMode;
19
import org.gvsig.view3d.vector.lib.api.VectorExtrusionLoaderParameters;
20
import org.gvsig.view3d.vector.lib.impl.AbstractPointRenderableLayer;
21

    
22
import gov.nasa.worldwind.geom.Position;
23
import gov.nasa.worldwind.render.PointPlacemark;
24
import gov.nasa.worldwind.render.Renderable;
25

    
26
public class DefaultVectorExtrusionPointRenderableLayer extends AbstractPointRenderableLayer {
27

    
28
    public DefaultVectorExtrusionPointRenderableLayer(VectorExtrusionLoaderParameters parameters, FeatureStore featureStore,
29
        IVectorLegend legend) {
30
        super(parameters, featureStore, legend);
31
    }
32

    
33
    @Override
34
    protected List<Renderable> getRenderable(Feature feature) {
35

    
36
        double heightFieldValue = 0;
37
        String heightField = ((VectorExtrusionLoaderParameters) parameters).getHeightField();
38
        if (StringUtils.isNoneBlank(heightField)) {
39
            heightFieldValue = feature.getDouble(heightField);
40
        }
41

    
42
        Geometry geom = feature.getDefaultGeometry();
43
        List<Renderable> renderables = new ArrayList<>();
44
        if (geom.getGeometryType().isTypeOf(TYPES.MULTIPOINT)) {
45
            MultiPoint multiPoint = (MultiPoint) geom;
46
            for (int i = 0; i < multiPoint.getPrimitivesNumber(); i++) {
47
                renderables.add(getRenderable(multiPoint.getPointAt(i), heightFieldValue));
48
            }
49
        } else {
50
            renderables.add(getRenderable((Point) geom, heightFieldValue));
51
        }
52
        return renderables;
53
    }
54

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

    
87
    @Override
88
    protected FeatureQuery getFeatureQuery() throws DataException {
89
        FeatureType featureType = featureStore.getDefaultFeatureType();
90
        String geomAtt = featureType.getDefaultGeometryAttributeName();
91
        FeatureQuery featureQuery = featureStore.createFeatureQuery();
92
        featureQuery.addAttributeName(geomAtt);
93
        // Add field height to feature query
94
        String fieldHeight = ((VectorExtrusionLoaderParameters) parameters).getHeightField();
95
        if (StringUtils.isNotBlank(fieldHeight)) {
96
            featureQuery.addAttributeName(fieldHeight);
97
        }
98
        return featureQuery;
99
    }
100

    
101
}