Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.geometry / org.gvsig.fmap.geometry.impl / src / main / java / org / gvsig / fmap / geom / aggregate / impl / BaseMultiPrimitive.java @ 40435

History | View | Annotate | Download (12.1 KB)

1
package org.gvsig.fmap.geom.aggregate.impl;
2

    
3
import java.awt.Rectangle;
4
import java.awt.Shape;
5
import java.awt.geom.AffineTransform;
6
import java.awt.geom.PathIterator;
7
import java.awt.geom.Point2D;
8
import java.awt.geom.Rectangle2D;
9
import java.util.ArrayList;
10
import java.util.List;
11

    
12
import org.cresques.cts.ICoordTrans;
13
import org.cresques.cts.IProjection;
14
import org.slf4j.Logger;
15
import org.slf4j.LoggerFactory;
16

    
17
import org.gvsig.fmap.geom.Geometry;
18
import org.gvsig.fmap.geom.GeometryManager;
19
import org.gvsig.fmap.geom.aggregate.MultiPrimitive;
20
import org.gvsig.fmap.geom.handler.Handler;
21
import org.gvsig.fmap.geom.operation.GeometryOperationException;
22
import org.gvsig.fmap.geom.primitive.Envelope;
23
import org.gvsig.fmap.geom.primitive.FShape;
24
import org.gvsig.fmap.geom.primitive.GeneralPathX;
25
import org.gvsig.fmap.geom.primitive.Primitive;
26
import org.gvsig.fmap.geom.primitive.impl.AbstractPrimitive;
27
import org.gvsig.fmap.geom.type.GeometryType;
28

    
29
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
30
 *
31
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
32
 *
33
 * This program is free software; you can redistribute it and/or
34
 * modify it under the terms of the GNU General Public License
35
 * as published by the Free Software Foundation; either version 2
36
 * of the License, or (at your option) any later version.
37
 *
38
 * This program is distributed in the hope that it will be useful,
39
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
40
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
41
 * GNU General Public License for more details.
42
 *
43
 * You should have received a copy of the GNU General Public License
44
 * along with this program; if not, write to the Free Software
45
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
46
 *
47
 * For more information, contact:
48
 *
49
 *  Generalitat Valenciana
50
 *   Conselleria d'Infraestructures i Transport
51
 *   Av. Blasco Ib??ez, 50
52
 *   46010 VALENCIA
53
 *   SPAIN
54
 *
55
 *      +34 963862235
56
 *   gvsig@gva.es
57
 *      www.gvsig.gva.es
58
 *
59
 *    or
60
 *
61
 *   IVER T.I. S.A
62
 *   Salamanca 50
63
 *   46005 Valencia
64
 *   Spain
65
 *
66
 *   +34 963163400
67
 *   dac@iver.es
68
 */
69
/* CVS MESSAGES:
70
 *
71
 * $Id: FGeometryCollection.java,v 1.2 2008/03/25 08:47:41 cvs Exp $
72
 * $Log: FGeometryCollection.java,v $
73
 * Revision 1.2  2008/03/25 08:47:41  cvs
74
 * Visitors removed
75
 *
76
 * Revision 1.1  2008/03/12 08:46:20  cvs
77
 * *** empty log message ***
78
 *
79
 *
80
 */
81
/**
82
 * @author Jorge Piera Llodr? (jorge.piera@iver.es)
83
 */
