Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.geometry / org.gvsig.fmap.geometry.jts / src / main / java / org / gvsig / fmap / geom / jts / complex / DefaultComplex.java @ 47432

History | View | Annotate | Download (14.2 KB)

1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6
package org.gvsig.fmap.geom.jts.complex;
7

    
8
import com.vividsolutions.jts.geom.GeometryCollection;
9
import com.vividsolutions.jts.geom.GeometryFactory;
10
import java.awt.Shape;
11
import java.awt.geom.AffineTransform;
12
import java.awt.geom.PathIterator;
13
import java.util.ArrayList;
14
import java.util.Arrays;
15
import java.util.Collection;
16
import java.util.Collections;
17
import java.util.Iterator;
18
import java.util.List;
19
import java.util.Objects;
20
import java.util.function.Predicate;
21
import org.cresques.cts.ICoordTrans;
22
import org.gvsig.fmap.geom.Geometry;
23
import org.gvsig.fmap.geom.GeometryException;
24
import org.gvsig.fmap.geom.GeometryLocator;
25
import org.gvsig.fmap.geom.aggregate.Aggregate;
26
import org.gvsig.fmap.geom.aggregate.MultiLine;
27
import org.gvsig.fmap.geom.aggregate.MultiPoint;
28
import org.gvsig.fmap.geom.aggregate.MultiPolygon;
29
import org.gvsig.fmap.geom.aggregate.MultiPrimitive;
30
import org.gvsig.fmap.geom.complex.Complex;
31
import org.gvsig.fmap.geom.exception.CreateGeometryException;
32
import org.gvsig.fmap.geom.handler.Handler;
33
import org.gvsig.fmap.geom.jts.AbstractGeometry;
34
import org.gvsig.fmap.geom.jts.GeometryJTS;
35
import org.gvsig.fmap.geom.jts.aggregate.AbstractAggregate;
36
import org.gvsig.fmap.geom.jts.gputils.DefaultGeneralPathX;
37
import org.gvsig.fmap.geom.operation.GeometryOperationException;
38
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
39
import org.gvsig.fmap.geom.primitive.GeneralPathX;
40
import org.gvsig.fmap.geom.primitive.Primitive;
41
import org.gvsig.fmap.geom.type.GeometryType;
42

    
43
/**
44
 *
45
 * @author fdiaz
46
 */
