Statistics
| Revision:

root / org.gvsig.geotools.proj / trunk / org.gvsig.geotools.proj / org.gvsig.geotools.proj.lib.impl / src / main / java / org / gvsig / geotools / proj / lib / GtCRSManager.java @ 828

History | View | Annotate | Download (5.59 KB)

1
package org.gvsig.geotools.proj.lib;
2

    
3
import java.text.ParseException;
4

    
5
import org.geotools.referencing.CRS;
6
import org.geotools.referencing.wkt.Parser;
7
import org.gvsig.geotools.proj.catalog.DefaultCRSDefinition;
8
import org.gvsig.geotools.proj.catalog.DefaultTransformationDefinition;
9
import org.gvsig.proj.CoordinateReferenceSystem;
10
import org.gvsig.proj.CoordinateReferenceSystemLocator;
11
import org.gvsig.proj.CoordinateReferenceSystemManager;
12
import org.gvsig.proj.CoordinateTransformation;
13
import org.gvsig.proj.catalog.CRSCatalogLocator;
14
import org.gvsig.proj.catalog.CRSCatalogManager;
15
import org.gvsig.proj.catalog.CRSDefinition;
16
import org.gvsig.proj.catalog.TextSerialization.Format;
17
import org.gvsig.proj.catalog.TransformationDefinition;
18
import org.gvsig.proj.catalog.exception.UnsupportedTransformationException;
19
import org.opengis.referencing.FactoryException;
20
import org.opengis.referencing.operation.CoordinateOperation;
21
import org.gvsig.proj.catalog.exception.UnsupportedCoordinateReferenceSystemException;
22
import org.gvsig.proj.catalog.exception.UnsupportedFormatException;
23

    
24
public class GtCRSManager implements CoordinateReferenceSystemManager {
25
        private CRSCatalogManager catalogManager = null; 
26

    
27
        public GtCRSManager() {
28
        }
29

    
30
        @Override
31
        public CoordinateReferenceSystem getCoordinateReferenceSystem(CRSDefinition definition)
32
                        throws UnsupportedCoordinateReferenceSystemException,
33
                                ParseException {
34
                if (definition instanceof DefaultCRSDefinition) {
35
                        return new DefaultCRS((DefaultCRSDefinition)definition);
36
                }
37
                else {
38
                        // FIXME: definition.toString? definition.toWKT? definition.export?
39
                        return getCoordinateReferenceSystem(definition, definition.toWKT());
40
                }
41
        }
42
        
43
        /**
44
         * Used for CRSDefinition that are not instanceof DefaultCRSDefinition
45
         * 
46
         * @param definition
47
         * @param wktDefinition
48
         * @return
49
         * @throws UnsupportedCoordinateReferenceSystemException 
50
         */
51
        protected CoordinateReferenceSystem getCoordinateReferenceSystem(CRSDefinition definition, String wktDefinition) throws UnsupportedCoordinateReferenceSystemException {
52
                
53
                try {
54
                        org.opengis.referencing.crs.CoordinateReferenceSystem crs = CRS.parseWKT(wktDefinition);
55
                        return new DefaultCRS(crs, definition);
56
                } catch (FactoryException e) {
57
                        throw new UnsupportedCoordinateReferenceSystemException(e);
58
                } 
59
        }
60

    
61
        @Override
62
        public CoordinateReferenceSystem parseCoordinateReferenceSystem(String def)
63
                        throws UnsupportedCoordinateReferenceSystemException, ParseException {
64
                CRSDefinition definition = getCatalogManager().parseCRSDefinition(def);
65
                if (definition instanceof DefaultCRSDefinition) {
66
                        return new DefaultCRS((DefaultCRSDefinition)definition);
67
                }
68
                return getCoordinateReferenceSystem(definition, def);
69
        }
70
        
71
        @Override
72
        public CoordinateReferenceSystem parseCoordinateReferenceSystem(String def, Format format)
73
                        throws UnsupportedCoordinateReferenceSystemException,
74
                                        ParseException, UnsupportedFormatException {
75
                if (format==Format.WKT1) {
76
                        parseCoordinateReferenceSystem(def);
77
                }
78
                throw new UnsupportedFormatException(format);
79
        }
80

    
81
        @Override
82
        public CoordinateTransformation parseCoordinateTransformation(String wkt)
83
                        throws UnsupportedTransformationException, ParseException {
84
                TransformationDefinition definition = getCatalogManager().parseTransformationDefinition(wkt);
85
                if (definition instanceof DefaultTransformationDefinition) {
86
                        // FIXME: We should some way decide whether the direct or inverse transformation has to be used.
87
                        // It is a bit tricky since we don't provide different abstractions for CoordinateOperation and MathTransform
88
                        return new DefaultTransformation((DefaultTransformationDefinition)definition);
89
                }
90
                return getCoordinateTransformation(definition, wkt);
91
        }
92
        
93

    
94
        @Override
95
        public CoordinateTransformation parseCoordinateTransformation(String def, Format format)
96
                        throws UnsupportedTransformationException,
97
                        ParseException, UnsupportedFormatException {
98
                if (format==Format.WKT1) {
99
                        return parseCoordinateTransformation(def);
100
                }
101
                throw new UnsupportedFormatException(format);
102
        }
103
        
104
        /**
105
         * Used for TransformationDefinition that are not instanceof DefaultTransformationDefinition
106
         * 
107
         * @param definition
108
         * @param wktDefinition
109
         * @return
110
         * @throws UnsupportedTransformationException 
111
         */
112
        protected CoordinateTransformation getCoordinateTransformation(TransformationDefinition definition, String wktDef)
113
                        throws UnsupportedTransformationException, ParseException {
114
                // FIXME: We should some way decide whether the direct or inverse transformation has to be used.
115
                // It is a bit tricky since we don't provide different abstractions for CoordinateOperation and MathTransform
116
                Parser parser = new Parser();
117
                Object obj = parser.parseObject(wktDef);
118
                return new DefaultTransformation((CoordinateOperation) obj, definition);
119
        }
120

    
121
        @Override
122
        public CoordinateTransformation getCoordinateTransformation(TransformationDefinition definition)
123
                        throws UnsupportedTransformationException, ParseException {
124
                if (definition instanceof DefaultTransformationDefinition) {
125
                        // FIXME: We should some way decide whether the direct or inverse transformation has to be used.
126
                        // It is a bit tricky since we don't provide different abstractions for CoordinateOperation and MathTransform
127
                        return new DefaultTransformation((DefaultTransformationDefinition)definition);
128
                }
129
                return getCoordinateTransformation(definition, definition.toWKT());
130
        }
131

    
132
        @Override
133
        public void setCatalogManager(CRSCatalogManager manager) {
134
                this.catalogManager = manager;
135
        }
136
        
137
        public CRSCatalogManager getCatalogManager() {
138
                if( this.catalogManager == null ) {
139
                        this.catalogManager = CRSCatalogLocator.getManager();
140
                }
141
                return this.catalogManager;
142
        }
143
}