Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.expressionevaluator / org.gvsig.expressionevaluator.geometry / org.gvsig.expressionevaluator.geometry.lib / org.gvsig.expressionevaluator.geometry.lib.impl / src / main / java / org / gvsig / expressionevaluator / impl / function / spatial / STTransformFunction.java @ 44843

History | View | Annotate | Download (2.05 KB)

1
package org.gvsig.expressionevaluator.impl.function.spatial;
2

    
3
import org.apache.commons.lang3.Range;
4
import org.cresques.cts.ICoordTrans;
5
import org.cresques.cts.IProjection;
6
import org.gvsig.expressionevaluator.DataTypes;
7
import org.gvsig.expressionevaluator.ExpressionRuntimeException;
8
import org.gvsig.expressionevaluator.Interpreter;
9
import org.gvsig.expressionevaluator.spi.AbstractGeometryFunction;
10
import org.gvsig.fmap.crs.CRSFactory;
11
import org.gvsig.fmap.geom.Geometry;
12
import org.gvsig.tools.dataTypes.DataTypeUtils;
13

    
14
public class STTransformFunction extends AbstractGeometryFunction {
15

    
16
    public STTransformFunction() {
17
        super("OGC", "ST_Transform", Range.between(2,3));
18
    }
19
    
20
    @Override
21
    public boolean allowConstantFolding() {
22
        return true;
23
    }
24
    
25
    @Override
26
    public Object call(Interpreter interpreter, Object[] args) throws Exception {
27
        IProjection  to_proj = null;
28
        IProjection from_proj = null;
29
        Integer to_srid = null;
30
        Geometry geom = getGeom(args, 0);
31
        switch(args.length) {
32
          case 2:
33
            to_srid = (Integer) DataTypeUtils.coerce(DataTypes.INT, getObject(args, 1),null);
34
            if( to_srid==null ) {
35
              to_proj = CRSFactory.getCRS(getStr(args, 1));
36
            } else {
37
              to_proj = CRSFactory.getCRS("EPSG:"+to_srid);
38
            }
39
            from_proj = geom.getProjection();
40
            break;
41
            
42
          case 3:
43
            to_srid = (Integer) DataTypeUtils.coerce(DataTypes.INT, getObject(args, 2),null);
44
            if( to_srid==null ) {
45
              to_proj = CRSFactory.getCRS(getStr(args, 2));
46
            } else {
47
              to_proj = CRSFactory.getCRS("EPSG:"+to_srid);
48
            }
49
            from_proj = CRSFactory.getCRS(getStr(args, 1));
50
            break;
51
            
52
          default:
53
            throw new ExpressionRuntimeException("Incorrect number of arguments.");
54
        }
55
        ICoordTrans ct = from_proj.getCT(to_proj);
56
        Geometry r = geom.cloneGeometry();
57
        r.reProject(ct);
58
        return r;
59
    }
60
    
61
}