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 @ 47364

History | View | Annotate | Download (6.52 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
import java.util.logging.Level;
29
import java.util.logging.Logger;
30

    
31
import org.gvsig.fmap.geom.Geometry;
32
import org.gvsig.fmap.geom.GeometryLocator;
33
import org.gvsig.fmap.geom.GeometryManager;
34
import org.gvsig.fmap.geom.GeometryUtils;
35
import org.gvsig.fmap.geom.aggregate.Aggregate;
36
import org.gvsig.fmap.geom.aggregate.MultiPrimitive;
37
import org.gvsig.fmap.geom.complex.Complex;
38
import org.gvsig.fmap.geom.exception.CreateGeometryException;
39
import org.gvsig.fmap.geom.handler.Handler;
40
import org.gvsig.fmap.geom.operation.GeometryOperationException;
41
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
42
import org.gvsig.fmap.geom.primitive.Primitive;
43

    
44

    
45
/**
46
 * @author fdiaz
47
 *
48
 */
49
public abstract class AbstractMultiPrimitive extends AbstractAggregate implements MultiPrimitive {
50

    
51
    /**
52
     *
53
     */
54
    private static final long serialVersionUID = -5993428771359742467L;
55

    
56
    /**
57
     * @param type
58
     * @param subtype
59
     */
60
    public AbstractMultiPrimitive(int type, int subtype) {
61
        super(type, subtype);
62
    }
63

    
64
    public void addPrimitive(Primitive primitive) {
65
        Geometry geom = fixPrimitive(primitive);
66
        if (geom != null) {
67
            if (geom instanceof MultiPrimitive) {
68
                for (int i = 0; i < ((MultiPrimitive) geom).getPrimitivesNumber(); i++) {
69
                    addPrimitive(((MultiPrimitive) geom).getPrimitiveAt(i));
70
                }
71
            } else {
72
                primitives.add((Primitive) geom);
73
            }
74
        }
75
    }
76

    
77
    @Override
78
    public void addPrimitives(Aggregate aggregate) {
79
        for (Geometry primitive : aggregate) {
80
            this.addPrimitive((Primitive) primitive);
81
        }
82
    }
83

    
84
    public void addPrimitives(Complex complex) {
85
        for (Geometry primitive : complex) {
86
            if(GeometryUtils.isSubtype(this.getType(), primitive.getType())){
87
                this.addPrimitive((Primitive) primitive);
88
            }
89
        }
90
    }
91

    
92
    @Override
93
    public void addPrimitives(Geometry geometry) {
94
        if(geometry instanceof Primitive){
95
            addPrimitive((Primitive) geometry);
96
        } else if(geometry instanceof Complex){
97
            addPrimitives((Complex) geometry);
98
        } else {
99
            addPrimitives((Aggregate)geometry);
100
        }
101
    }
102

    
103
    /**
104
     * @param primitive
105
     * @return
106
     */
107
    protected abstract Geometry fixPrimitive(Primitive primitive);
108

    
109

    
110
    protected Geometry clonePrimitives(AbstractMultiPrimitive clone) {
111
        clone.ensureCapacity(primitives.size());
112
        for (Iterator iterator = primitives.iterator(); iterator.hasNext();) {
113
            Primitive primitive = (Primitive) iterator.next();
114
            clone.addPrimitive((Primitive)primitive.cloneGeometry());
115
        }
116
        return clone;
117
    }
118

    
119

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

    
135
    /* (non-Javadoc)
136
     * @see org.gvsig.fmap.geom.aggregate.Aggregate#union()
137
     */
138
    public Geometry union() throws GeometryOperationException, GeometryOperationNotSupportedException {
139
        try {
140
            Geometry result = null;
141
            MultiPrimitive invalidResult = null;
142
            for (Iterator<Primitive> iterator = primitives.iterator(); iterator.hasNext();) {
143
                Primitive primitive = (Primitive) iterator.next();
144
                if (primitive.isValid()) {
145
                    if (result == null) {
146
                        result = primitive;
147
                    } else {
148
                        result = result.union(primitive);
149
                    }
150
                } else {
151
                    if (invalidResult == null) {
152
                        GeometryManager geomManager = GeometryLocator.getGeometryManager();
153
                        invalidResult = geomManager.createMultiPrimitive(primitive.getGeometryType());
154
                    }
155
                    invalidResult.addPrimitive(primitive);
156
                }
157
            }
158
            if (invalidResult == null) {
159
                return result;
160
            }
161
            invalidResult.addPrimitives(result);
162
            return invalidResult;
163
        } catch (CreateGeometryException ex) {
164
            GeometryManager geomManager = GeometryLocator.getGeometryManager();
165
            throw new GeometryOperationException(
166
                    this.getGeometryType().getType(), 
167
                    geomManager.getGeometryOperationCode(Geometry.OPERATIONS.UNION), 
168
                    ex);
169
        }
170
    }
171

    
172
    /* (non-Javadoc)
173
     * @see org.gvsig.fmap.geom.aggregate.Aggregate#intersection()
174
     */
175
    public Geometry intersection() throws GeometryOperationException, GeometryOperationNotSupportedException {
176
        Geometry result = null;
177
        for (Iterator<Primitive> iterator = primitives.iterator(); iterator.hasNext();) {
178
            Primitive primitive = (Primitive) iterator.next();
179
            if(result==null){
180
                result = primitive;
181
            } else {
182
                result.intersection(primitive);
183
            }
184
        }
185
        return result;
186
    }
187

    
188

    
189
}