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 @ 40559

History | View | Annotate | Download (13 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
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 3
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
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.fmap.geom.aggregate.impl;
25

    
26
import java.awt.Rectangle;
27
import java.awt.Shape;
28
import java.awt.geom.AffineTransform;
29
import java.awt.geom.PathIterator;
30
import java.awt.geom.Point2D;
31
import java.awt.geom.Rectangle2D;
32
import java.util.ArrayList;
33
import java.util.List;
34

    
35
import org.cresques.cts.ICoordTrans;
36
import org.cresques.cts.IProjection;
37
import org.slf4j.Logger;
38
import org.slf4j.LoggerFactory;
39

    
40
import org.gvsig.fmap.geom.Geometry;
41
import org.gvsig.fmap.geom.GeometryManager;
42
import org.gvsig.fmap.geom.aggregate.MultiPrimitive;
43
import org.gvsig.fmap.geom.handler.Handler;
44
import org.gvsig.fmap.geom.operation.GeometryOperationException;
45
import org.gvsig.fmap.geom.primitive.Envelope;
46
import org.gvsig.fmap.geom.primitive.FShape;
47
import org.gvsig.fmap.geom.primitive.GeneralPathX;
48
import org.gvsig.fmap.geom.primitive.Primitive;
49
import org.gvsig.fmap.geom.primitive.impl.AbstractPrimitive;
50
import org.gvsig.fmap.geom.type.GeometryType;
51

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

    
113
        protected ArrayList geometries = null;
114
        
115
        /**
116
         * The constructor with the GeometryType like and argument 
117
         * is used by the {@link GeometryType}{@link #create()}
118
         * to create the geometry
119
         * @param type
120
         * The geometry type
121
         */
122
        public BaseMultiPrimitive(GeometryType geometryType) {
123
                super(geometryType);
124
                geometries = new ArrayList();
125
        }
126

    
127
        BaseMultiPrimitive(GeometryType geometryType, String id, IProjection projection,
128
                        Geometry[] geometries) {
129
                super(geometryType, id, projection);
130
                this.geometries = new ArrayList();
131
                for (int i=0 ; i<geometries.length ; i++){
132
                        this.geometries.add(geometries[i]);
133
                }
134
        }        
135
        
136
        BaseMultiPrimitive(GeometryType geometryType, String id, IProjection projection) {
137
                super(geometryType, id, projection);
138
                this.geometries = new ArrayList();                
139
        }        
140

    
141
        /*
142
         * (non-Javadoc)
143
         *
144
         * @see java.awt.Shape#contains(double, double)
145
         */
146
        public boolean contains(double x, double y) {
147
                
148
                boolean bResul;
149
                for (int i = 0; i < getPrimitivesNumber(); i++) {
150

    
151
                        try {
152
                                bResul = containsPoint(
153
                                                (Geometry)geometries.get(i), x, y);
154
                        } catch (GeometryOperationException e) {
155
                                logger.error("While doing contains: " + e.getMessage(), e);
156
                                bResul = true;
157
                        }
158

    
159
                        if (bResul)
160
                                return true;
161
                }
162
                return false;
163
        }
164

    
165
        /*
166
         * (non-Javadoc)
167
         *
168
         * @see java.awt.Shape#contains(double, double, double, double)
169
         */
170
        public boolean contains(double x, double y, double w, double h) {
171
                return false;
172
        }
173

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

    
196
        /*
197
         * (non-Javadoc)
198
         *
199
         * @see java.awt.Shape#contains(java.awt.geom.Rectangle2D)
200
         */
201
        public boolean contains(Rectangle2D r) {
202
                boolean bResul;
203
                for (int i = 0; i < getPrimitivesNumber(); i++) {
204
                        
205
                        try {
206
                                bResul = containsRectangle(
207
                                                (Geometry)geometries.get(i),
208
                                                r.getMinX(), r.getMinY(), r.getWidth(), r.getHeight());
209
                        } catch (GeometryOperationException e) {
210
                                logger.error("While doing contains: " + e.getMessage(), e);
211
                                bResul = true;
212
                        }
213
                        
214
                        
215
                        if (bResul)
216
                                return true;
217
                }
218
                return false;
219
        }
220

    
221
        /*
222
         * (non-Javadoc)
223
         *
224
         * @see org.gvsig.geometries.iso.GM_Object#coordinateDimension()
225
         */
226
        public int getDimension() {
227
                return 2;
228
        }
229

    
230
        /*
231
         * (non-Javadoc)
232
         *
233
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#fastIntersects(double,
234
         *      double, double, double)
235
         */
236
        public boolean fastIntersects(double x, double y, double w, double h) {
237
                
238
                boolean resp = false;
239
                for (int i = 0; i < getPrimitivesNumber(); i++) {
240
                        
241
                        Geometry geom = (Geometry) geometries.get(i);
242
                        
243
                        try {
244
                                resp = intersectsRectangle(geom, x, y, w, h);
245
                        } catch (GeometryOperationException e) {
246
                                logger.error("While doing fast intersects: " + e.getMessage(), e);
247
                                resp = true;
248
                        }
249
                        
250
                        if (resp) {
251
                                return true;
252
                        }
253
                        
254
                                
255
                                
256
                }
257
                return false;
258
        }
259

    
260

    
261
        /*
262
         * (non-Javadoc)
263
         *
264
         * @see java.awt.Shape#getBounds()
265
         */
266
        public Rectangle getBounds() {
267
                Rectangle r = null;
268
                if (getPrimitivesNumber() > 0) {
269
                        r = ((Geometry)geometries.get(0)).getShape().getBounds();
270
                }
271
                for (int i = 1; i < getPrimitivesNumber(); i++) {
272
                        Rectangle r2 = ((Geometry)geometries.get(i)).getShape().getBounds();
273
                        r.add(r2);
274
                }
275
                return r;
276
        }
277

    
278
        /*
279
         * (non-Javadoc)
280
         *
281
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#getBounds2D()
282
         */
283
        public Rectangle2D getBounds2D() {
284
                return null;
285
        }
286

    
287
        public Handler[] getHandlers(int type) {
288
                int numPrimitives = getPrimitivesNumber();
289
                List handlers = new ArrayList();
290
                for (int i = 0; i < numPrimitives; i++) {
291
                    Handler[] currentHandlers = getPrimitiveAt(i).getHandlers(type);
292
                    for (int j=0 ; j<currentHandlers.length ; j++){
293
                        handlers.add(currentHandlers[j]);
294
                    }
295
                }
296
                return (Handler[])handlers.toArray(new Handler[handlers.size()]);
297
        }
298

    
299
        /*
300
         * (non-Javadoc)
301
         *
302
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#getInternalShape()
303
         */
304
        public Shape getInternalShape() {
305
                return this;
306
        }
307

    
308
        /*
309
         * (non-Javadoc)
310
         *
311
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#getPathIterator(java.awt.geom.AffineTransform)
312
         */
313
        public PathIterator getPathIterator(AffineTransform at) {
314
                GeneralPathX gpx = new GeneralPathX();
315
                int primiNum = getPrimitivesNumber();
316
                if (primiNum > 0) {
317
                        Point2D p = ((Geometry)geometries.get(0)).getHandlers(Geometry.SELECTHANDLER)[0]
318
                                                                                                      .getPoint();
319
                        gpx.moveTo(p.getX(), p.getY());
320

    
321
                        for (int i = 1; i < primiNum; i++) {
322
                                p = ((Geometry)geometries.get(i)).getHandlers(Geometry.SELECTHANDLER)[0]
323
                                                                                                              .getPoint();
324
                                gpx.lineTo(p.getX(), p.getY());
325
                        }
326
                        Point2D p2 = ((Geometry)geometries.get(primiNum-1)).getHandlers(Geometry.SELECTHANDLER)[((Geometry)geometries.get(primiNum-1)).getHandlers(Geometry.SELECTHANDLER).length-1]
327
                                                                                                                .getPoint();
328
                        gpx.lineTo(p2.getX(), p2.getY());
329
                }
330
                return gpx.getPathIterator(at);
331
        }
332

    
333
        /*
334
         * (non-Javadoc)
335
         *
336
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#getPathIterator(java.awt.geom.AffineTransform,
337
         *      double)
338
         */
339
        public PathIterator getPathIterator(AffineTransform at, double flatness) {
340
                GeneralPathX gpx = new GeneralPathX();
341
                int primiNum = getPrimitivesNumber();
342
                if (primiNum > 0) {
343

    
344
                    Geometry prim = null;
345
                        for (int i = 0; i < primiNum; i++) {
346
                            prim = (Geometry) geometries.get(i);
347
                            gpx.append(
348
                                prim.getPathIterator(at, flatness),
349
                                /*
350
                                 * This is a relevant change.
351
                                 * After BN 2056 this class will not return
352
                                 * connected path iterator. There will be MOVE_TO
353
                                 * between iterator of each primitive
354
                                 */
355
                                false);
356
                        }
357
                }
358
                /*
359
                 * affine transform and flatness already applied in loop
360
                 */
361
                return gpx.getPathIterator(null);
362
        }
363

    
364
        /*
365
         * (non-Javadoc)
366
         *
367
         * @see org.gvsig.geometries.iso.aggregate.GM_Aggregate#getPrimitiveAt(int)
368
         */
369
        public Primitive getPrimitiveAt(int i) {
370
                if (i < getPrimitivesNumber()) {
371
                        return (Primitive) ((Geometry)geometries.get(i));
372
                }
373
                return null;
374
        }
375

    
376
        /*
377
         * (non-Javadoc)
378
         *
379
         * @see org.gvsig.geometries.iso.aggregate.GM_Aggregate#getPrimitivesNumber()
380
         */
381
        public int getPrimitivesNumber() {
382
                if (geometries == null) {
383
                        return 0;
384
                }
385
                return geometries.size();
386
        }
387

    
388
        /*
389
         * (non-Javadoc)
390
         *
391
         * @see java.awt.Shape#intersects(double, double, double, double)
392
         */
393
        public boolean intersects(double x, double y, double w, double h) {
394
                boolean bResul;
395
                for (int i = 0; i < getPrimitivesNumber(); i++) {
396

    
397
                        try {
398
                                bResul = containsRectangle((Geometry)geometries.get(i), x, y, w, h);
399
                        } catch (GeometryOperationException e) {
400
                                logger.error("While doing contains: " + e.getMessage(), e);
401
                                bResul = true;
402
                        }
403
                        if (bResul)
404
                                return true;
405
                }
406
                return false;
407
        }
408

    
409

    
410
        /*
411
         * (non-Javadoc)
412
         *
413
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#intersects(java.awt.geom.Rectangle2D)
414
         */
415
        public boolean intersects(Rectangle2D r) {
416
                for (int i = 0; i < getPrimitivesNumber(); i++) {
417
                    
418
                    Geometry prim = this.getPrimitiveAt(i);
419
                    if (prim.intersects(r)) {
420
                        return true;
421
                    }
422
                }
423
                return false;
424
        }
425

    
426
        /*
427
         * (non-Javadoc)
428
         *
429
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#isSimple()
430
         */
431
        public boolean isSimple() {
432
                return false;
433
        }
434

    
435
        /*
436
         * (non-Javadoc)
437
         *
438
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#reProject(org.cresques.cts.ICoordTrans)
439
         */
440
        public void reProject(ICoordTrans ct) {
441
                for (int i = 0; i < getPrimitivesNumber(); i++) {
442
                        ((Geometry)geometries.get(i)).reProject(ct);
443
                }
444
        }
445

    
446
        /*
447
         * (non-Javadoc)
448
         *
449
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#transform(java.awt.geom.AffineTransform)
450
         */
451
        public void transform(AffineTransform at) {
452
                for (int i = 0; i < getPrimitivesNumber(); i++) {
453
                        ((Geometry)geometries.get(i)).transform(at);
454
                }
455
        }
456

    
457
        /*
458
         * (non-Javadoc)
459
         *
460
         * @see org.gvsig.geometries.iso.GM_Object#getBoundary()
461
         */
462
        public Envelope getEnvelope() {
463
                Envelope r = null;
464
                if (getPrimitivesNumber() > 0) {
465
                        r = ((Geometry)geometries.get(0)).getEnvelope();
466
                }
467
                for (int i = 1; i < getPrimitivesNumber(); i++) {
468
                        Envelope r2 = ((Geometry)geometries.get(i)).getEnvelope();
469
                        r.add(r2);
470
                }
471
                return r;
472
        }
473

    
474
        /**
475
         * @return the geometries
476
         * @deprecated
477
         */
478
        public Geometry[] getGeometries() {
479
                Geometry[] _geometries = new Geometry[geometries.size()];
480
                for (int i=0 ; i<geometries.size() ; i++){
481
                        _geometries[i] = ((Geometry)geometries.get(i));
482
                }
483
                return _geometries;
484
        }
485

    
486
        public FShape cloneFShape() {
487
                // TODO Auto-generated method stub
488
                return null;
489
        }
490

    
491
        public Handler[] getSelectHandlers() {
492
                // TODO Auto-generated method stub
493
                return null;
494
        }
495

    
496
        public Handler[] getStretchingHandlers() {
497
                // TODO Auto-generated method stub
498
                return null;
499
        }
500

    
501
        public GeneralPathX getGeneralPath() {
502
                // TODO Auto-generated method stub
503
                return null;
504
        }
505

    
506

    
507
        /* (non-Javadoc)
508
         * @see org.gvsig.fmap.geom.aggregate.MultiPrimitive#addPrimitive(org.gvsig.fmap.geom.primitive.Primitive)
509
         */
510
        public void addPrimitive(Primitive primitive) {
511
                geometries.add(primitive);
512
        }
513
        
514

    
515

    
516

    
517

    
518
}