Statistics
| Revision:

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

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

    
10
import org.cresques.cts.ICoordTrans;
11
import org.cresques.cts.IProjection;
12
import org.gvsig.fmap.geom.Geometry;
13
import org.gvsig.fmap.geom.GeometryManager;
14
import org.gvsig.fmap.geom.handler.Handler;
15
import org.gvsig.fmap.geom.primitive.AbstractPrimitive;
16
import org.gvsig.fmap.geom.primitive.Box;
17
import org.gvsig.fmap.geom.primitive.FShape;
18
import org.gvsig.fmap.geom.primitive.GeneralPathX;
19
import org.gvsig.fmap.geom.primitive.GeneralPathXIterator;
20
import org.gvsig.fmap.geom.primitive.Primitive;
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 class BaseMultiPrimitive extends AbstractPrimitive implements
79
                MultiPrimitive {
80
        /**
81
         * Default serial versionID
82
         */
83
        private static final long serialVersionUID = 1L;
84
        
85
        // Registramos este tipo de geometr?a
86
        private static GeometryType geomType = GeometryManager.getInstance()
87
                        .registerGeometryType(BaseMultiPrimitive.class);
88

    
89
        public static int CODE = geomType.getType();
90
        
91
        protected Geometry[] geometries = null;
92

    
93
        public BaseMultiPrimitive(String id, IProjection projection,
94
                        Geometry[] geometries) {
95
                super(id, projection);
96
                this.geometries = geometries;
97
        }
98

    
99
        public BaseMultiPrimitive(IProjection projection) {
100
                this(null, projection, null);
101
        }
102

    
103
        public BaseMultiPrimitive(IProjection projection, Geometry[] geometries) {
104
                this(null, projection, geometries);
105
        }
106

    
107
        public BaseMultiPrimitive(Geometry[] geometries) {
108
                this(null, null, geometries);
109
        }
110

    
111
        public BaseMultiPrimitive(String id, IProjection projection) {
112
                this(id, projection, null);
113
        }
114

    
115
        /*
116
         * (non-Javadoc)
117
         * 
118
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#cloneGeometry()
119
         */
120
        public Geometry cloneGeometry() {
121
                Primitive[] aux = new Primitive[getPrimitivesNumber()];
122
                for (int i = 0; i < getPrimitivesNumber(); i++) {
123
                        aux[i] = (Primitive) geometries[i].cloneGeometry()
124
                                        .getInternalShape();
125
                }
126
                return new BaseMultiPrimitive(id, projection, aux);
127
        }
128

    
129
        /*
130
         * (non-Javadoc)
131
         * 
132
         * @see java.awt.Shape#contains(double, double)
133
         */
134
        public boolean contains(double x, double y) {
135
                boolean bResul;
136
                for (int i = 0; i < getPrimitivesNumber(); i++) {
137
                        bResul = geometries[i].contains(x, y);
138
                        if (bResul)
139
                                return true;
140
                }
141
                return false;
142
        }
143

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

    
153
        /*
154
         * (non-Javadoc)
155
         * 
156
         * @see java.awt.Shape#contains(java.awt.geom.Point2D)
157
         */
158
        public boolean contains(Point2D p) {
159
                boolean bResul;
160
                for (int i = 0; i < getPrimitivesNumber(); i++) {
161
                        bResul = geometries[i].contains(p);
162
                        if (bResul)
163
                                return true;
164
                }
165
                return false;
166
        }
167

    
168
        /*
169
         * (non-Javadoc)
170
         * 
171
         * @see java.awt.Shape#contains(java.awt.geom.Rectangle2D)
172
         */
173
        public boolean contains(Rectangle2D r) {
174
                boolean bResul;
175
                for (int i = 0; i < getPrimitivesNumber(); i++) {
176
                        bResul = geometries[i].contains(r);
177
                        if (bResul)
178
                                return true;
179
                }
180
                return false;
181
        }
182

    
183
        /*
184
         * (non-Javadoc)
185
         * 
186
         * @see org.gvsig.geometries.iso.GM_Object#coordinateDimension()
187
         */
188
        public int getCoordinateDimension() {
189
                return 2;
190
        }
191

    
192
        /*
193
         * (non-Javadoc)
194
         * 
195
         * @see com.iver.cit.gvsig.fmap.core.IGeometry#fastIntersects(double,
196
         *      double, double, double)
197
         */
198
        public boolean fastIntersects(double x, double y, double w, double h) {
199
                for (int i = 0; i < getPrimitivesNumber(); i++) {
200
                        if (geometries[i].intersects(x, y, w, h))
201
                                return true;
202
                }
203
                return false;
204
        }
205

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

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

    
232
        public int getShapeType() {
233
                return FShape.MULTI;
234
        }
235

    
236
        public Handler[] getHandlers(int type) {
237
                int numPrimitives = getPrimitivesNumber();
238
                Handler[] handlers = new Handler[numPrimitives];
239
                for (int i = 0; i < numPrimitives; i++) {
240
                        handlers[i] = geometries[i].getHandlers(type)[0];
241
                }
242
                return handlers;
243
        }
244

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

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

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

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

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

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

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

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

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

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

    
380
        /*
381
         * (non-Javadoc)
382
         * 
383
         * @see org.gvsig.geometries.iso.GM_Object#getBoundary()
384
         */
385
        public Box getBoundary() {
386
                // TODO Auto-generated method stub
387
                return null;
388
        }
389

    
390
        /**
391
         * @return the geometries
392
         * @deprecated
393
         */
394
        public Geometry[] getGeometries() {
395
                return geometries;
396
        }
397

    
398
        public FShape cloneFShape() {
399
                // TODO Auto-generated method stub
400
                return null;
401
        }
402

    
403
        public Handler[] getSelectHandlers() {
404
                // TODO Auto-generated method stub
405
                return null;
406
        }
407

    
408
        public Handler[] getStretchingHandlers() {
409
                // TODO Auto-generated method stub
410
                return null;
411
        }
412

    
413
        public GeometryType getGeometryType() {
414
                return geomType;
415
        }
416

    
417
        public int getType() {
418
                return CODE;
419
        }
420
}