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 / DefaultMultiCurve.java @ 47432

History | View | Annotate | Download (10.2 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 com.vividsolutions.jts.geom.LineString;
26
import java.util.ArrayList;
27
import java.util.Collections;
28
import java.util.List;
29
import org.apache.commons.lang3.StringUtils;
30
import org.gvsig.fmap.geom.Geometry;
31
import org.gvsig.fmap.geom.GeometryException;
32
import org.gvsig.fmap.geom.aggregate.MultiCurve;
33
import org.gvsig.fmap.geom.aggregate.MultiLine;
34
import org.gvsig.fmap.geom.aggregate.MultiPoint;
35
import org.gvsig.fmap.geom.aggregate.MultiPolygon;
36
import org.gvsig.fmap.geom.aggregate.MultiPrimitive;
37
import org.gvsig.fmap.geom.jts.GeometryJTS;
38
import org.gvsig.fmap.geom.jts.util.JTSUtils;
39
import org.gvsig.fmap.geom.operation.GeometryOperationException;
40
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
41
import org.gvsig.fmap.geom.primitive.Line;
42
import org.gvsig.fmap.geom.primitive.Primitive;
43
import org.gvsig.fmap.geom.type.GeometryType;
44

    
45

    
46
/**
47
 * @author fdiaz
48
 *
49
 */
50
public class DefaultMultiCurve extends AbstractMultiCurve {
51

    
52
    /**
53
     * @param geometryType
54
     */
55
    public DefaultMultiCurve(GeometryType geometryType) {
56
        super(geometryType.getSubType());
57
    }
58

    
59
    /**
60
     * @param subtype
61
     */
62
    public DefaultMultiCurve(int subtype) {
63
        super(subtype);
64
    }
65

    
66
    @Override
67
    public Geometry cloneGeometry() {
68
        DefaultMultiCurve clone = new DefaultMultiCurve(getGeometryType());
69
        for(int i=0; i<primitives.size(); i++){
70
            clone.addPrimitive((Primitive)primitives.get(i).cloneGeometry());
71
        }
72
        clone.setProjection(this.getProjection());
73
        return clone;
74
    }
75

    
76
    @Override
77
    public Geometry force2D() throws GeometryOperationNotSupportedException, GeometryOperationException {
78
        DefaultMultiCurve other = new DefaultMultiCurve(getGeometryType());
79
        other.setProjection(this.getProjection());
80
        other.ensureCapacity(primitives.size());
81
        for (Primitive primitive : primitives) {
82
            other.addPrimitive((Primitive)primitive.forceSubtype(Geometry.SUBTYPES.GEOM2D));
83
        }
84
        return other;
85
    }
86

    
87
    @Override
88
    public Geometry force2DM() throws GeometryOperationNotSupportedException, GeometryOperationException {
89
        DefaultMultiCurve other = new DefaultMultiCurve(getGeometryType());
90
        other.setProjection(this.getProjection());
91
        other.ensureCapacity(primitives.size());
92
        for (Primitive primitive : primitives) {
93
            other.addPrimitive((Primitive)primitive.forceSubtype(Geometry.SUBTYPES.GEOM2DM));
94
        }
95
        return other;
96
    }
97

    
98
    @Override
99
    public Geometry force3D() throws GeometryOperationNotSupportedException, GeometryOperationException {
100
        DefaultMultiCurve other = new DefaultMultiCurve(getGeometryType());
101
        other.setProjection(this.getProjection());
102
        other.ensureCapacity(primitives.size());
103
        for (Primitive primitive : primitives) {
104
            other.addPrimitive((Primitive)primitive.forceSubtype(Geometry.SUBTYPES.GEOM3D));
105
        }
106
        return other;
107
    }
108

    
109
    @Override
110
    public Geometry force3DM() throws GeometryOperationNotSupportedException, GeometryOperationException {
111
        DefaultMultiCurve other = new DefaultMultiCurve(getGeometryType());
112
        other.setProjection(this.getProjection());
113
        other.ensureCapacity(primitives.size());
114
        for (Primitive primitive : primitives) {
115
            other.addPrimitive((Primitive)primitive.forceSubtype(Geometry.SUBTYPES.GEOM3DM));
116
        }
117
        return other;
118
    }
119

    
120
    @Override
121
    public int getDimension() {
122
        switch (getGeometryType().getSubType()) {
123
        case Geometry.SUBTYPES.GEOM2D:
124
            return 2;
125
        case Geometry.SUBTYPES.GEOM2DM:
126
            return 3;
127
        case Geometry.SUBTYPES.GEOM3D:
128
            return 3;
129
        case Geometry.SUBTYPES.GEOM3DM:
130
            return 4;
131
        default:
132
            return 0;
133
        }
134
    }
135

    
136
    @Override
137
    public MultiPoint toPoints() throws GeometryException {
138
        MultiPoint multipoint = null;
139
        for (int i = 0; i < this.getPrimitivesNumber(); i++) {
140
            if(multipoint==null){
141
                multipoint = this.getPrimitiveAt(i).toPoints();
142
            } else {
143
                MultiPoint points = (MultiPoint)this.getPrimitiveAt(i).toPoints();
144
                for (int j = 0; j < points.getPrimitivesNumber(); j++) {
145
                    multipoint.addPrimitive(points.getPrimitiveAt(j));
146
                }
147
            }
148
        }
149
        return multipoint;
150
    }
151

    
152
    @Override
153
    public MultiLine toLines() throws GeometryException {
154
        MultiLine multiline = null;
155
        for (int i = 0; i < this.getPrimitivesNumber(); i++) {
156
            if(multiline==null){
157
                multiline = this.getPrimitiveAt(i).toLines();
158
            } else {
159
                MultiLine lines = (MultiLine)this.getPrimitiveAt(i).toLines();
160
                for (int j = 0; j < lines.getPrimitivesNumber(); j++) {
161
                    multiline.addPrimitive(lines.getPrimitiveAt(j));
162
                }
163
            }
164
        }
165
        return multiline;
166
    }
167

    
168
    @Override
169
    public MultiPolygon toPolygons() throws GeometryException {
170
        MultiPolygon multipolygon = null;
171
        for (int i = 0; i < this.getPrimitivesNumber(); i++) {
172
            if(multipolygon==null){
173
                multipolygon = this.getPrimitiveAt(i).toPolygons();
174
            } else {
175
                MultiPolygon polygons = (MultiPolygon)this.getPrimitiveAt(i).toPolygons();
176
                for (int j = 0; j < polygons.getPrimitivesNumber(); j++) {
177
                    multipolygon.addPrimitive(polygons.getPrimitiveAt(j));
178
                }
179
            }
180
        }
181
        return multipolygon;
182
    }
183

    
184
    @Override
185
    public void flip() throws GeometryOperationNotSupportedException, GeometryOperationException {
186
        for (int i = 0; i < this.getPrimitivesNumber(); i++) {
187
            this.getPrimitiveAt(i).flip();
188
        }
189
        Collections.reverse(primitives);
190
    }
191

    
192

    
193
    @Override
194
    protected Geometry fixPrimitive(Primitive primitive) {
195
        int primitiveSubType = primitive.getGeometryType().getSubType();
196
        int subType = getGeometryType().getSubType();
197
        if(primitiveSubType == subType){
198
            return primitive;
199
        }
200

    
201
        String message = StringUtils.replace("This MultiCurve only accept subtype %(subtype)s primitives", "%(subtype)s", String.valueOf(subType));
202
        notifyDeprecated(message);
203
        throw new UnsupportedOperationException(message);
204
    }
205

    
206
    @Override
207
    public com.vividsolutions.jts.geom.Geometry getJTS() {
208
        List<LineString> lineStrings = new ArrayList<>(primitives.size());
209

    
210
        LineString line;
211
        for (Primitive primitive : primitives) {
212
            if (primitive instanceof Line) {
213
                line = (LineString) ((GeometryJTS) primitive).getJTS();
214
                lineStrings.add(line);
215
            } else {
216
                MultiLine multiline;
217
                try {
218
                    multiline = primitive.toLines();
219
                    for (int j = 0; j < multiline.getPrimitivesNumber(); j++) {
220
                        line =
221
                                (LineString) ((GeometryJTS) multiline.getPrimitiveAt(j)).getJTS();
222
                        lineStrings.add(line);
223
                    }
224
                } catch (GeometryException e) {
225
                    GeometryType geomType = primitive.getGeometryType();
226
                    LOGGER.warn(StringUtils.replaceEach(
227
                            "Can't convert primitive type=%(type)s, %(subtype)s to MultiLine",
228
                            new String[] {"%(type)s", "%(subtype)s" },
229
                            new String[] { String.valueOf(geomType.getType()), String.valueOf(geomType.getSubType()) }));
230
                }
231
            }
232
        }
233
        return JTSUtils.createJTSMultiLineString(lineStrings.toArray(new LineString[lineStrings.size()]));
234
    }
235

    
236
    @Override
237
    public Geometry offset(double distance) throws GeometryOperationNotSupportedException, GeometryOperationException {
238
        MultiCurve result = new DefaultMultiCurve(getGeometryType());
239
        for (Primitive primitive : primitives) {
240
            Geometry offset = primitive.offset(distance);
241
            if(offset instanceof MultiPrimitive){
242
                MultiPrimitive multiOffset = (MultiPrimitive)offset;
243
                for(int i=0; i<multiOffset.getPrimitivesNumber(); i++){
244
                    result.addPrimitive(multiOffset.getPrimitiveAt(i));
245
                }
246
            } else {
247
                result.addPrimitive((Primitive)primitive.offset(distance));
248
            }
249
        }
250
        return result;
251
    }
252

    
253
    @Override
254
    public Geometry offset(int joinStyle, double distance) throws GeometryOperationNotSupportedException, GeometryOperationException {
255
        MultiCurve result = new DefaultMultiCurve(getGeometryType());
256
        for (Primitive primitive : primitives) {
257
            Geometry offset = primitive.offset(joinStyle, distance);
258
            if(offset instanceof MultiPrimitive){
259
                MultiPrimitive multiOffset = (MultiPrimitive)offset;
260
                for(int i=0; i<multiOffset.getPrimitivesNumber(); i++){
261
                    result.addPrimitive(multiOffset.getPrimitiveAt(i));
262
                }
263
            } else {
264
                result.addPrimitive((Primitive)primitive.offset(joinStyle, distance));
265
            }
266
        }
267
        return result;
268
    }
269
}