Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extGPE-gvSIG / src / org / gvsig / fmap / drivers / gpe / reader / GPEVectorialDriver.java @ 27067

History | View | Annotate | Download (11.3 KB)

1
package org.gvsig.fmap.drivers.gpe.reader;
2

    
3
import java.awt.Component;
4
import java.awt.geom.Rectangle2D;
5
import java.io.File;
6
import java.sql.Types;
7
import java.util.HashMap;
8
import java.util.Iterator;
9

    
10
import javax.swing.JOptionPane;
11

    
12
import org.cresques.cts.ICoordTrans;
13
import org.cresques.cts.IProjection;
14
import org.gvsig.fmap.drivers.gpe.handlers.DefaultFmapContentHandler;
15
import org.gvsig.fmap.drivers.gpe.handlers.FmapErrorHandler;
16
import org.gvsig.fmap.drivers.gpe.handlers.FmapHandlerFactory;
17
import org.gvsig.fmap.drivers.gpe.model.GPEElement;
18
import org.gvsig.fmap.drivers.gpe.model.GPEFeature;
19
import org.gvsig.fmap.drivers.gpe.model.GPEGeometry;
20
import org.gvsig.gpe.GPERegister;
21
import org.gvsig.gpe.parser.GPEParser;
22

    
23
import com.hardcode.gdbms.engine.data.DataSourceFactory;
24
import com.hardcode.gdbms.engine.data.driver.ObjectDriver;
25
import com.hardcode.gdbms.engine.data.edition.DataWare;
26
import com.hardcode.gdbms.engine.values.Value;
27
import com.hardcode.gdbms.engine.values.ValueFactory;
28
import com.iver.andami.PluginServices;
29
import com.iver.cit.gvsig.fmap.core.FShape;
30
import com.iver.cit.gvsig.fmap.core.IGeometry;
31
import com.iver.cit.gvsig.fmap.core.ShapeFactory;
32
import com.iver.cit.gvsig.fmap.crs.CRSFactory;
33
import com.iver.cit.gvsig.fmap.drivers.BoundedShapes;
34
import com.iver.cit.gvsig.fmap.drivers.DriverAttributes;
35
import com.iver.cit.gvsig.fmap.drivers.VectorialDriver;
36

    
37
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
38
 *
39
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
40
 *
41
 * This program is free software; you can redistribute it and/or
42
 * modify it under the terms of the GNU General Public License
43
 * as published by the Free Software Foundation; either version 2
44
 * of the License, or (at your option) any later version.
45
 *
46
 * This program is distributed in the hope that it will be useful,
47
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
48
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
49
 * GNU General Public License for more details.
50
 *
51
 * You should have received a copy of the GNU General Public License
52
 * along with this program; if not, write to the Free Software
53
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
54
 *
55
 * For more information, contact:
56
 *
57
 *  Generalitat Valenciana
58
 *   Conselleria d'Infraestructures i Transport
59
 *   Av. Blasco Ib??ez, 50
60
 *   46010 VALENCIA
61
 *   SPAIN
62
 *
63
 *      +34 963862235
64
 *   gvsig@gva.es
65
 *      www.gvsig.gva.es
66
 *
67
 *    or
68
 *
69
 *   IVER T.I. S.A
70
 *   Salamanca 50
71
 *   46005 Valencia
72
 *   Spain
73
 *
74
 *   +34 963163400
75
 *   dac@iver.es
76
 */
77
/* CVS MESSAGES:
78
 *
79
 * $Id$
80
 * $Log$
81
 *
82
 */
83
/**
84
 * @author Jorge Piera LLodr? (jorge.piera@iver.es)
85
 */