47
public class DefaultComplex extends AbstractGeometry implements Complex {
48

    
49
    private final ArrayList<Primitive> primitives;
50

    
51
    public DefaultComplex(GeometryType geomType) {
52
        super(geomType.getType(), geomType.getSubType());
53
        primitives = new ArrayList<>();
54
    }
55
    
56
    /**
57
     * @param subtype
58
     */
59
    public DefaultComplex(int subtype) {
60
        super(Geometry.TYPES.GEOMETRY, subtype);
61
        primitives = new ArrayList<>();
62
    }
63

    
64

    
65
    @Override
66
    public int getPrimitivesNumber() {
67
        return primitives.size();
68
    }
69

    
70
    @Override
71
    public Primitive getPrimitiveAt(int i) {
72
        return primitives.get(i);
73
    }
74

    
75
    @Override
76
    public PathIterator getPathIterator(AffineTransform affineTransform) {
77
        PrimitiveListPathIterator it = new PrimitiveListPathIterator((List)this.primitives, affineTransform);
78
        return it;
79
    }
80

    
81
    @Override
82
    public Iterator<Geometry> iterator() {
83
        return new Iterator<Geometry>() {
84

    
85
            private int current = 0;
86

    
87
            @Override
88
            public boolean hasNext() {
89
                return (current < getPrimitivesNumber());
90
            }
91

    
92
            @Override
93
            public Geometry next() {
94
                return getPrimitiveAt(current++);
95
            }
96
        };
97
    }
98

    
99

    
100
    @Override
101
    public void ensureCapacity(int capacity) {
102
        primitives.ensureCapacity(capacity);
103
    }
104

    
105

    
106
    @Override
107
    public void reProject(ICoordTrans ct) {
108
        for (Primitive primitive : primitives) {
109
            primitive.reProject(ct);
110
        }
111
    }
112

    
113
    @Override
114
    public void transform(AffineTransform at) {
115
        for (Primitive primitive : primitives) {
116
            primitive.transform(at);
117
        }
118
    }
119

    
120

    
121
    @Override
122
    public boolean is3D() {
123
        for (Iterator<Primitive> iterator = primitives.iterator(); iterator.hasNext();) {
124
            GeometryJTS primitive = (GeometryJTS) iterator.next();
125
            if (primitive.is3D()) {
126
                return true;
127
            }
128
        }
129
        return false;
130
    }
131

    
132

    
133
    @Override
134
    public Shape getShape(AffineTransform affineTransform) {
135
        return new DefaultGeneralPathX(getPathIterator(affineTransform),false,0);
136
    }
137

    
138
    @Override
139
    public Shape getShape() {
140
        return new DefaultGeneralPathX(getPathIterator(null),false,0);
141
    }
142

    
143
    @Override
144
    public boolean equals(Object obj) {
145
        if(super.equals(obj) && obj instanceof AbstractAggregate){
146
            AbstractAggregate other = (AbstractAggregate)obj;
147
            if(other.getPrimitivesNumber() == this.getPrimitivesNumber()){
148
                for (int j = 0; j < this.getPrimitivesNumber(); j++) {
149
                    if(!this.getPrimitiveAt(j).equals(other.getPrimitiveAt(j))){
150
                        return false;
151
                    }
152
                }
153
            } else {
154
                return false;
155
            }
156
        } else {
157
            return false;
158
        }
159
        return true;
160
    }
161

    
162
    @Override
163
    public int hashCode() {
164
        int hash = 5;
165
        hash = 41 * hash + Objects.hashCode(this.primitives);
166
        return hash;
167
    }
168

    
169
    @Override
170
    public boolean canBeTransformed(AffineTransform at) {
171
        for (Iterator<Primitive> iterator = primitives.iterator(); iterator.hasNext();) {
172
            GeometryJTS primitive = (GeometryJTS) iterator.next();
173
            if (!primitive.canBeTransformed(at)) {
174
                return false;
175
            }
176
        }
177
        return true;
178
    }
179

    
180
    @Override
181
    public boolean canBeReprojected(ICoordTrans ct) {
182
        for (Iterator<Primitive> iterator = primitives.iterator(); iterator.hasNext();) {
183
            GeometryJTS primitive = (GeometryJTS) iterator.next();
184
            if (!primitive.canBeReprojected(ct)) {
185
                return false;
186
            }
187
        }
188
        return true;
189
    }
190

    
191
    @Override
192
    public void flip() throws GeometryOperationNotSupportedException, GeometryOperationException {
193
        for (Iterator iterator = primitives.iterator(); iterator.hasNext();) {
194
            ((GeometryJTS)iterator.next()).flip();
195
        }
196
        Collections.reverse(primitives);
197
    }
198

    
199
    @Override
200
    public void addPrimitive(Primitive primitive) {
201
        Geometry geom = fixPrimitive(primitive);
202
        if (geom != null) {
203
            if (geom instanceof MultiPrimitive) {
204
                for (int i = 0; i < ((MultiPrimitive) geom).getPrimitivesNumber(); i++) {
205
                    addPrimitive(((MultiPrimitive) geom).getPrimitiveAt(i));
206
                }
207
            } else {
208
                primitives.add((Primitive) geom);
209
            }
210
        }
211
    }
212

    
213
    @Override
214
    public void addPrimitives(Aggregate aggregate) {
215
        for (Geometry primitive : aggregate) {
216
            this.addPrimitive((Primitive) primitive);
217
        }
218
    }
219

    
220
    @Override
221
    public void addPrimitives(Geometry geometry) {
222
        if(geometry instanceof Primitive){
223
            addPrimitive((Primitive) geometry);
224
        } else {
225
            addPrimitives((Aggregate)geometry);
226
        }
227
    }
228

    
229
    private Geometry fixPrimitive(Primitive primitive) {
230
        //FIXME: check subtype and projection
231
        return primitive;
232
    }
233
    
234
    @Override
235
    public Geometry force2D() throws GeometryOperationNotSupportedException, GeometryOperationException {
236
        DefaultComplex other = new DefaultComplex(this.getGeometryType().getSubType());
237
        other.setProjection(this.getProjection());
238
        other.ensureCapacity(primitives.size());
239
        for (Primitive primitive : primitives) {
240
            other.addPrimitive((Primitive)primitive.forceSubtype(Geometry.SUBTYPES.GEOM2D));
241
        }
242
        return other;
243
    }
244

    
245
    @Override
246
    public Geometry force2DM() throws GeometryOperationNotSupportedException, GeometryOperationException {
247
        DefaultComplex other = new DefaultComplex(this.getGeometryType().getSubType());
248
        other.setProjection(this.getProjection());
249
        other.ensureCapacity(primitives.size());
250
        for (Primitive primitive : primitives) {
251
            other.addPrimitive((Primitive)primitive.forceSubtype(Geometry.SUBTYPES.GEOM2DM));
252
        }
253
        return other;
254
    }
255

    
256
    @Override
257
    public Geometry force3D() throws GeometryOperationNotSupportedException, GeometryOperationException {
258
        DefaultComplex other = new DefaultComplex(this.getGeometryType().getSubType());
259
        other.setProjection(this.getProjection());
260
        other.ensureCapacity(primitives.size());
261
        for (Primitive primitive : primitives) {
262
            other.addPrimitive((Primitive)primitive.forceSubtype(Geometry.SUBTYPES.GEOM3D));
263
        }
264
        return other;
265
    }
266

    
267
    @Override
268
    public Geometry force3DM() throws GeometryOperationNotSupportedException, GeometryOperationException {
269
        DefaultComplex other = new DefaultComplex(this.getGeometryType().getSubType());
270
        other.setProjection(this.getProjection());
271
        other.ensureCapacity(primitives.size());
272
        for (Primitive primitive : primitives) {
273
            other.addPrimitive((Primitive)primitive.forceSubtype(Geometry.SUBTYPES.GEOM3DM));
274
        }
275
        return other;
276
    }
277

    
278
    @Override
279
    public Geometry offset(double distance) throws GeometryOperationNotSupportedException, GeometryOperationException {
280
        DefaultComplex other = new DefaultComplex(this.getGeometryType().getSubType());
281
        other.setProjection(this.getProjection());
282
        other.ensureCapacity(primitives.size());
283
        for (Primitive primitive : primitives) {
284
            other.addPrimitive((Primitive)primitive.offset(distance));
285
        }
286
        return other;
287
    }
288

    
289
    @Override
290
    public Geometry offset(int joinStyle, double distance) throws GeometryOperationNotSupportedException, GeometryOperationException {
291
        DefaultComplex other = new DefaultComplex(this.getGeometryType().getSubType());
292
        other.setProjection(this.getProjection());
293
        other.ensureCapacity(primitives.size());
294
        for (Primitive primitive : primitives) {
295
            other.addPrimitive((Primitive)primitive.offset(joinStyle, distance));
296
        }
297
        return other;
298
    }
299

    
300
    @Override
301
    public com.vividsolutions.jts.geom.Geometry getJTS() {
302
        GeometryFactory gf = new GeometryFactory();
303
        List<com.vividsolutions.jts.geom.Geometry> geometries = new ArrayList<>();
304
        for (Primitive primitive : primitives) {
305
            geometries.add(((GeometryJTS)primitive).getJTS());
306
        }
307
        GeometryCollection col = gf.createGeometryCollection(geometries.toArray(new com.vividsolutions.jts.geom.Geometry[geometries.size()]));
308
        return col;
309
    }
310

    
311
    @Override
312
    public Geometry cloneGeometry() {
313
        DefaultComplex other = new DefaultComplex(this.getGeometryType().getSubType());
314
        other.setProjection(this.getProjection());
315
        other.ensureCapacity(primitives.size());
316
        for (Primitive primitive : primitives) {
317
            other.addPrimitive((Primitive)primitive.cloneGeometry());
318
        }
319
        return other;
320
    }
321

    
322
    @Override
323
    public int getDimension() {
324
        return this.getGeometryType().getDimension();
325
    }
326

    
327
    @Override
328
    public Handler[] getHandlers(int type) {
329
        List<Handler> handlers = new ArrayList<>();
330
        for (Primitive primitive : primitives) {
331
            Handler[] primitiveHandlers = primitive.getHandlers(type);
332
            handlers.addAll(Arrays.asList(primitiveHandlers));
333
        }
334
        return handlers.toArray(new Handler[handlers.size()]);
335
    }
336

    
337
    @Override
338
    public PathIterator getPathIterator(AffineTransform at, double flatness) {
339
        return getPathIterator(at);
340
    }
341

    
342
    @Override
343
    public GeneralPathX getGeneralPath() {
344
        return new DefaultGeneralPathX(getPathIterator(null), false, 0);
345
    }
346

    
347
    @Override
348
    public MultiPoint toPoints() throws GeometryException {
349
        MultiPoint res = GeometryLocator.getGeometryManager().createMultiPoint(this.getGeometryType().getSubType());
350
        res.setProjection(this.getProjection());
351
        for (Primitive primitive : primitives) {
352
            MultiPoint points = primitive.toPoints();
353
            for (Geometry point : points) {
354
                res.addPrimitives(point);
355
            }
356
        }
357
        return res;
358
    }
359

    
360
    @Override
361
    public MultiLine toLines() throws GeometryException {
362
        MultiLine res = GeometryLocator.getGeometryManager().createMultiLine(this.getGeometryType().getSubType());
363
        res.setProjection(this.getProjection());
364
        for (Primitive primitive : primitives) {
365
            MultiLine geometries = primitive.toLines();
366
            for (Geometry geom : geometries) {
367
                res.addPrimitives(geom);
368
            }
369
        }
370
        return res;
371
    }
372

    
373
    @Override
374
    public MultiPolygon toPolygons() throws GeometryException {
375
        MultiPolygon res = GeometryLocator.getGeometryManager().createMultiPolygon(this.getGeometryType().getSubType());
376
        res.setProjection(this.getProjection());
377
        for (Primitive primitive : primitives) {
378
            MultiPolygon geometries = primitive.toPolygons();
379
            for (Geometry geom : geometries) {
380
                res.addPrimitives(geom);
381
            }
382
        }
383
        return res;
384
    }
385

    
386
    @Override
387
    public Collection<? extends Geometry> getElements() {
388
        return this.primitives;
389
    }
390

    
391
    @Override
392
    public Iterator<Geometry> iterator(Predicate<Geometry> filter) {
393
        Iterator<Geometry> it = this.iterator();
394
        return new Iterator<Geometry>() {
395

    
396
            Geometry next = null;
397
            
398
            @Override
399
            public boolean hasNext() {
400
                while (it.hasNext()) {
401
                    next = it.next();
402
                    if(filter.test(next)){
403
                        return true;
404
                    }
405
                }
406
                return false;
407
            }
408

    
409
            @Override
410
            public Geometry next() {
411
                return next;
412
            }
413
        };
414
    }
415
    
416
    @Override
417
    public Aggregate createAggregate(int type, Predicate<Geometry> filter) throws CreateGeometryException {
418
        MultiPrimitive aggregate = (MultiPrimitive) GeometryLocator.getGeometryManager().create(type, this.getGeometryType().getSubType());
419
        for (Primitive primitive : primitives) {
420
            if(filter.test(primitive)){
421
                aggregate.addPrimitives(primitive);
422
            }
423
        }
424
        return aggregate;
425
    }
426

    
427
    @Override
428
    public boolean isEmpty() {
429
        return this.getPrimitivesNumber() < 1;
430
    }
431

    
432
    @Override
433
    public int size() {
434
        return this.getPrimitivesNumber();
435
    }
436

    
437
    @Override
438
    public Geometry get(int position) {
439
        return this.getPrimitiveAt(position);
440
    }
441
    
442
}