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

History | View | Annotate | Download (8.76 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.force2D());
83
        }
84
        return other;
85
    }
86

    
87
    @Override
88
    public int getDimension() {
89
        switch (getGeometryType().getSubType()) {
90
        case Geometry.SUBTYPES.GEOM2D:
91
            return 2;
92
        case Geometry.SUBTYPES.GEOM2DM:
93
            return 3;
94
        case Geometry.SUBTYPES.GEOM3D:
95
            return 3;
96
        case Geometry.SUBTYPES.GEOM3DM:
97
            return 4;
98
        default:
99
            return 0;
100
        }
101
    }
102

    
103
    @Override
104
    public MultiPoint toPoints() throws GeometryException {
105
        MultiPoint multipoint = null;
106
        for (int i = 0; i < this.getPrimitivesNumber(); i++) {
107
            if(multipoint==null){
108
                multipoint = this.getPrimitiveAt(i).toPoints();
109
            } else {
110
                MultiPoint points = (MultiPoint)this.getPrimitiveAt(i).toPoints();
111
                for (int j = 0; j < points.getPrimitivesNumber(); j++) {
112
                    multipoint.addPrimitive(points.getPrimitiveAt(j));
113
                }
114
            }
115
        }
116
        return multipoint;
117
    }
118

    
119
    @Override
120
    public MultiLine toLines() throws GeometryException {
121
        MultiLine multiline = null;
122
        for (int i = 0; i < this.getPrimitivesNumber(); i++) {
123
            if(multiline==null){
124
                multiline = this.getPrimitiveAt(i).toLines();
125
            } else {
126
                MultiLine lines = (MultiLine)this.getPrimitiveAt(i).toLines();
127
                for (int j = 0; j < lines.getPrimitivesNumber(); j++) {
128
                    multiline.addPrimitive(lines.getPrimitiveAt(j));
129
                }
130
            }
131
        }
132
        return multiline;
133
    }
134

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

    
151
    @Override
152
    public void flip() throws GeometryOperationNotSupportedException, GeometryOperationException {
153
        for (int i = 0; i < this.getPrimitivesNumber(); i++) {
154
            this.getPrimitiveAt(i).flip();
155
        }
156
        Collections.reverse(primitives);
157
    }
158

    
159

    
160
    @Override
161
    protected Geometry fixPrimitive(Primitive primitive) {
162
        int primitiveSubType = primitive.getGeometryType().getSubType();
163
        int subType = getGeometryType().getSubType();
164
        if(primitiveSubType == subType){
165
            return primitive;
166
        }
167

    
168
        String message = StringUtils.replace("This MultiCurve only accept subtype %(subtype)s primitives", "%(subtype)s", String.valueOf(subType));
169
        notifyDeprecated(message);
170
        throw new UnsupportedOperationException(message);
171
    }
172

    
173
    @Override
174
    public com.vividsolutions.jts.geom.Geometry getJTS() {
175
        List<LineString> lineStrings = new ArrayList<>(primitives.size());
176

    
177
        LineString line;
178
        for (Primitive primitive : primitives) {
179
            if (primitive instanceof Line) {
180
                line = (LineString) ((GeometryJTS) primitive).getJTS();
181
                lineStrings.add(line);
182
            } else {
183
                MultiLine multiline;
184
                try {
185
                    multiline = primitive.toLines();
186
                    for (int j = 0; j < multiline.getPrimitivesNumber(); j++) {
187
                        line =
188
                                (LineString) ((GeometryJTS) multiline.getPrimitiveAt(j)).getJTS();
189
                        lineStrings.add(line);
190
                    }
191
                } catch (GeometryException e) {
192
                    GeometryType geomType = primitive.getGeometryType();
193
                    LOGGER.warn(StringUtils.replaceEach(
194
                            "Can't convert primitive type=%(type)s, %(subtype)s to MultiLine",
195
                            new String[] {"%(type)s", "%(subtype)s" },
196
                            new String[] { String.valueOf(geomType.getType()), String.valueOf(geomType.getSubType()) }));
197
                }
198
            }
199
        }
200
        return JTSUtils.createJTSMultiLineString(lineStrings.toArray(new LineString[lineStrings.size()]));
201
    }
202

    
203
    @Override
204
    public Geometry offset(double distance) throws GeometryOperationNotSupportedException, GeometryOperationException {
205
        MultiCurve result = new DefaultMultiCurve(getGeometryType());
206
        for (Primitive primitive : primitives) {
207
            Geometry offset = primitive.offset(distance);
208
            if(offset instanceof MultiPrimitive){
209
                MultiPrimitive multiOffset = (MultiPrimitive)offset;
210
                for(int i=0; i<multiOffset.getPrimitivesNumber(); i++){
211
                    result.addPrimitive(multiOffset.getPrimitiveAt(i));
212
                }
213
            } else {
214
                result.addPrimitive((Primitive)primitive.offset(distance));
215
            }
216
        }
217
        return result;
218
    }
219

    
220
    @Override
221
    public Geometry offset(int joinStyle, double distance) throws GeometryOperationNotSupportedException, GeometryOperationException {
222
        MultiCurve result = new DefaultMultiCurve(getGeometryType());
223
        for (Primitive primitive : primitives) {
224
            Geometry offset = primitive.offset(joinStyle, distance);
225
            if(offset instanceof MultiPrimitive){
226
                MultiPrimitive multiOffset = (MultiPrimitive)offset;
227
                for(int i=0; i<multiOffset.getPrimitivesNumber(); i++){
228
                    result.addPrimitive(multiOffset.getPrimitiveAt(i));
229
                }
230
            } else {
231
                result.addPrimitive((Primitive)primitive.offset(joinStyle, distance));
232
            }
233
        }
234
        return result;
235
    }
236
}