Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libFMap_geometries / src / org / gvsig / fmap / geom / aggregate / impl / BaseMultiPrimitive.java @ 37493

History | View | Annotate | Download (12.4 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
                        Point2D p = ((Geometry)geometries.get(0)).getHandlers(Geometry.SELECTHANDLER)[0]
321
                                                                                                      .getPoint();
322
                        gpx.moveTo(p.getX(), p.getY());
323

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

    
336
        /*
337
         * (non-Javadoc)
338
         *
339
         * @see org.gvsig.geometries.iso.aggregate.GM_Aggregate#getPrimitiveAt(int)
340
         */
341
        public Primitive getPrimitiveAt(int i) {
342
                if (i < getPrimitivesNumber()) {
343
                        return (Primitive) ((Geometry)geometries.get(i));
344
                }
345
                return null;
346
        }
347

    
348
        /*
349
         * (non-Javadoc)
350
         *
351
         * @see org.gvsig.geometries.iso.aggregate.GM_Aggregate#getPrimitivesNumber()
352
         */
353
        public int getPrimitivesNumber() {
354
                if (geometries == null) {
355
                        return 0;
356
                }
357
                return geometries.size();
358
        }
359

    
360
        /*
361
         * (non-Javadoc)
362
         *
363
         * @see java.awt.Shape#intersects(double, double, double, double)
364
         */
365
        public boolean intersects(double x, double y, double w, double h) {
366
                boolean bResul;
367
                for (int i = 0; i < getPrimitivesNumber(); i++) {
368

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

    
381

    
382
        /*
383
         * (non-Javadoc)
384
         *
385
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#intersects(java.awt.geom.Rectangle2D)
386
         */
387
        public boolean intersects(Rectangle2D r) {
388
                for (int i = 0; i < getPrimitivesNumber(); i++) {
389
                        Point2D p = ((Geometry)geometries.get(i)).getHandlers(Geometry.SELECTHANDLER)[0]
390
                                        .getPoint();
391
                        if (r.contains(p.getX(), p.getY()))
392
                                return true;
393
                }
394
                return false;
395
        }
396

    
397
        /*
398
         * (non-Javadoc)
399
         *
400
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#isSimple()
401
         */
402
        public boolean isSimple() {
403
                return false;
404
        }
405

    
406
        /*
407
         * (non-Javadoc)
408
         *
409
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#reProject(org.cresques.cts.ICoordTrans)
410
         */
411
        public void reProject(ICoordTrans ct) {
412
                for (int i = 0; i < getPrimitivesNumber(); i++) {
413
                        ((Geometry)geometries.get(i)).reProject(ct);
414
                }
415
        }
416

    
417
        /*
418
         * (non-Javadoc)
419
         *
420
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#transform(java.awt.geom.AffineTransform)
421
         */
422
        public void transform(AffineTransform at) {
423
                for (int i = 0; i < getPrimitivesNumber(); i++) {
424
                        ((Geometry)geometries.get(i)).transform(at);
425
                }
426
        }
427

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

    
445
        /**
446
         * @return the geometries
447
         * @deprecated
448
         */
449
        public Geometry[] getGeometries() {
450
                Geometry[] _geometries = new Geometry[geometries.size()];
451
                for (int i=0 ; i<geometries.size() ; i++){
452
                        _geometries[i] = ((Geometry)geometries.get(i));
453
                }
454
                return _geometries;
455
        }
456

    
457
        public FShape cloneFShape() {
458
                // TODO Auto-generated method stub
459
                return null;
460
        }
461

    
462
        public Handler[] getSelectHandlers() {
463
                // TODO Auto-generated method stub
464
                return null;
465
        }
466

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

    
472
        public GeneralPathX getGeneralPath() {
473
                // TODO Auto-generated method stub
474
                return null;
475
        }
476

    
477

    
478
        /* (non-Javadoc)
479
         * @see org.gvsig.fmap.geom.aggregate.MultiPrimitive#addPrimitive(org.gvsig.fmap.geom.primitive.Primitive)
480
         */
481
        public void addPrimitive(Primitive primitive) {
482
                geometries.add(primitive);
483
        }
484
        
485

    
486

    
487

    
488

    
489
}