84
public abstract class BaseMultiPrimitive extends AbstractPrimitive implements
85
                MultiPrimitive {
86
        private static final long serialVersionUID = 8023609161647736932L;
87
        
88
        private static final Logger logger = LoggerFactory.getLogger(GeometryManager.class);
89

    
90
        protected ArrayList geometries = null;
91
        
92
        /**
93
         * The constructor with the GeometryType like and argument 
94
         * is used by the {@link GeometryType}{@link #create()}
95
         * to create the geometry
96
         * @param type
97
         * The geometry type
98
         */
99
        public BaseMultiPrimitive(GeometryType geometryType) {
100
                super(geometryType);
101
                geometries = new ArrayList();
102
        }
103

    
104
        BaseMultiPrimitive(GeometryType geometryType, String id, IProjection projection,
105
                        Geometry[] geometries) {
106
                super(geometryType, id, projection);
107
                this.geometries = new ArrayList();
108
                for (int i=0 ; i<geometries.length ; i++){
109
                        this.geometries.add(geometries[i]);
110
                }
111
        }        
112
        
113
        BaseMultiPrimitive(GeometryType geometryType, String id, IProjection projection) {
114
                super(geometryType, id, projection);
115
                this.geometries = new ArrayList();                
116
        }        
117

    
118
        /*
119
         * (non-Javadoc)
120
         *
121
         * @see java.awt.Shape#contains(double, double)
122
         */
123
        public boolean contains(double x, double y) {
124
                
125
                boolean bResul;
126
                for (int i = 0; i < getPrimitivesNumber(); i++) {
127

    
128
                        try {
129
                                bResul = containsPoint(
130
                                                (Geometry)geometries.get(i), x, y);
131
                        } catch (GeometryOperationException e) {
132
                                logger.error("While doing contains: " + e.getMessage(), e);
133
                                bResul = true;
134
                        }
135

    
136
                        if (bResul)
137
                                return true;
138
                }
139
                return false;
140
        }
141

    
142
        /*
143
         * (non-Javadoc)
144
         *
145
         * @see java.awt.Shape#contains(double, double, double, double)
146
         */
147
        public boolean contains(double x, double y, double w, double h) {
148
                return false;
149
        }
150

    
151
        /*
152
         * (non-Javadoc)
153
         *
154
         * @see java.awt.Shape#contains(java.awt.geom.Point2D)
155
         */
156
        public boolean contains(Point2D p) {
157
                boolean bResul;
158
                for (int i = 0; i < getPrimitivesNumber(); i++) {
159
                        try {
160
                                bResul = containsPoint(
161
                                                (Geometry)geometries.get(i),
162
                                                p.getX(), p.getY());
163
                        } catch (GeometryOperationException e) {
164
                                logger.error("While doing contains: " + e.getMessage(), e);
165
                                bResul = true;
166
                        }
167
                        if (bResul)
168
                                return true;
169
                }
170
                return false;
171
        }
172

    
173
        /*
174
         * (non-Javadoc)
175
         *
176
         * @see java.awt.Shape#contains(java.awt.geom.Rectangle2D)
177
         */
178
        public boolean contains(Rectangle2D r) {
179
                boolean bResul;
180
                for (int i = 0; i < getPrimitivesNumber(); i++) {
181
                        
182
                        try {
183
                                bResul = containsRectangle(
184
                                                (Geometry)geometries.get(i),
185
                                                r.getMinX(), r.getMinY(), r.getWidth(), r.getHeight());
186
                        } catch (GeometryOperationException e) {
187
                                logger.error("While doing contains: " + e.getMessage(), e);
188
                                bResul = true;
189
                        }
190
                        
191
                        
192
                        if (bResul)
193
                                return true;
194
                }
195
                return false;
196
        }
197

    
198
        /*
199
         * (non-Javadoc)
200
         *
201
         * @see org.gvsig.geometries.iso.GM_Object#coordinateDimension()
202
         */
203
        public int getDimension() {
204
                return 2;
205
        }
206

    
207
        /*
208
         * (non-Javadoc)
209
         *
210
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#fastIntersects(double,
211
         *      double, double, double)
212
         */
213
        public boolean fastIntersects(double x, double y, double w, double h) {
214
                
215
                boolean resp = false;
216
                for (int i = 0; i < getPrimitivesNumber(); i++) {
217
                        
218
                        Geometry geom = (Geometry) geometries.get(i);
219
                        
220
                        try {
221
                                resp = intersectsRectangle(geom, x, y, w, h);
222
                        } catch (GeometryOperationException e) {
223
                                logger.error("While doing fast intersects: " + e.getMessage(), e);
224
                                resp = true;
225
                        }
226
                        
227
                        if (resp) {
228
                                return true;
229
                        }
230
                        
231
                                
232
                                
233
                }
234
                return false;
235
        }
236

    
237

    
238
        /*
239
         * (non-Javadoc)
240
         *
241
         * @see java.awt.Shape#getBounds()
242
         */
243
        public Rectangle getBounds() {
244
                Rectangle r = null;
245
                if (getPrimitivesNumber() > 0) {
246
                        r = ((Geometry)geometries.get(0)).getShape().getBounds();
247
                }
248
                for (int i = 1; i < getPrimitivesNumber(); i++) {
249
                        Rectangle r2 = ((Geometry)geometries.get(i)).getShape().getBounds();
250
                        r.add(r2);
251
                }
252
                return r;
253
        }
254

    
255
        /*
256
         * (non-Javadoc)
257
         *
258
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#getBounds2D()
259
         */
260
        public Rectangle2D getBounds2D() {
261
                return null;
262
        }
263

    
264
        public Handler[] getHandlers(int type) {
265
                int numPrimitives = getPrimitivesNumber();
266
                List handlers = new ArrayList();
267
                for (int i = 0; i < numPrimitives; i++) {
268
                    Handler[] currentHandlers = getPrimitiveAt(i).getHandlers(type);
269
                    for (int j=0 ; j<currentHandlers.length ; j++){
270
                        handlers.add(currentHandlers[j]);
271
                    }
272
                }
273
                return (Handler[])handlers.toArray(new Handler[handlers.size()]);
274
        }
275

    
276
        /*
277
         * (non-Javadoc)
278
         *
279
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#getInternalShape()
280
         */
281
        public Shape getInternalShape() {
282
                return this;
283
        }
284

    
285
        /*
286
         * (non-Javadoc)
287
         *
288
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#getPathIterator(java.awt.geom.AffineTransform)
289
         */
290
        public PathIterator getPathIterator(AffineTransform at) {
291
                GeneralPathX gpx = new GeneralPathX();
292
                int primiNum = getPrimitivesNumber();
293
                if (primiNum > 0) {
294
                        Point2D p = ((Geometry)geometries.get(0)).getHandlers(Geometry.SELECTHANDLER)[0]
295
                                                                                                      .getPoint();
296
                        gpx.moveTo(p.getX(), p.getY());
297

    
298
                        for (int i = 1; i < primiNum; i++) {
299
                                p = ((Geometry)geometries.get(i)).getHandlers(Geometry.SELECTHANDLER)[0]
300
                                                                                                              .getPoint();
301
                                gpx.lineTo(p.getX(), p.getY());
302
                        }
303
                        Point2D p2 = ((Geometry)geometries.get(primiNum-1)).getHandlers(Geometry.SELECTHANDLER)[((Geometry)geometries.get(primiNum-1)).getHandlers(Geometry.SELECTHANDLER).length-1]
304
                                                                                                                .getPoint();
305
                        gpx.lineTo(p2.getX(), p2.getY());
306
                }
307
                return gpx.getPathIterator(at);
308
        }
309

    
310
        /*
311
         * (non-Javadoc)
312
         *
313
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#getPathIterator(java.awt.geom.AffineTransform,
314
         *      double)
315
         */
316
        public PathIterator getPathIterator(AffineTransform at, double flatness) {
317
                GeneralPathX gpx = new GeneralPathX();
318
                int primiNum = getPrimitivesNumber();
319
                if (primiNum > 0) {
320

    
321
                    Geometry prim = null;
322
                        for (int i = 0; i < primiNum; i++) {
323
                            prim = (Geometry) geometries.get(i);
324
                            gpx.append(
325
                                prim.getPathIterator(at, flatness),
326
                                /*
327
                                 * This is a relevant change.
328
                                 * After BN 2056 this class will not return
329
                                 * connected path iterator. There will be MOVE_TO
330
                                 * between iterator of each primitive
331
                                 */
332
                                false);
333
                        }
334
                }
335
                /*
336
                 * affine transform and flatness already applied in loop
337
                 */
338
                return gpx.getPathIterator(null);
339
        }
340

    
341
        /*
342
         * (non-Javadoc)
343
         *
344
         * @see org.gvsig.geometries.iso.aggregate.GM_Aggregate#getPrimitiveAt(int)
345
         */
346
        public Primitive getPrimitiveAt(int i) {
347
                if (i < getPrimitivesNumber()) {
348
                        return (Primitive) ((Geometry)geometries.get(i));
349
                }
350
                return null;
351
        }
352

    
353
        /*
354
         * (non-Javadoc)
355
         *
356
         * @see org.gvsig.geometries.iso.aggregate.GM_Aggregate#getPrimitivesNumber()
357
         */
358
        public int getPrimitivesNumber() {
359
                if (geometries == null) {
360
                        return 0;
361
                }
362
                return geometries.size();
363
        }
364

    
365
        /*
366
         * (non-Javadoc)
367
         *
368
         * @see java.awt.Shape#intersects(double, double, double, double)
369
         */
370
        public boolean intersects(double x, double y, double w, double h) {
371
                boolean bResul;
372
                for (int i = 0; i < getPrimitivesNumber(); i++) {
373

    
374
                        try {
375
                                bResul = containsRectangle((Geometry)geometries.get(i), x, y, w, h);
376
                        } catch (GeometryOperationException e) {
377
                                logger.error("While doing contains: " + e.getMessage(), e);
378
                                bResul = true;
379
                        }
380
                        if (bResul)
381
                                return true;
382
                }
383
                return false;
384
        }
385

    
386

    
387
        /*
388
         * (non-Javadoc)
389
         *
390
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#intersects(java.awt.geom.Rectangle2D)
391
         */
392
        public boolean intersects(Rectangle2D r) {
393
                for (int i = 0; i < getPrimitivesNumber(); i++) {
394
                    
395
                    Geometry prim = this.getPrimitiveAt(i);
396
                    if (prim.intersects(r)) {
397
                        return true;
398
                    }
399
                }
400
                return false;
401
        }
402

    
403
        /*
404
         * (non-Javadoc)
405
         *
406
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#isSimple()
407
         */
408
        public boolean isSimple() {
409
                return false;
410
        }
411

    
412
        /*
413
         * (non-Javadoc)
414
         *
415
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#reProject(org.cresques.cts.ICoordTrans)
416
         */
417
        public void reProject(ICoordTrans ct) {
418
                for (int i = 0; i < getPrimitivesNumber(); i++) {
419
                        ((Geometry)geometries.get(i)).reProject(ct);
420
                }
421
        }
422

    
423
        /*
424
         * (non-Javadoc)
425
         *
426
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#transform(java.awt.geom.AffineTransform)
427
         */
428
        public void transform(AffineTransform at) {
429
                for (int i = 0; i < getPrimitivesNumber(); i++) {
430
                        ((Geometry)geometries.get(i)).transform(at);
431
                }
432
        }
433

    
434
        /*
435
         * (non-Javadoc)
436
         *
437
         * @see org.gvsig.geometries.iso.GM_Object#getBoundary()
438
         */
439
        public Envelope getEnvelope() {
440
                Envelope r = null;
441
                if (getPrimitivesNumber() > 0) {
442
                        r = ((Geometry)geometries.get(0)).getEnvelope();
443
                }
444
                for (int i = 1; i < getPrimitivesNumber(); i++) {
445
                        Envelope r2 = ((Geometry)geometries.get(i)).getEnvelope();
446
                        r.add(r2);
447
                }
448
                return r;
449
        }
450

    
451
        /**
452
         * @return the geometries
453
         * @deprecated
454
         */
455
        public Geometry[] getGeometries() {
456
                Geometry[] _geometries = new Geometry[geometries.size()];
457
                for (int i=0 ; i<geometries.size() ; i++){
458
                        _geometries[i] = ((Geometry)geometries.get(i));
459
                }
460
                return _geometries;
461
        }
462

    
463
        public FShape cloneFShape() {
464
                // TODO Auto-generated method stub
465
                return null;
466
        }
467

    
468
        public Handler[] getSelectHandlers() {
469
                // TODO Auto-generated method stub
470
                return null;
471
        }
472

    
473
        public Handler[] getStretchingHandlers() {
474
                // TODO Auto-generated method stub
475
                return null;
476
        }
477

    
478
        public GeneralPathX getGeneralPath() {
479
                // TODO Auto-generated method stub
480
                return null;
481
        }
482

    
483

    
484
        /* (non-Javadoc)
485
         * @see org.gvsig.fmap.geom.aggregate.MultiPrimitive#addPrimitive(org.gvsig.fmap.geom.primitive.Primitive)
486
         */
487
        public void addPrimitive(Primitive primitive) {
488
                geometries.add(primitive);
489
        }
490
        
491

    
492

    
493

    
494

    
495
}