Statistics
| Revision:

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

History | View | Annotate | Download (11 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.aggregate.MultiPrimitive;
15
import org.gvsig.fmap.geom.handler.Handler;
16
import org.gvsig.fmap.geom.primitive.Envelope;
17
import org.gvsig.fmap.geom.primitive.FShape;
18
import org.gvsig.fmap.geom.primitive.GeneralPathX;
19
import org.gvsig.fmap.geom.primitive.Primitive;
20
import org.gvsig.fmap.geom.primitive.impl.AbstractPrimitive;
21
import org.gvsig.fmap.geom.type.GeometryType;
22

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

    
95
        BaseMultiPrimitive(GeometryType geometryType, String id, IProjection projection,
96
                        Geometry[] geometries) {
97
                super(geometryType, id, projection);
98
                this.geometries = new ArrayList();
99
                for (int i=0 ; i<geometries.length ; i++){
100
                        this.geometries.add(geometries[i]);
101
                }
102
        }        
103
        
104
        BaseMultiPrimitive(GeometryType geometryType, String id, IProjection projection) {
105
                super(geometryType, id, projection);
106
                this.geometries = new ArrayList();                
107
        }        
108

    
109
        /*
110
         * (non-Javadoc)
111
         *
112
         * @see java.awt.Shape#contains(double, double)
113
         */
114
        public boolean contains(double x, double y) {
115
                boolean bResul;
116
                for (int i = 0; i < getPrimitivesNumber(); i++) {
117
                        bResul = ((Geometry)geometries.get(i)).contains(x, y);
118
                        if (bResul)
119
                                return true;
120
                }
121
                return false;
122
        }
123

    
124
        /*
125
         * (non-Javadoc)
126
         *
127
         * @see java.awt.Shape#contains(double, double, double, double)
128
         */
129
        public boolean contains(double x, double y, double w, double h) {
130
                return false;
131
        }
132

    
133
        /*
134
         * (non-Javadoc)
135
         *
136
         * @see java.awt.Shape#contains(java.awt.geom.Point2D)
137
         */
138
        public boolean contains(Point2D p) {
139
                boolean bResul;
140
                for (int i = 0; i < getPrimitivesNumber(); i++) {
141
                        bResul = ((Geometry)geometries.get(i)).contains(p);
142
                        if (bResul)
143
                                return true;
144
                }
145
                return false;
146
        }
147

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

    
163
        /*
164
         * (non-Javadoc)
165
         *
166
         * @see org.gvsig.geometries.iso.GM_Object#coordinateDimension()
167
         */
168
        public int getDimension() {
169
                return 2;
170
        }
171

    
172
        /*
173
         * (non-Javadoc)
174
         *
175
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#fastIntersects(double,
176
         *      double, double, double)
177
         */
178
        public boolean fastIntersects(double x, double y, double w, double h) {
179
                for (int i = 0; i < getPrimitivesNumber(); i++) {
180
                        if (((Geometry)geometries.get(i)).intersects(x, y, w, h))
181
                                return true;
182
                }
183
                return false;
184
        }
185

    
186
        /*
187
         * (non-Javadoc)
188
         *
189
         * @see java.awt.Shape#getBounds()
190
         */
191
        public Rectangle getBounds() {
192
                Rectangle r = null;
193
                if (getPrimitivesNumber() > 0) {
194
                        r = ((Geometry)geometries.get(0)).getBounds();
195
                }
196
                for (int i = 1; i < getPrimitivesNumber(); i++) {
197
                        Rectangle r2 = ((Geometry)geometries.get(i)).getBounds();
198
                        r.add(r2);
199
                }
200
                return r;
201
        }
202

    
203
        /*
204
         * (non-Javadoc)
205
         *
206
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#getBounds2D()
207
         */
208
        public Rectangle2D getBounds2D() {
209
                return null;
210
        }
211

    
212
        public Handler[] getHandlers(int type) {
213
                int numPrimitives = getPrimitivesNumber();
214
                Handler[] handlers = new Handler[numPrimitives];
215
                for (int i = 0; i < numPrimitives; i++) {
216
                        handlers[i] = ((Geometry)geometries.get(i)).getHandlers(type)[0];
217
                }
218
                return handlers;
219
        }
220

    
221
        /*
222
         * (non-Javadoc)
223
         *
224
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#getInternalShape()
225
         */
226
        public Shape getInternalShape() {
227
                return this;
228
        }
229

    
230
        /*
231
         * (non-Javadoc)
232
         *
233
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#getPathIterator(java.awt.geom.AffineTransform)
234
         */
235
        public PathIterator getPathIterator(AffineTransform at) {
236
                GeneralPathX gpx = new GeneralPathX();
237
                int primiNum = getPrimitivesNumber();
238
                if (primiNum > 0) {
239
                        Point2D p = ((Geometry)geometries.get(0)).getHandlers(Geometry.SELECTHANDLER)[0]
240
                                                                                                      .getPoint();
241
                        gpx.moveTo(p.getX(), p.getY());
242

    
243
                        for (int i = 1; i < primiNum; i++) {
244
                                p = ((Geometry)geometries.get(i)).getHandlers(Geometry.SELECTHANDLER)[0]
245
                                                                                                              .getPoint();
246
                                gpx.lineTo(p.getX(), p.getY());
247
                        }
248
                        Point2D p2 = ((Geometry)geometries.get(primiNum-1)).getHandlers(Geometry.SELECTHANDLER)[((Geometry)geometries.get(primiNum-1)).getHandlers(Geometry.SELECTHANDLER).length-1]
249
                                                                                                                .getPoint();
250
                        gpx.lineTo(p2.getX(), p2.getY());
251
                }
252
                return gpx.getPathIterator(at);
253
        }
254

    
255
        /*
256
         * (non-Javadoc)
257
         *
258
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#getPathIterator(java.awt.geom.AffineTransform,
259
         *      double)
260
         */
261
        public PathIterator getPathIterator(AffineTransform at, double flatness) {
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, flatness);
279
        }
