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

History | View | Annotate | Download (11.6 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
/**
53
 * @author Jorge Piera Llodr? (jorge.piera@iver.es)
54
 */
55
public abstract class BaseMultiPrimitive extends AbstractPrimitive implements
56
                MultiPrimitive {
57
        private static final long serialVersionUID = 8023609161647736932L;
58
        
59
        private static final Logger logger = LoggerFactory.getLogger(GeometryManager.class);
60

    
61
        protected ArrayList geometries = null;
62
        
63
        /**
64
         * The constructor with the GeometryType like and argument 
65
         * is used by the {@link GeometryType}{@link #create()}
66
         * to create the geometry
67
         * @param type
68
         * The geometry type
69
         */
70
        public BaseMultiPrimitive(GeometryType geometryType) {
71
                super(geometryType);
72
                geometries = new ArrayList();
73
        }
74

    
75
        BaseMultiPrimitive(GeometryType geometryType, String id, IProjection projection,
76
                        Geometry[] geometries) {
77
                super(geometryType, id, projection);
78
                this.geometries = new ArrayList();
79
                for (int i=0 ; i<geometries.length ; i++){
80
                        this.geometries.add(geometries[i]);
81
                }
82
        }        
83
        
84
        BaseMultiPrimitive(GeometryType geometryType, String id, IProjection projection) {
85
                super(geometryType, id, projection);
86
                this.geometries = new ArrayList();                
87
        }        
88

    
89
        /*
90
         * (non-Javadoc)
91
         *
92
         * @see java.awt.Shape#contains(double, double)
93
         */
94
        public boolean contains(double x, double y) {
95
                
96
                boolean bResul;
97
                for (int i = 0; i < getPrimitivesNumber(); i++) {
98

    
99
                        try {
100
                                bResul = containsPoint(
101
                                                (Geometry)geometries.get(i), x, y);
102
                        } catch (GeometryOperationException e) {
103
                                logger.error("While doing contains: " + e.getMessage(), e);
104
                                bResul = true;
105
                        }
106

    
107
                        if (bResul)
108
                                return true;
109
                }
110
                return false;
111
        }
112

    
113
        /*
114
         * (non-Javadoc)
115
         *
116
         * @see java.awt.Shape#contains(double, double, double, double)
117
         */
118
        public boolean contains(double x, double y, double w, double h) {
119
                return false;
120
        }
121

    
122
        /*
123
         * (non-Javadoc)
124
         *
125
         * @see java.awt.Shape#contains(java.awt.geom.Point2D)
126
         */
127
        public boolean contains(Point2D p) {
128
                boolean bResul;
129
                for (int i = 0; i < getPrimitivesNumber(); i++) {
130
                        try {
131
                                bResul = containsPoint(
132
                                                (Geometry)geometries.get(i),
133
                                                p.getX(), p.getY());
134
                        } catch (GeometryOperationException e) {
135
                                logger.error("While doing contains: " + e.getMessage(), e);
136
                                bResul = true;
137
                        }
138
                        if (bResul)
139
                                return true;
140
                }
141
                return false;
142
        }
143

    
144
        /*
145
         * (non-Javadoc)
146
         *
147
         * @see java.awt.Shape#contains(java.awt.geom.Rectangle2D)
148
         */
149
        public boolean contains(Rectangle2D r) {
150
                boolean bResul;
151
                for (int i = 0; i < getPrimitivesNumber(); i++) {
152
                        
153
                        try {
154
                                bResul = containsRectangle(
155
                                                (Geometry)geometries.get(i),
156
                                                r.getMinX(), r.getMinY(), r.getWidth(), r.getHeight());
157
                        } catch (GeometryOperationException e) {
158
                                logger.error("While doing contains: " + e.getMessage(), e);
159
                                bResul = true;
160
                        }
161
                        
162
                        
163
                        if (bResul)
164
                                return true;
165
                }
166
                return false;
167
        }
168

    
169
        /*
170
         * (non-Javadoc)
171
         *
172
         * @see org.gvsig.geometries.iso.GM_Object#coordinateDimension()
173
         */
174
        public int getDimension() {
175
                return 2;
176
        }
177

    
178
        /*
179
         * (non-Javadoc)
180
         *
181
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#fastIntersects(double,
182
         *      double, double, double)
183
         */
184
        public boolean fastIntersects(double x, double y, double w, double h) {
185
                
186
                boolean resp = false;
187
                for (int i = 0; i < getPrimitivesNumber(); i++) {
188
                        
189
                        Geometry geom = (Geometry) geometries.get(i);
190
                        
191
                        try {
192
                                resp = intersectsRectangle(geom, x, y, w, h);
193
                        } catch (GeometryOperationException e) {
194
                                logger.error("While doing fast intersects: " + e.getMessage(), e);
195
                                resp = true;
196
                        }
197
                        
198
                        if (resp) {
199
                                return true;
200
                        }
201
                        
202
                                
203
                                
204
                }
205
                return false;
206
        }
207

    
208

    
209
        /*
210
         * (non-Javadoc)
211
         *
212
         * @see java.awt.Shape#getBounds()
213
         */
214
        public Rectangle getBounds() {
215
                Rectangle r = null;
216
                if (getPrimitivesNumber() > 0) {
217
                        r = ((Geometry)geometries.get(0)).getShape().getBounds();
218
                }
219
                for (int i = 1; i < getPrimitivesNumber(); i++) {
220
                        Rectangle r2 = ((Geometry)geometries.get(i)).getShape().getBounds();
221
                        r.add(r2);
222
                }
223
                return r;
224
        }
225

    
226
        /*
227
         * (non-Javadoc)
228
         *
229
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#getBounds2D()
230
         */
231
        public Rectangle2D getBounds2D() {
232
                return null;
233
        }
234

    
235
        public Handler[] getHandlers(int type) {
236
                int numPrimitives = getPrimitivesNumber();
237
                List handlers = new ArrayList();
238
                for (int i = 0; i < numPrimitives; i++) {
239
                    Handler[] currentHandlers = getPrimitiveAt(i).getHandlers(type);
240
                    for (int j=0 ; j<currentHandlers.length ; j++){
241
                        handlers.add(currentHandlers[j]);
242
                    }
243
                }
244
                return (Handler[])handlers.toArray(new Handler[handlers.size()]);
245
        }
246

    
247
        /*
248
         * (non-Javadoc)
249
         *
250
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#getInternalShape()
251
         */
252
        public Shape getInternalShape() {
253
                return this;
254
        }
255

    
256
        /*
257
         * (non-Javadoc)
258
         *
259
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#getPathIterator(java.awt.geom.AffineTransform)
260
         */
261
        public PathIterator getPathIterator(AffineTransform at) {
262
                GeneralPathX gpx = new GeneralPathX();
263
                int primiNum = getPrimitivesNumber();
264
                if (primiNum > 0) {
265
                        Point2D p = ((Geometry)geometries.get(0)).getHandlers(Geometry.SELECTHANDLER)[0]
266
                                                                                                      .getPoint();
267
                        gpx.moveTo(p.getX(), p.getY());
268

    
269
                        for (int i = 1; i < primiNum; i++) {
270
                                p = ((Geometry)geometries.get(i)).getHandlers(Geometry.SELECTHANDLER)[0]
271
                                                                                                              .getPoint();
272
                                gpx.lineTo(p.getX(), p.getY());
273
                        }
274
                        Point2D p2 = ((Geometry)geometries.get(primiNum-1)).getHandlers(Geometry.SELECTHANDLER)[((Geometry)geometries.get(primiNum-1)).getHandlers(Geometry.SELECTHANDLER).length-1]
275
                                                                                                                .getPoint();
276
                        gpx.lineTo(p2.getX(), p2.getY());
277
                }
278
                return gpx.getPathIterator(at);
279
        }
280

    
281
        /*
282
         * (non-Javadoc)
283
         *
284
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#getPathIterator(java.awt.geom.AffineTransform,
285
         *      double)
286
         */
287
        public PathIterator getPathIterator(AffineTransform at, double flatness) {
288
                GeneralPathX gpx = new GeneralPathX();
289
                int primiNum = getPrimitivesNumber();
290
                if (primiNum > 0) {
291

    
292
                    Geometry prim = null;
293
                        for (int i = 0; i < primiNum; i++) {
294
                            prim = (Geometry) geometries.get(i);
295
                            gpx.append(
296
                                prim.getPathIterator(at, flatness),
297
                                /*
298
                                 * This is a relevant change.
299
                                 * After BN 2056 this class will not return
300
                                 * connected path iterator. There will be MOVE_TO
301
                                 * between iterator of each primitive
302
                                 */
303
                                false);
304
                        }
305
                }
306
                /*
307
                 * affine transform and flatness already applied in loop
308
                 */
309
                return gpx.getPathIterator(null);
310
        }
311

    
312
        /*
313
         * (non-Javadoc)
314
         *
315
         * @see org.gvsig.geometries.iso.aggregate.GM_Aggregate#getPrimitiveAt(int)
316
         */
317
        public Primitive getPrimitiveAt(int i) {
318
                if (i < getPrimitivesNumber()) {
319
                        return (Primitive) ((Geometry)geometries.get(i));
320
                }
321
                return null;
322
        }
323

    
324
        /*
325
         * (non-Javadoc)
326
         *
327
         * @see org.gvsig.geometries.iso.aggregate.GM_Aggregate#getPrimitivesNumber()
328
         */
329
        public int getPrimitivesNumber() {
330
                if (geometries == null) {
331
                        return 0;
332
                }
333
                return geometries.size();
334
        }
335

    
336
        /*
337
         * (non-Javadoc)
338
         *
339
         * @see java.awt.Shape#intersects(double, double, double, double)
340
         */
341
        public boolean intersects(double x, double y, double w, double h) {
342
                boolean bResul;
343
                for (int i = 0; i < getPrimitivesNumber(); i++) {
344

    
345
                        try {
346
                                bResul = containsRectangle((Geometry)geometries.get(i), x, y, w, h);
347
                        } catch (GeometryOperationException e) {
348
                                logger.error("While doing contains: " + e.getMessage(), e);
349
                                bResul = true;
350
                        }
351
                        if (bResul)
352
                                return true;
353
                }
354
                return false;
355
        }
356

    
357

    
358
        /*
359
         * (non-Javadoc)
360
         *
361
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#intersects(java.awt.geom.Rectangle2D)
362
         */
363
        public boolean intersects(Rectangle2D r) {
364
                for (int i = 0; i < getPrimitivesNumber(); i++) {
365
                    
366
                    Geometry prim = this.getPrimitiveAt(i);
367
                    if (prim.intersects(r)) {
368
                        return true;
369
                    }
370
                }
371
                return false;
372
        }
373

    
374
        /*
375
         * (non-Javadoc)
376
         *
377
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#isSimple()
378
         */
379
        public boolean isSimple() {
380
                return false;
381
        }
382

    
383
        /*
384
         * (non-Javadoc)
385
         *
386
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#reProject(org.cresques.cts.ICoordTrans)
387
         */
388
        public void reProject(ICoordTrans ct) {
389
                for (int i = 0; i < getPrimitivesNumber(); i++) {
390
                        ((Geometry)geometries.get(i)).reProject(ct);
391
                }
392
        }
393

    
394
        /*
395
         * (non-Javadoc)
396
         *
397
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#transform(java.awt.geom.AffineTransform)
398
         */
399
        public void transform(AffineTransform at) {
400
                for (int i = 0; i < getPrimitivesNumber(); i++) {
401
                        ((Geometry)geometries.get(i)).transform(at);
402
                }
403
        }
404

    
405
        /*
406
         * (non-Javadoc)
407
         *
408
         * @see org.gvsig.geometries.iso.GM_Object#getBoundary()
409
         */
410
        public Envelope getEnvelope() {
411
                Envelope r = null;
412
                if (getPrimitivesNumber() > 0) {
413
                        r = ((Geometry)geometries.get(0)).getEnvelope();
414
                }
415
                for (int i = 1; i < getPrimitivesNumber(); i++) {
416
                        Envelope r2 = ((Geometry)geometries.get(i)).getEnvelope();
417
                        r.add(r2);
418
                }
419
                return r;
420
        }
421

    
422
        /**
423
         * @return the geometries
424
         * @deprecated
425
         */
426
        public Geometry[] getGeometries() {
427
                Geometry[] _geometries = new Geometry[geometries.size()];
428
                for (int i=0 ; i<geometries.size() ; i++){
429
                        _geometries[i] = ((Geometry)geometries.get(i));
430
                }
431
                return _geometries;
432
        }
433

    
434
        public FShape cloneFShape() {
435
                // TODO Auto-generated method stub
436
                return null;
437
        }
438

    
439
        public Handler[] getSelectHandlers() {
440
                // TODO Auto-generated method stub
441
                return null;
442
        }
443

    
444
        public Handler[] getStretchingHandlers() {
445
                // TODO Auto-generated method stub
446
                return null;
447
        }
448

    
449
        public GeneralPathX getGeneralPath() {
450
                // TODO Auto-generated method stub
451
                return null;
452
        }
453

    
454

    
455
        /* (non-Javadoc)
456
         * @see org.gvsig.fmap.geom.aggregate.MultiPrimitive#addPrimitive(org.gvsig.fmap.geom.primitive.Primitive)
457
         */
458
        public void addPrimitive(Primitive primitive) {
459
                geometries.add(primitive);
460
        }
461
        
462

    
463

    
464

    
465

    
466
}