Statistics
| Revision:

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

History | View | Annotate | Download (12.2 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

    
11
import org.cresques.cts.ICoordTrans;
12
import org.cresques.cts.IProjection;
13
import org.gvsig.fmap.geom.Geometry;
14
import org.gvsig.fmap.geom.GeometryManager;
15
import org.gvsig.fmap.geom.aggregate.MultiPrimitive;
16
import org.gvsig.fmap.geom.handler.Handler;
17
import org.gvsig.fmap.geom.operation.GeometryOperationException;
18
import org.gvsig.fmap.geom.primitive.Envelope;
19
import org.gvsig.fmap.geom.primitive.FShape;
20
import org.gvsig.fmap.geom.primitive.GeneralPathX;
21
import org.gvsig.fmap.geom.primitive.Primitive;
22
import org.gvsig.fmap.geom.primitive.impl.AbstractPrimitive;
23
import org.gvsig.fmap.geom.type.GeometryType;
24
import org.slf4j.Logger;
25
import org.slf4j.LoggerFactory;
26

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

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

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

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

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

    
134
                        if (bResul)
135
                                return true;
136
                }
137
                return false;
138
        }
139

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

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

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

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

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

    
235

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

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

    
262
        public Handler[] getHandlers(int type) {
263
                int numPrimitives = getPrimitivesNumber();
264
                Handler[] handlers = new Handler[numPrimitives];
265
                for (int i = 0; i < numPrimitives; i++) {
266
                        handlers[i] = ((Geometry)geometries.get(i)).getHandlers(type)[0];
267
                }
268
                return handlers;
269
        }
270

    
271
        /*
272
         * (non-Javadoc)
273
         *
274
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#getInternalShape()
275
         */
276
        public Shape getInternalShape() {
277
                return this;
278
        }
279

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

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

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

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

    
331
        /*
332
         * (non-Javadoc)
333
         *
334
         * @see org.gvsig.geometries.iso.aggregate.GM_Aggregate#getPrimitiveAt(int)
335
         */
336
        public Primitive getPrimitiveAt(int i) {
337
                if (i < getPrimitivesNumber()) {
338
                        return (Primitive) ((Geometry)geometries.get(i));
339
                }
340
                return null;
341
        }
342

    
343
        /*
344
         * (non-Javadoc)
345
         *
346
         * @see org.gvsig.geometries.iso.aggregate.GM_Aggregate#getPrimitivesNumber()
347
         */
348
        public int getPrimitivesNumber() {
349
                if (geometries == null) {
350
                        return 0;
351
                }
352
                return geometries.size();
353
        }
354

    
355
        /*
356
         * (non-Javadoc)
357
         *
358
         * @see java.awt.Shape#intersects(double, double, double, double)
359
         */
360
        public boolean intersects(double x, double y, double w, double h) {
361
                boolean bResul;
362
                for (int i = 0; i < getPrimitivesNumber(); i++) {
363

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

    
376

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

    
392
        /*
393
         * (non-Javadoc)
394
         *
395
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#isSimple()
396
         */
397
        public boolean isSimple() {
398
                return false;
399
        }
400

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

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

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

    
440
        /**
441
         * @return the geometries
442
         * @deprecated
443
         */
444
        public Geometry[] getGeometries() {
445
                Geometry[] _geometries = new Geometry[geometries.size()];
446
                for (int i=0 ; i<geometries.size() ; i++){
447
                        _geometries[i] = ((Geometry)geometries.get(i));
448
                }
449
                return _geometries;
450
        }
451

    
452
        public FShape cloneFShape() {
453
                // TODO Auto-generated method stub
454
                return null;
455
        }
456

    
457
        public Handler[] getSelectHandlers() {
458
                // TODO Auto-generated method stub
459
                return null;
460
        }
461

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

    
467
        public GeneralPathX getGeneralPath() {
468
                // TODO Auto-generated method stub
469
                return null;
470
        }
471

    
472

    
473
        /* (non-Javadoc)
474
         * @see org.gvsig.fmap.geom.aggregate.MultiPrimitive#addPrimitive(org.gvsig.fmap.geom.primitive.Primitive)
475
         */
476
        public void addPrimitive(Primitive primitive) {
477
                geometries.add(primitive);
478
        }
479
        
480

    
481

    
482

    
483

    
484
}