Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libFMap_geometries / src / org / gvsig / fmap / geom / aggregate / BaseMultiPrimitive.java @ 26866

History | View | Annotate | Download (10.6 KB)

1
package org.gvsig.fmap.geom.aggregate;
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.GeometryLocator;
15
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
16
import org.gvsig.fmap.geom.handler.Handler;
17
import org.gvsig.fmap.geom.primitive.AbstractPrimitive;
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.GeneralPathXIterator;
22
import org.gvsig.fmap.geom.primitive.Primitive;
23
import org.gvsig.fmap.geom.type.GeometryType;
24

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

    
85
        /**
86
         * Constructor without arguments. It is necessary to create
87
         * geometries using the {@link GeometryType}{@link #create()}
88
         * method
89
         */
90
        public BaseMultiPrimitive() {
91
                super();        
92
                geometries = new ArrayList();
93
        }
94
        
95
        
96
        public BaseMultiPrimitive(String id, IProjection projection,
97
                        Geometry[] geometries) {
98
                super(id, projection);
99
                this.geometries = new ArrayList();
100
                for (int i=0 ; i<geometries.length ; i++){
101
                        this.geometries.add(geometries[i]);
102
                }
103
        }
104

    
105
        public BaseMultiPrimitive(IProjection projection) {
106
                this(null, projection, null);
107
        }
108

    
109
        public BaseMultiPrimitive(IProjection projection, Geometry[] geometries) {
110
                this(null, projection, geometries);
111
        }
112

    
113
        public BaseMultiPrimitive(Geometry[] geometries) {
114
                this(null, null, geometries);
115
        }
116

    
117
        public BaseMultiPrimitive(String id, IProjection projection) {
118
                this(id, projection, null);
119
        }
120

    
121

    
122
        /*
123
         * (non-Javadoc)
124
         *
125
         * @see java.awt.Shape#contains(double, double)
126
         */
127
        public boolean contains(double x, double y) {
128
                boolean bResul;
129
                for (int i = 0; i < getPrimitivesNumber(); i++) {
130
                        bResul = ((Geometry)geometries.get(i)).contains(x, y);
131
                        if (bResul)
132
                                return true;
133
                }
134
                return false;
135
        }
136

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

    
146
        /*
147
         * (non-Javadoc)
148
         *
149
         * @see java.awt.Shape#contains(java.awt.geom.Point2D)
150
         */
151
        public boolean contains(Point2D p) {
152
                boolean bResul;
153
                for (int i = 0; i < getPrimitivesNumber(); i++) {
154
                        bResul = ((Geometry)geometries.get(i)).contains(p);
155
                        if (bResul)
156
                                return true;
157
                }
158
                return false;
159
        }
160

    
161
        /*
162
         * (non-Javadoc)
163
         *
164
         * @see java.awt.Shape#contains(java.awt.geom.Rectangle2D)
165
         */
166
        public boolean contains(Rectangle2D r) {
167
                boolean bResul;
168
                for (int i = 0; i < getPrimitivesNumber(); i++) {
169
                        bResul = ((Geometry)geometries.get(i)).contains(r);
170
                        if (bResul)
171
                                return true;
172
                }
173
                return false;
174
        }
175

    
176
        /*
177
         * (non-Javadoc)
178
         *
179
         * @see org.gvsig.geometries.iso.GM_Object#coordinateDimension()
180
         */
181
        public int getDimension() {
182
                return 2;
183
        }
184

    
185
        /*
186
         * (non-Javadoc)
187
         *
188
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#fastIntersects(double,
189
         *      double, double, double)
190
         */
191
        public boolean fastIntersects(double x, double y, double w, double h) {
192
                for (int i = 0; i < getPrimitivesNumber(); i++) {
193
                        if (((Geometry)geometries.get(i)).intersects(x, y, w, h))
194
                                return true;
195
                }
196
                return false;
197
        }
198

    
199
        /*
200
         * (non-Javadoc)
201
         *
202
         * @see java.awt.Shape#getBounds()
203
         */
