Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libFMap_mapcontext / src / org / gvsig / fmap / mapcontext / layers / vectorial / ReprojectDefaultGeometry.java @ 32880

History | View | Annotate | Download (8.55 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
*
3
* Copyright (C) 2007-2008 Infrastructures and Transports Department
4
* of the Valencian Government (CIT)
5
*
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version 2
9
* of the License, or (at your option) any later version.
10
*
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
* GNU General Public License for more details.
15
*
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
* MA  02110-1301, USA.
20
*
21
*/
22

    
23
/*
24
* AUTHORS (In addition to CIT):
25
* 2009 IVER T.I   {{Task}}
26
*/
27

    
28
/**
29
 *
30
 */
31
package org.gvsig.fmap.mapcontext.layers.vectorial;
32

    
33
import java.util.ArrayList;
34
import java.util.Iterator;
35
import java.util.List;
36

    
37
import org.cresques.cts.ICoordTrans;
38
import org.cresques.cts.IProjection;
39
import org.gvsig.fmap.crs.CRSFactory;
40
import org.gvsig.fmap.dal.exception.DataException;
41
import org.gvsig.fmap.dal.feature.AbstractFeatureStoreTransform;
42
import org.gvsig.fmap.dal.feature.EditableFeature;
43
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
44
import org.gvsig.fmap.dal.feature.EditableFeatureType;
45
import org.gvsig.fmap.dal.feature.Feature;
46
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
47
import org.gvsig.fmap.dal.feature.FeatureStore;
48
import org.gvsig.fmap.dal.feature.FeatureType;
49
import org.gvsig.fmap.geom.Geometry;
50
import org.gvsig.tools.ToolsLocator;
51
import org.gvsig.tools.dynobject.DynStruct;
52
import org.gvsig.tools.persistence.PersistenceManager;
53
import org.gvsig.tools.persistence.PersistentState;
54
import org.gvsig.tools.persistence.exception.PersistenceException;
55

    
56
/**
57
 * @author jmvivo
58
 *
59
 */
60
public class ReprojectDefaultGeometry extends AbstractFeatureStoreTransform {
61

    
62
        private IProjection targetSRS;
63
        private ICoordTrans ct;
64
        private IProjection sourceSRS;
65
        private FeatureType orgDefFeatureType;
66
        private List orgFeatureTypes;
67

    
68
        public ReprojectDefaultGeometry() {
69
                
70
        }
71
        
72
        public IProjection getTargetSRS() {
73
                return targetSRS;
74
        }
75

    
76
        public void setTargetSRS(IProjection targetSRS) {
77
                this.targetSRS = targetSRS;
78
        }
79

    
80
        /* (non-Javadoc)
81
         * @see org.gvsig.fmap.dal.feature.FeatureStoreTransform#applyTransform(org.gvsig.fmap.dal.feature.Feature, org.gvsig.fmap.dal.feature.EditableFeature)
82
         */
83
        public void applyTransform(Feature source, EditableFeature target)
84
                        throws DataException {
85
                FeatureAttributeDescriptor attr;
86
                Iterator iter = target.getType().iterator();
87
                int defGeomIndex = target.getType().getDefaultGeometryAttributeIndex();
88
                while (iter.hasNext()) {
89
                        attr = (FeatureAttributeDescriptor)iter.next();
90
                        if (attr.getIndex() == defGeomIndex) {
91
                                Geometry geom =source.getDefaultGeometry();
92
                                geom.reProject(ct);
93
                                target.setDefaultGeometry(geom);
94
                        } else {
95
                                target.set(attr.getIndex(), source.get(attr.getName()));
96
                        }
97

    
98
                }
99

    
100
        }
101

    
102
        public void setFeatureStore(FeatureStore store) {
103
                try {
104
                        orgDefFeatureType = store.getDefaultFeatureType();
105
                        orgFeatureTypes = store.getFeatureTypes();
106
                        EditableFeatureType defFType = orgDefFeatureType
107
                                        .getEditable();
108
                        EditableFeatureAttributeDescriptor attr = (EditableFeatureAttributeDescriptor) defFType
109
                                        .getAttributeDescriptor(defFType
110
                                                        .getDefaultGeometryAttributeName());
111
                        sourceSRS = attr.getSRS();
112
                        ct = sourceSRS.getCT(targetSRS);
113
                        attr.setSRS(this.targetSRS);
114
                        FeatureType defaultType = defFType.getNotEditableCopy();
115
                        List types = new ArrayList();
116
                        Iterator iter = orgFeatureTypes.iterator();
117
                        FeatureType tmp;
118
                        while (iter.hasNext()) {
119
                                tmp = (FeatureType) iter.next();
120
                                if (tmp.getId().equals(defaultType.getId())) {
121
                                        types.add(defaultType);
122
                                } else {
123
                                        types.add(tmp);
124
                                }
125
                        }
126

    
127
                        this.setFeatureTypes(types, defaultType);
128
                } catch (DataException e) {
129
                        // FIXME
130
                        throw new RuntimeException(e);
131
                }
132

    
133
                super.setFeatureStore(store);
134
        }
135

    
136
        /* (non-Javadoc)
137
         * @see org.gvsig.fmap.dal.feature.FeatureStoreTransform#getSourceFeatureTypeFrom(org.gvsig.fmap.dal.feature.FeatureType)
138
         */
139
        public FeatureType getSourceFeatureTypeFrom(FeatureType targetFeatureType) {
140
                EditableFeatureType result = null;
141
                FeatureType tmp;
142
                EditableFeatureAttributeDescriptor attr;
143
                Iterator iter = orgFeatureTypes.iterator();
144
                Iterator iterAttr;
145
                while (iter.hasNext()) {
146
                        tmp = (FeatureType) iter.next();
147
                        if (tmp.getId().equals(targetFeatureType.getId())) {
148
                                result = tmp.getEditable();
149
                                iterAttr = result.iterator();
150
                                while (iterAttr.hasNext()) {
151
                                        attr = (EditableFeatureAttributeDescriptor) iterAttr.next();
152
                                        if (targetFeatureType.getIndex(attr.getName()) < 0) {
153
                                                iterAttr.remove();
154
                                        }
155
                                }
156
                                break;
157
                        }
158
                }
159
                return result.getNotEditableCopy();
160
        }
161

    
162
        /* (non-Javadoc)
163
         * @see org.gvsig.fmap.dal.feature.FeatureStoreTransform#isTransformsOriginalValues()
164
         */
165
        public boolean isTransformsOriginalValues() {
166
                return true;
167
        }
168

    
169
        /* (non-Javadoc)
170
         * @see org.gvsig.tools.persistence.Persistent#loadState(org.gvsig.tools.persistence.PersistentState)
171
         */
172
        public void saveToState(PersistentState state) throws PersistenceException {
173
                
174
            state.set("mainStore", getFeatureStore());
175
            Iterator iter = null;
176
            try {
177
                        state.set("defaultFeatureTypeId", getDefaultFeatureType().getId());
178
                    iter = getFeatureTypesIds(getFeatureTypes());
179
                } catch (DataException e) {
180
                        // TODO Auto-generated catch block
181
                        e.printStackTrace();
182
                }
183
            
184
            
185
            state.set("featureTypesIds", iter);
186

    
187
            iter = getFeatureTypesIds(orgFeatureTypes);
188
            state.set("orgFeatureTypesIds", iter);
189
            state.set("orgDefFeatureTypeId", orgDefFeatureType.getId());
190
            
191
            state.set("sourceSRS", sourceSRS.getFullCode());
192
            state.set("targetSRS", targetSRS.getFullCode());
193
        }
194

    
195
        /* (non-Javadoc)
196
         * @see org.gvsig.tools.persistence.Persistent#loadFromState(org.gvsig.tools.persistence.PersistentState)
197
         */
198
        public void loadFromState(PersistentState state) throws PersistenceException {
199

    
200
            setFeatureStore((FeatureStore) state.get("mainStore"));
201
            String aux = (String) state.get("defaultFeatureTypeId");
202
            FeatureType auxft = null;
203
            
204
            try {
205
                    auxft = getFeatureStore().getFeatureType(aux);
206
                } catch (DataException e) {
207
                        throw new PersistenceException(e);
208
                }
209
                
210
                Iterator ftids = state.getIterator("featureTypesIds");
211
                
212
            List auxFeatureTypes = new ArrayList();
213
            FeatureType item = null;
214
            while (ftids.hasNext()) {
215
                    try {
216
                                item = getFeatureStore().getFeatureType((String) ftids.next());
217
                        } catch (DataException e) {
218
                                throw new PersistenceException(e);
219
                        }
220
                        auxFeatureTypes.add(item);
221
            }
222
            this.setFeatureTypes(auxFeatureTypes, auxft);
223
                
224
                ftids = state.getIterator("orgFeatureTypesIds");
225
                orgFeatureTypes = new ArrayList();
226
            item = null;
227
            while (ftids.hasNext()) {
228
                    try {
229
                                item = getFeatureStore().getFeatureType((String) ftids.next());
230
                        } catch (DataException e) {
231
                                throw new PersistenceException(e);
232
                        }
233
                        orgFeatureTypes.add(item);
234
            }
235
                
236
            aux = state.getString("orgDefFeatureTypeId");
237
            try {
238
                        orgDefFeatureType = getFeatureStore().getFeatureType(aux);
239
                } catch (DataException e) {
240
                        throw new PersistenceException(e);
241
                }
242

    
243
                String srsaux = state.getString("sourceSRS");
244
                sourceSRS = CRSFactory.getCRS(srsaux);
245
                srsaux = state.getString("targetSRS");
246
                targetSRS = CRSFactory.getCRS(srsaux);
247
                ct = sourceSRS.getCT(targetSRS);
248
        }
249

    
250
        public static void registerPersistent() {
251
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
252
                DynStruct definition = manager.addDefinition(
253
                                ReprojectDefaultGeometry.class,
254
                                "ReprojectDefaultGeometry",
255
                                "ReprojectDefaultGeometry Persistence definition",
256
                                null, 
257
                                null
258
                );
259
                definition.addDynFieldObject("mainStore").setMandatory(true);
260
                definition.addDynFieldString("defaultFeatureTypeId").setMandatory(true);
261
                definition.addDynFieldList("featureTypesIds").setMandatory(true);
262
                definition.addDynFieldString("orgDefFeatureTypeId").setMandatory(true);
263
                definition.addDynFieldList("name").setMandatory(true);
264
                definition.addDynFieldString("targetSRS").setMandatory(true);
265
                definition.addDynFieldString("sourceSRS").setMandatory(true);
266
        }
267
        
268
        
269
    private Iterator getFeatureTypesIds(List ftl) {
270
            
271
            ArrayList resp = new ArrayList();
272
            int sz = ftl.size();
273
            for (int i=0; i<sz; i++) {
274
                    resp.add( ((FeatureType) ftl.get(i)).getId() );
275
            }
276
                return resp.iterator();
277
        }
278

    
279
}