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

History | View | Annotate | Download (8.71 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
        return clone;
73
    }
74

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

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

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

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

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

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

    
158

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

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

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

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

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

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