204
        public Rectangle getBounds() {
205
                Rectangle r = null;
206
                if (getPrimitivesNumber() > 0) {
207
                        r = ((Geometry)geometries.get(0)).getBounds();
208
                }
209
                for (int i = 1; i < getPrimitivesNumber(); i++) {
210
                        Rectangle r2 = ((Geometry)geometries.get(i)).getBounds();
211
                        r.add(r2);
212
                }
213
                return r;
214
        }
215

    
216
        /*
217
         * (non-Javadoc)
218
         *
219
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#getBounds2D()
220
         */
221
        public Rectangle2D getBounds2D() {
222
                return null;
223
        }
224

    
225
        public int getShapeType() {
226
                return FShape.MULTI;
227
        }
228

    
229
        public Handler[] getHandlers(int type) {
230
                int numPrimitives = getPrimitivesNumber();
231
                Handler[] handlers = new Handler[numPrimitives];
232
                for (int i = 0; i < numPrimitives; i++) {
233
                        handlers[i] = ((Geometry)geometries.get(i)).getHandlers(type)[0];
234
                }
235
                return handlers;
236
        }
237

    
238
        /*
239
         * (non-Javadoc)
240
         *
241
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#getInternalShape()
242
         */
243
        public Shape getInternalShape() {
244
                return this;
245
        }
246

    
247
        /*
248
         * (non-Javadoc)
249
         *
250
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#getPathIterator(java.awt.geom.AffineTransform)
251
         */
252
        public PathIterator getPathIterator(AffineTransform at) {
253
                GeneralPathX gpx = new GeneralPathX();
254
                if (getPrimitivesNumber() > 0) {
255
                        Point2D p = ((Geometry)geometries.get(0)).getHandlers(Geometry.SELECTHANDLER)[0]
256
                                        .getPoint();
257
                        gpx.moveTo(p.getX(), p.getY());
258
                }
259
                for (int i = 1; i < getPrimitivesNumber(); i++) {
260
                        Point2D p = ((Geometry)geometries.get(i)).getHandlers(Geometry.SELECTHANDLER)[0]
261
                                        .getPoint();
262
                        gpx.lineTo(p.getX(), p.getY());
263
                }
264
                return (GeneralPathXIterator) gpx.getPathIterator(null);
265
        }
266

    
267
        /*
268
         * (non-Javadoc)
269
         *
270
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#getPathIterator(java.awt.geom.AffineTransform,
271
         *      double)
272
         */
273
        public PathIterator getPathIterator(AffineTransform at, double flatness) {
274
                GeneralPathX gpx = new GeneralPathX();
275
                int primiNum = getPrimitivesNumber();
276
                if (primiNum > 0) {
277
                        Point2D p = ((Geometry)geometries.get(0)).getHandlers(Geometry.SELECTHANDLER)[0]
278
                                        .getPoint();
279
                        gpx.moveTo(p.getX(), p.getY());
280
                }
281
                for (int i = 1; i < primiNum; i++) {
282
                        Point2D p = ((Geometry)geometries.get(i)).getHandlers(Geometry.SELECTHANDLER)[0]
283
                                        .getPoint();
284
                        gpx.lineTo(p.getX(), p.getY());
285
                }
286
                Point2D p2 = ((Geometry)geometries.get(primiNum-1)).getHandlers(Geometry.SELECTHANDLER)[((Geometry)geometries.get(primiNum-1)).getHandlers(Geometry.SELECTHANDLER).length-1]
287
                             .getPoint();
288
                gpx.lineTo(p2.getX(), p2.getY());
289

    
290
                return gpx.getPathIterator(at, flatness);
291
        }
292

    
293
        /*
294
         * (non-Javadoc)
295
         *
296
         * @see org.gvsig.geometries.iso.aggregate.GM_Aggregate#getPrimitiveAt(int)
297
         */
298
        public Primitive getPrimitiveAt(int i) {
299
                if (i < getPrimitivesNumber()) {
300
                        return (Primitive) ((Geometry)geometries.get(i));
301
                }
302
                return null;
303
        }
304

    
305
        /*
306
         * (non-Javadoc)
307
         *
308
         * @see org.gvsig.geometries.iso.aggregate.GM_Aggregate#getPrimitivesNumber()
309
         */