86
public abstract class GPEVectorialDriver implements IGPEDriver, VectorialDriver, ObjectDriver,
87
BoundedShapes{
88
        private Rectangle2D extent = null;
89
        //The data
90
        private HashMap features = null;
91
        private int numFeatures = 0; 
92
        private GPEParser parser = null;
93
        private IProjection projection = null;
94
        private File m_Fich;
95
        private boolean isWarningShowed = false;
96
        private DriverAttributes attributes = null;
97

    
98
        GPEVectorialDriver() {
99
                super();        
100
                features = new HashMap();
101
                GPEParser[] parsers = GPERegister.getAllParsers();
102
                for (int i=0 ; i<parsers.length ; i++){
103
                        if (parsers[i].getClass() == getGPEParser()){
104
                                setParser(parsers[i]);
105
                        }
106
                }
107
        }        
108

    
109
        /**
110
         * @return the parser
111
         */
112
        public GPEParser getParser() {
113
                return parser;
114
        }
115

    
116
        /**
117
         * @param parser the parser to set
118
         */
119
        public void setParser(GPEParser parser) {
120
                this.parser = parser;
121
        }
122

    
123
        /**
124
         * @return the projection
125
         */
126
        public IProjection getProjection() {
127
                return projection;
128
        }
129

    
130
        /**
131
         * @param projection the projection to set
132
         */
133
        public void setProjection(IProjection projection) {
134
                this.projection = projection;
135
        }
136

    
137
        /**
138
         * Add a new feature in the layer
139
         * @param feature
140
         * The feature to add
141
         */
142
        public void addFeature(GPEFeature feature) {
143
                IGeometry geometry = getGeometry(feature);
144
                //if the geometry exists
145
                if (geometry != null){
146
                        //Update the extent
147
                        Rectangle2D boundsShp = geometry.getBounds();
148
                        if (extent == null) {
149
                                extent = boundsShp;
150
                        } else {
151
                                extent.add(boundsShp);
152
                        }
153
                        //Set the geometry
154
                        feature.getGeometry().setReprojectedGeometry(geometry);
155
                        //Set the attributes
156
                        features.put(new Integer(numFeatures), feature);
157
                        numFeatures++;
158
                }
159
        }
160

    
161
        /**
162
         * Gets the geometry
163
         * @param feature
164
         * The feature to add
165
         */
166
        private IGeometry getGeometry(GPEFeature feature){
167
                GPEGeometry gpeGeometry = ((GPEFeature)feature).getGeometry();
168
                if (gpeGeometry != null){
169
                        IProjection geomProj = null;
170
                        if (gpeGeometry.getSrs() != null){
171
                                try{
172
                                        geomProj = CRSFactory.getCRS(gpeGeometry.getSrs());
173
                                }catch(Exception e){
174
                                        //If the CRS factory has an error.
175
                                }                                
176
                        }
177
                        if (geomProj == null){
178
                                return gpeGeometry.getIGeometry();
179
                        }else{
180
                                if (projection == null){
181
                                        return gpeGeometry.getIGeometry();
182
                                }else{
183
                                        if (geomProj.getAbrev().compareTo(projection.getAbrev()) == 0){
184
                                                return gpeGeometry.getIGeometry();
185
                                        }else{
186
                                                ICoordTrans coordTrans = geomProj.getCT(projection);
187
                                                FShape shape = (FShape)gpeGeometry.getIGeometry().getInternalShape();
188
                                                shape.reProject(coordTrans);
189
                                                return ShapeFactory.createGeometry(shape);
190
                                        }
191
                                }
192
                        }
193
                }
194
                return null;
195
        }
196

    
197
        /*
198
         * (non-Javadoc)
199
         * @see com.iver.cit.gvsig.fmap.drivers.gpe.reader.IGPEDriver#setExtent(java.awt.geom.Rectangle2D)
200
         */
201
        public void setExtent(Rectangle2D extent) {
202
                this.extent = extent;                
203
        }
204

    
205
        /*
206
         * (non-Javadoc)
207
         * @see com.iver.cit.gvsig.fmap.drivers.VectorialDriver#getDriverAttributes()
208
         */
209
        public DriverAttributes getDriverAttributes() {
210
                if (attributes == null){
211
                        attributes = new DriverAttributes();
212
                        attributes.setLoadedInMemory(true);                        
213
                }
214
                return attributes;
215
        }
216

    
217
        /*
218
         * (non-Javadoc)
219
         * @see com.iver.cit.gvsig.fmap.drivers.VectorialDriver#getFullExtent()
220
         */
221
        public Rectangle2D getFullExtent(){
222
                return extent;
223
        }
224

    
225
        /*
226
         * (non-Javadoc)
227
         * @see com.iver.cit.gvsig.fmap.drivers.VectorialDriver#getShape(int)
228
         */
229
        public IGeometry getShape(int index) {
230
                return ((GPEFeature)features.get(new Integer(index))).getGeometry().getReprojectedGeometry();
231
        }
232

    
233
        /*
234
         * (non-Javadoc)
235
         * @see com.iver.cit.gvsig.fmap.drivers.VectorialDriver#getShapeCount()
236
         */
237
        public int getShapeCount() {
238
                return features.size();
239
        }
240

    
241
        /*
242
         * (non-Javadoc)
243
         * @see com.iver.cit.gvsig.fmap.drivers.VectorialDriver#getShapeType()
244
         */
245
        public int getShapeType() {
246
                return FShape.MULTI;
247
        }
248

    
249
        /*
250
         * (non-Javadoc)
251
         * @see com.iver.cit.gvsig.fmap.drivers.VectorialDriver#isWritable()
252
         */
253
        public boolean isWritable() {
254
                return true;
255
        }
256

    
257
        /*
258
         * (non-Javadoc)
259
         * @see com.iver.cit.gvsig.fmap.drivers.VectorialDriver#reload()
260
         */
261
        public void reload() {
262
                numFeatures = 0; 
263
                features.clear();
264
                extent = null;
265
        }
266

    
267
        /*
268
         * (non-Javadoc)
269
         * @see com.hardcode.gdbms.engine.data.driver.ObjectDriver#getPrimaryKeys()
270
         */
271
        public int[] getPrimaryKeys() {
272
                return null;
273
        }
274

    
275
        /*
276
         * (non-Javadoc)
277
         * @see com.hardcode.gdbms.engine.data.driver.ObjectDriver#write(com.hardcode.gdbms.engine.data.edition.DataWare)
278
         */
279
        public void write(DataWare dataWare) {                
280

    
281
        }
282

    
283
        /*
284
         * (non-Javadoc)
285
         * @see com.hardcode.gdbms.engine.data.driver.GDBMSDriver#setDataSourceFactory(com.hardcode.gdbms.engine.data.DataSourceFactory)
286
         */
287
        public void setDataSourceFactory(DataSourceFactory dsf) {
288
                // TODO Auto-generated method stub
289

    
290
        }
291

    
292
        /*
293
         * (non-Javadoc)
294
         * @see com.hardcode.gdbms.engine.data.driver.ReadAccess#getFieldCount()
295
         */
296
        public int getFieldCount() {
297
                if (features.size() > 0){
298
                        GPEFeature feature = (GPEFeature)features.get(new Integer(0));
299
                        return feature.getelements().size() + 1;
300
                }
301
                return 1;
302
        }
303

    
304
        /*
305
         * (non-Javadoc)
306
         * @see com.hardcode.gdbms.engine.data.driver.ReadAccess#getFieldName(int)
307
         */
308
        public String getFieldName(int fieldId) {
309
                if (fieldId == getFieldCount()-1){
310
                        return "fid";
311
                }
312
                if (features.size() > 0){
313
                        GPEFeature feature = (GPEFeature)features.get(new Integer(0));
314
                        Iterator it = feature.getelements().keySet().iterator();
315
                        String fieldName = null;
316
                        for (int i=0 ; i<=fieldId ; i++){
317
                                fieldName = (String)it.next();
318
                        }
319
                        return fieldName;
320
                }
321
                return null;
322
        }
323

    
324
        /*
325
         * (non-Javadoc)
326
         * @see com.hardcode.gdbms.engine.data.driver.ReadAccess#getFieldType(int)
327
         */
328
        public int getFieldType(int i) {
329
                if (i == getFieldCount()-1){
330
                        return Types.VARCHAR;
331
                }
332
                if (getRowCount() > 1){
333
                        Value value = getFieldValue(0,i);
334
                        return value.getSQLType();
335
                }
336
                return Types.VARCHAR;
337
        }
338

    
339
        /*
340
         * (non-Javadoc)
341
         * @see com.hardcode.gdbms.engine.data.driver.ReadAccess#getFieldValue(long, int)
342
         */
343
        public Value getFieldValue(long rowIndex, int fieldId) {
344
                GPEFeature feature = (GPEFeature)features.get(new Integer((int)rowIndex));
345
                if (fieldId == getFieldCount()-1){
346
                        return feature.getId();
347
                }
348
                String attName = getFieldName(fieldId);
349
                GPEElement element = (GPEElement)feature.getelements().get(attName);
350
                if (element != null){
351
                        return element.getValue();
352
                }
353
                return ValueFactory.createValue("");
354
        }
355

    
356
        /*
357
         * (non-Javadoc)
358
         * @see com.hardcode.gdbms.engine.data.driver.ReadAccess#getFieldWidth(int)
359
         */
360
        public int getFieldWidth(int i) {
361
                return 50;
362
        }
363

    
364
        /*
365
         * (non-Javadoc)
366
         * @see com.hardcode.gdbms.engine.data.driver.ReadAccess#getRowCount()
367
         */
368
        public long getRowCount() {
369
                return features.size();
370
        }
371

    
372
        /*
373
         * (non-Javadoc)
374
         * @see com.iver.cit.gvsig.fmap.drivers.BoundedShapes#getShapeBounds(int)
375
         */
376
        public Rectangle2D getShapeBounds(int index){
377
                return ((GPEFeature)features.get(new Integer(index))).getGeometry().getShapeBounds();
378
        }
379

    
380
        /*
381
         * (non-Javadoc)
382
         * @see com.iver.cit.gvsig.fmap.drivers.BoundedShapes#getShapeType(int)
383
         */
384
        public int getShapeType(int index){
385
                return FShape.MULTI;
386
        }
387

    
388
        /*
389
         * (non-Javadoc)
390
         * @see com.iver.cit.gvsig.fmap.drivers.VectorialFileDriver#close()
391
         */
392
        public void close() {
393

    
394
        }
395

    
396
        /*
397
         * (non-Javadoc)
398
         * @see com.iver.cit.gvsig.fmap.drivers.VectorialFileDriver#getFile()
399
         */
400
        public File getFile() {
401
                return m_Fich;
402
        }
403

    
404
        /*
405
         * (non-Javadoc)
406
         * @see com.iver.cit.gvsig.fmap.drivers.VectorialFileDriver#initialize()
407
         */
408
        public void initialize() {
409
                FmapErrorHandler errorHandler = FmapHandlerFactory.createErrorHandler();
410
                DefaultFmapContentHandler contentHandler = FmapHandlerFactory.createContentHandler(errorHandler,
411
                                this);                
412
                GPEParser parser = getParser();
413
                parser.parse(contentHandler,
414
                                errorHandler,
415
                                getFile().toURI());                
416
                //TODO patch to support multilayer on KML
417
                if (getName().equals(KMLVectorialDriver.DRIVERNAME)){
418
                        if (isWarningShowed == false){
419
                                JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
420
                                                PluginServices.getText(this,"gpe_gvsig_dont_support_multilayer"));
421
                                isWarningShowed = true;
422
                        }
423
                }
424
        }
425

    
426
        /*
427
         * (non-Javadoc)
428
         * @see com.iver.cit.gvsig.fmap.drivers.VectorialFileDriver#open(java.io.File)
429
         */
430
        public void open(File f) {
431
                m_Fich = f;
432
        }
433

    
434
        /*
435
         * (non-Javadoc)
436
         * @see com.iver.cit.gvsig.fmap.drivers.VectorialFileDriver#accept(java.io.File)
437
         */
438
        public boolean accept(File f) {
439
                if (f.isDirectory()){
440
                        return true;
441
                }
442
                return (getParser().accept(f.toURI()));
443
        }
444

    
445
        /* (non-Javadoc)
446
         * @see com.iver.cit.gvsig.fmap.drivers.gpe.reader.IGPEDriver#getTypeName()
447
         */
448
        public String getTypeName() {
449
                if (features.size() > 0){
450
                        GPEFeature feature = (GPEFeature)features.get(new Integer(0));
451
                        return feature.getName();
452
                }
453
                return null;
454
        }
455
        
456
        
457
}