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 / aggregate / AbstractMultiPrimitive.java @ 45910

History | View | Annotate | Download (5.3 KB)

1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright ? 2007-2015 gvSIG Association
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18
 * MA  02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us
21
 * at info AT gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.fmap.geom.jts.aggregate;
24

    
25
import java.util.ArrayList;
26
import java.util.Iterator;
27
import java.util.List;
28

    
29
import org.gvsig.fmap.geom.Geometry;
30
import org.gvsig.fmap.geom.GeometryUtils;
31
import org.gvsig.fmap.geom.aggregate.Aggregate;
32
import org.gvsig.fmap.geom.aggregate.MultiPrimitive;
33
import org.gvsig.fmap.geom.complex.Complex;
34
import org.gvsig.fmap.geom.handler.Handler;
35
import org.gvsig.fmap.geom.operation.GeometryOperationException;
36
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
37
import org.gvsig.fmap.geom.primitive.Primitive;
38

    
39

    
40
/**
41
 * @author fdiaz
42
 *
43
 */
44
public abstract class AbstractMultiPrimitive extends AbstractAggregate implements MultiPrimitive {
45

    
46
    /**
47
     *
48
     */
49
    private static final long serialVersionUID = -5993428771359742467L;
50

    
51
    /**
52
     * @param type
53
     * @param subtype
54
     */
55
    public AbstractMultiPrimitive(int type, int subtype) {
56
        super(type, subtype);
57
    }
58

    
59
    public void addPrimitive(Primitive primitive) {
60
        Geometry geom = fixPrimitive(primitive);
61
        if (geom != null) {
62
            if (geom instanceof MultiPrimitive) {
63
                for (int i = 0; i < ((MultiPrimitive) geom).getPrimitivesNumber(); i++) {
64
                    addPrimitive(((MultiPrimitive) geom).getPrimitiveAt(i));
65
                }
66
            } else {
67
                primitives.add((Primitive) geom);
68
            }
69
        }
70
    }
71

    
72
    @Override
73
    public void addPrimitives(Aggregate aggregate) {
74
        for (Geometry primitive : aggregate) {
75
            this.addPrimitive((Primitive) primitive);
76
        }
77
    }
78

    
79
    public void addPrimitives(Complex complex) {
80
        for (Geometry primitive : complex) {
81
            if(GeometryUtils.isSubtype(this.getType(), primitive.getType())){
82
                this.addPrimitive((Primitive) primitive);
83
            }
84
        }
85
    }
86

    
87
    @Override
88
    public void addPrimitives(Geometry geometry) {
89
        if(geometry instanceof Primitive){
90
            addPrimitive((Primitive) geometry);
91
        } else if(geometry instanceof Complex){
92
            addPrimitives((Complex) geometry);
93
        } else {
94
            addPrimitives((Aggregate)geometry);
95
        }
96
    }
97

    
98
    /**
99
     * @param primitive
100
     * @return
101
     */
102
    protected abstract Geometry fixPrimitive(Primitive primitive);
103

    
104

    
105
    protected Geometry clonePrimitives(AbstractMultiPrimitive clone) {
106
        clone.ensureCapacity(primitives.size());
107
        for (Iterator iterator = primitives.iterator(); iterator.hasNext();) {
108
            Primitive primitive = (Primitive) iterator.next();
109
            clone.addPrimitive((Primitive)primitive.cloneGeometry());
110
        }
111
        return clone;
112
    }
113

    
114

    
115
    /* (non-Javadoc)
116
     * @see org.gvsig.fmap.geom.Geometry#getHandlers(int)
117
     */
118
    public Handler[] getHandlers(int type) {
119
        List<Handler> handlers = new ArrayList<Handler>();
120
        for (Iterator<Primitive> iterator = primitives.iterator(); iterator.hasNext();) {
121
            Primitive primitive = (Primitive) iterator.next();
122
            Handler[] primitiveHandlers = primitive.getHandlers(type);
123
            for (int i = 0; i < primitiveHandlers.length; i++) {
124
                handlers.add(primitiveHandlers[i]);
125
            }
126
        }
127
        return handlers.toArray(new Handler[handlers.size()]);
128
    }
129

    
130
    /* (non-Javadoc)
131
     * @see org.gvsig.fmap.geom.aggregate.Aggregate#union()
132
     */
133
    public Geometry union() throws GeometryOperationException, GeometryOperationNotSupportedException {
134
        Geometry result = null;
135
        for (Iterator<Primitive> iterator = primitives.iterator(); iterator.hasNext();) {
136
            Primitive primitive = (Primitive) iterator.next();
137
            if(result==null){
138
                result = primitive;
139
            } else {
140
                result.union(primitive);
141
            }
142
        }
143
        return result;
144
    }
145

    
146
    /* (non-Javadoc)
147
     * @see org.gvsig.fmap.geom.aggregate.Aggregate#intersection()
148
     */
149
    public Geometry intersection() throws GeometryOperationException, GeometryOperationNotSupportedException {
150
        Geometry result = null;
151
        for (Iterator<Primitive> iterator = primitives.iterator(); iterator.hasNext();) {
152
            Primitive primitive = (Primitive) iterator.next();
153
            if(result==null){
154
                result = primitive;
155
            } else {
156
                result.intersection(primitive);
157
            }
158
        }
159
        return result;
160
    }
161

    
162

    
163
}