310
        public int getPrimitivesNumber() {
311
                if (geometries == null) {
312
                        return 0;
313
                }
314
                return geometries.size();
315
        }
316

    
317
        /*
318
         * (non-Javadoc)
319
         *
320
         * @see java.awt.Shape#intersects(double, double, double, double)
321
         */
322
        public boolean intersects(double x, double y, double w, double h) {
323
                boolean bResul;
324
                for (int i = 0; i < getPrimitivesNumber(); i++) {
325
                        bResul = ((Geometry)geometries.get(i)).contains(x, y, w, h);
326
                        if (bResul)
327
                                return true;
328
                }
329
                return false;
330
        }
331

    
332
        /*
333
         * (non-Javadoc)
334
         *
335
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#intersects(java.awt.geom.Rectangle2D)
336
         */
337
        public boolean intersects(Rectangle2D r) {
338
                for (int i = 0; i < getPrimitivesNumber(); i++) {
339
                        Point2D p = ((Geometry)geometries.get(i)).getHandlers(Geometry.SELECTHANDLER)[0]
340
                                        .getPoint();
341
                        if (r.contains(p.getX(), p.getY()))
342
                                return true;
343
                }
344
                return false;
345
        }
346

    
347
        /*
348
         * (non-Javadoc)
349
         *
350
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#isSimple()
351
         */
352
        public boolean isSimple() {
353
                return false;
354
        }
355

    
356
        /*
357
         * (non-Javadoc)
358
         *
359
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#reProject(org.cresques.cts.ICoordTrans)
360
         */
361
        public void reProject(ICoordTrans ct) {
362
                for (int i = 0; i < getPrimitivesNumber(); i++) {
363
                        ((Geometry)geometries.get(i)).reProject(ct);
364
                }
365
        }
366

    
367
        /*
368
         * (non-Javadoc)
369
         *
370
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#transform(java.awt.geom.AffineTransform)
371
         */
372
        public void transform(AffineTransform at) {
373
                for (int i = 0; i < getPrimitivesNumber(); i++) {
374
                        ((Geometry)geometries.get(i)).transform(at);
375
                }
376
        }
377

    
378
        /*
379
         * (non-Javadoc)
380
         *
381
         * @see org.gvsig.geometries.iso.GM_Object#getBoundary()
382
         */
383
        public Envelope getEnvelope() {
384
                Envelope r = null;
385
                if (getPrimitivesNumber() > 0) {
386
                        r = ((Geometry)geometries.get(0)).getEnvelope();
387
                }
388
                for (int i = 1; i < getPrimitivesNumber(); i++) {
389
                        Envelope r2 = ((Geometry)geometries.get(i)).getEnvelope();
390
                        r.add(r2);
391
                }
392
                return r;
393
        }
394

    
395
        /**
396
         * @return the geometries
397
         * @deprecated
398
         */
399
        public Geometry[] getGeometries() {
400
                Geometry[] _geometries = new Geometry[geometries.size()];
401
                for (int i=0 ; i<geometries.size() ; i++){
402
                        _geometries[i] = ((Geometry)geometries.get(i));
403
                }
404
                return _geometries;
405
        }
406

    
407
        public FShape cloneFShape() {
408
                // TODO Auto-generated method stub
409
                return null;
410
        }
411

    
412
        public Handler[] getSelectHandlers() {
413
                // TODO Auto-generated method stub
414
                return null;
415
        }
416

    
417
        public Handler[] getStretchingHandlers() {
418
                // TODO Auto-generated method stub
419
                return null;
420
        }
421

    
422
        public int getType() {
423
                return CODE;
424
        }
425

    
426
        public GeneralPathX getGeneralPath() {
427
                // TODO Auto-generated method stub
428
                return null;
429
        }
430

    
431

    
432
        /* (non-Javadoc)
433
         * @see org.gvsig.fmap.geom.aggregate.MultiPrimitive#addPrimitive(org.gvsig.fmap.geom.primitive.Primitive)
434
         */
435
        public void addPrimitive(Primitive primitive) {
436
                geometries.add(primitive);                
437
        }
438
}