Statistics
| Revision:

gvsig-raster / org.gvsig.raster / trunk / org.gvsig.raster / org.gvsig.raster.fmap / src / main / java / org / gvsig / raster / fmap / roi / VectorialROIsWriter.java @ 859

History | View | Annotate | Download (7.26 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
package org.gvsig.raster.fmap.roi;
23

    
24
import java.io.File;
25
import java.util.ArrayList;
26
import java.util.Iterator;
27

    
28
import org.cresques.cts.IProjection;
29
import org.gvsig.fmap.dal.DALLocator;
30
import org.gvsig.fmap.dal.DataManager;
31
import org.gvsig.fmap.dal.exception.DataException;
32
import org.gvsig.fmap.dal.feature.EditableFeature;
33
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
34
import org.gvsig.fmap.dal.feature.EditableFeatureType;
35
import org.gvsig.fmap.dal.feature.FeatureStore;
36
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
37
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
38
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
39
import org.gvsig.fmap.geom.Geometry;
40
import org.gvsig.tools.dataTypes.DataTypes;
41

    
42
/**
43
 * Clase dedicada a la escritura de ROIs en formato en disco (formato shape).
44
 *
45
 * Si las ROIs a escribir incluyen distintos tipos de geometr?as la escritura se
46
 * realizar? en distintos shape files, uno para poligonos, otro para polil?neas y
47
 * otro para puntos.
48
 *
49
 * @author Diego Guerrero (diego.guerrero@uclm.es)
50
 *
51
 */
52
public class VectorialROIsWriter {
53
        private String                         baseFilename                 = null;
54
        private IProjection         projection                         = null;
55
        private int                         iPolygon;
56
        private int                         iPoint;
57
        private int                         iPolyline;
58
        private FeatureStore         surfaceFS                        = null;
59
        private FeatureStore         pointFS                                = null;
60
        private FeatureStore         curveFS                                = null;
61

    
62

    
63
        /**
64
         * Constructor.
65
         *
66
         * @param baseFilename ruta base para formar los nombres de fichero (ruta/prefijo)
67
         * @param projection CRS de las geometr?as.
68
         */
69
        public VectorialROIsWriter(String baseFilename, IProjection projection) {
70
                this.baseFilename = baseFilename;
71
                this.projection = projection;
72
        }
73

    
74
        /**
75
         * Escribe el Array de ROIs pasado como par?metro.
76
         *
77
         * @param rois Array de VectorialROI
78
         */
79
        public void write (VectorialROI rois[]){
80
                boolean monoType = true;
81
                int geometryType = -1;
82
                ArrayList geometries = null;
83

    
84
                Object values[] = new Object[4];
85

    
86
                if (baseFilename.endsWith(".shp"))
87
                        baseFilename = baseFilename.replaceAll(".shp", "");
88

    
89
                for (int i = 0; i < rois.length; i++) {
90
                        geometries = rois[i].getGeometries();
91
                        for (Iterator iterator = geometries.iterator(); iterator.hasNext();) {
92
                                if (geometryType < 0)
93
                                        geometryType = ((Geometry) iterator.next()).getType();
94
                                else
95
                                        if (geometryType != ((Geometry) iterator.next()).getType()){
96
                                                monoType = false;
97
                                                break;
98
                                        }
99
                        }
100
                }
101

    
102
                if (monoType){
103
                        create(baseFilename+".shp", projection, geometryType);
104
                } else{
105
                        create(baseFilename+"_polygons"+".shp", projection, Geometry.TYPES.SURFACE);
106
                        create(baseFilename+"_points"+".shp", projection, Geometry.TYPES.POINT);
107
                        create(baseFilename+"_polylines"+".shp", projection, Geometry.TYPES.CURVE);
108
                }
109

    
110
                for (int i = 0; i < rois.length; i++) {
111
                        geometries = rois[i].getGeometries();
112
                        values[0] = rois[i].getName();
113
                        values[1] = new Integer(rois[i].getColor().getRed());
114
                        values[2] = new Integer(rois[i].getColor().getGreen());
115
                        values[3] = new Integer(rois[i].getColor().getBlue());
116

    
117

    
118
                        for (Iterator iterator = geometries.iterator(); iterator.hasNext();) {
119
                                Geometry geometry = (Geometry) iterator.next();
120
                                addFeature(geometry, values);
121
                        }
122
                }
123
                try {
124
                        if (surfaceFS != null)
125
                                surfaceFS.finishEditing();
126
                        if (pointFS != null)
127
                                pointFS.finishEditing();
128
                        if (curveFS != null)
129
                                curveFS.finishEditing();
130
                } catch (DataException e) {
131
                        e.printStackTrace();
132
                }
133

    
134
        }
135

    
136
        private void addFeature(Geometry geom, Object[] values) {
137
                try {
138
                        switch (geom.getType()) {
139
                        case Geometry.TYPES.SURFACE:
140
                                if (surfaceFS != null){
141
                                        EditableFeature ef=surfaceFS.createNewFeature();
142
                                        ef.set("name", values[0]);
143
                                        ef.set("R", values[1]);
144
                                        ef.set("G", values[2]);
145
                                        ef.set("B", values[3]);
146
                                        ef.set("GEOMETRY", geom);
147
                                        surfaceFS.insert(ef);
148
                                        iPolygon++;
149
                                }
150
                                break;
151

    
152
                        case Geometry.TYPES.POINT:
153
                                if (pointFS != null){
154
                                        EditableFeature ef=pointFS.createNewFeature();
155
                                        ef.set("name", values[0]);
156
                                        ef.set("R", values[1]);
157
                                        ef.set("G", values[2]);
158
                                        ef.set("B", values[3]);
159
                                        ef.set("GEOMETRY", geom);
160
                                        pointFS.insert(ef);
161
                                        iPoint++;
162
                                }
163
                                break;
164

    
165
                        case Geometry.TYPES.CURVE:
166
                                if (curveFS != null){
167
                                        EditableFeature ef=curveFS.createNewFeature();
168
                                        ef.set("name", values[0]);
169
                                        ef.set("R", values[1]);
170
                                        ef.set("G", values[2]);
171
                                        ef.set("B", values[3]);
172
                                        ef.set("GEOMETRY", geom);
173
                                        curveFS.insert(ef);
174
                                        iPolyline++;
175
                                }
176
                                break;
177

    
178
                        default:
179
                                return;
180
                        }
181
                } catch (Exception e) {
182
                        e.printStackTrace();
183
                }
184

    
185
        }
186

    
187
        private void create(String filename, IProjection crs, int geometryType) {
188
                File newFile=new File(filename);
189
                try {
190
                        DataManager datamanager = DALLocator.getDataManager();
191
                        FilesystemServerExplorerParameters explorerParams;
192

    
193
                        explorerParams = (FilesystemServerExplorerParameters) datamanager.createServerExplorerParameters(FilesystemServerExplorer.NAME);
194

    
195
                        explorerParams.setRoot(newFile.getParent());
196
                        FilesystemServerExplorer explorer=(FilesystemServerExplorer) datamanager.createServerExplorer(explorerParams);
197
                        NewFeatureStoreParameters newParams = (NewFeatureStoreParameters) explorer.getAddParameters(newFile);
198
                        
199
                        EditableFeatureType featureType = getFeatureType(newParams);
200
                        EditableFeatureAttributeDescriptor efad=featureType.add("GEOMETRY", org.gvsig.fmap.geom.DataTypes.GEOMETRY);
201
                        efad.setGeometryType(geometryType);
202
                        featureType.setDefaultGeometryAttributeName("GEOMETRY");
203

    
204
                        explorer.add(newParams.getDataStoreName(), newParams, true);
205

    
206
                        switch (geometryType) {
207
                        case Geometry.TYPES.SURFACE:
208
                                surfaceFS=(FeatureStore) datamanager.createStore(newParams);
209
                                surfaceFS.edit(FeatureStore.MODE_APPEND);
210
                                break;
211

    
212
                        case Geometry.TYPES.POINT:
213
                                pointFS=(FeatureStore) datamanager.createStore(newParams);
214
                                pointFS.edit(FeatureStore.MODE_APPEND);
215
                                break;
216

    
217
                        case Geometry.TYPES.CURVE:
218
                                curveFS=(FeatureStore) datamanager.createStore(newParams);
219
                                curveFS.edit(FeatureStore.MODE_APPEND);
220
                                break;
221

    
222
                        default:
223
                                return;
224
                        }
225
                } catch (Exception e) {
226
                        e.printStackTrace();
227
                }
228

    
229
        }
230

    
231
        private EditableFeatureType getFeatureType(NewFeatureStoreParameters newParams) {
232
                EditableFeatureType eft = (EditableFeatureType)newParams.getDefaultFeatureType();
233

    
234
                eft.add("name", DataTypes.STRING, 20);
235

    
236
                eft.add("R", DataTypes.INT);
237

    
238
                eft.add("G", DataTypes.INT);
239

    
240
                eft.add("B", DataTypes.INT);
241

    
242
                return eft;
243
        }
244
}