280

    
281
        /*
282
         * (non-Javadoc)
283
         *
284
         * @see org.gvsig.geometries.iso.aggregate.GM_Aggregate#getPrimitiveAt(int)
285
         */
286
        public Primitive getPrimitiveAt(int i) {
287
                if (i < getPrimitivesNumber()) {
288
                        return (Primitive) ((Geometry)geometries.get(i));
289
                }
290
                return null;
291
        }
292

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

    
305
        /*
306
         * (non-Javadoc)
307
         *
308
         * @see java.awt.Shape#intersects(double, double, double, double)
309
         */
310
        public boolean intersects(double x, double y, double w, double h) {
311
                boolean bResul;
312
                for (int i = 0; i < getPrimitivesNumber(); i++) {
313
                        bResul = ((Geometry)geometries.get(i)).contains(x, y, w, h);
314
                        if (bResul)
315
                                return true;
316
                }
317
                return false;
318
        }
319

    
320
        /*
321
         * (non-Javadoc)
322
         *
323
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#intersects(java.awt.geom.Rectangle2D)
324
         */
325
        public boolean intersects(Rectangle2D r) {
326
                for (int i = 0; i < getPrimitivesNumber(); i++) {
327
                        Point2D p = ((Geometry)geometries.get(i)).getHandlers(Geometry.SELECTHANDLER)[0]
328
                                        .getPoint();
329
                        if (r.contains(p.getX(), p.getY()))
330
                                return true;
331
                }
332
                return false;
333
        }
334

    
335
        /*
336
         * (non-Javadoc)
337
         *
338
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#isSimple()
339
         */
340
        public boolean isSimple() {
341
                return false;
342
        }
343

    
344
        /*
345
         * (non-Javadoc)
346
         *
347
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#reProject(org.cresques.cts.ICoordTrans)
348
         */
349
        public void reProject(ICoordTrans ct) {
350
                for (int i = 0; i < getPrimitivesNumber(); i++) {
351
                        ((Geometry)geometries.get(i)).reProject(ct);
352
                }
353
        }
354

    
355
        /*
356
         * (non-Javadoc)
357
         *
358
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#transform(java.awt.geom.AffineTransform)
359
         */
360
        public void transform(AffineTransform at) {
361
                for (int i = 0; i < getPrimitivesNumber(); i++) {
362
                        ((Geometry)geometries.get(i)).transform(at);
363
                }
364
        }
365

    
366
        /*
367
         * (non-Javadoc)
368
         *
369
         * @see org.gvsig.geometries.iso.GM_Object#getBoundary()
370
         */
371
        public Envelope getEnvelope() {
372
                Envelope r = null;
373
                if (getPrimitivesNumber() > 0) {
374
                        r = ((Geometry)geometries.get(0)).getEnvelope();
375
                }
376
                for (int i = 1; i < getPrimitivesNumber(); i++) {
377
                        Envelope r2 = ((Geometry)geometries.get(i)).getEnvelope();
378
                        r.add(r2);
379
                }
380
                return r;
381
        }
382

    
383
        /**
384
         * @return the geometries
385
         * @deprecated
386
         */
387
        public Geometry[] getGeometries() {
388
                Geometry[] _geometries = new Geometry[geometries.size()];
389
                for (int i=0 ; i<geometries.size() ; i++){
390
                        _geometries[i] = ((Geometry)geometries.get(i));
391
                }
392
                return _geometries;
393
        }
394

    
395
        public FShape cloneFShape() {
396
                // TODO Auto-generated method stub
397
                return null;
398
        }
399

    
400
        public Handler[] getSelectHandlers() {
401
                // TODO Auto-generated method stub
402
                return null;
403
        }
404

    
405
        public Handler[] getStretchingHandlers() {
406
                // TODO Auto-generated method stub
407
                return null;
408
        }
409

    
410
        public GeneralPathX getGeneralPath() {
411
                // TODO Auto-generated method stub
412
                return null;
413
        }
414

    
415

    
416
        /* (non-Javadoc)
417
         * @see org.gvsig.fmap.geom.aggregate.MultiPrimitive#addPrimitive(org.gvsig.fmap.geom.primitive.Primitive)
418
         */
419
        public void addPrimitive(Primitive primitive) {
420
                geometries.add(primitive);
421
        }
422
}