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 / primitive / surface / polygon / Polygon3DM.java @ 42441

History | View | Annotate | Download (8.35 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.primitive.surface.polygon;
24

    
25
import java.awt.geom.AffineTransform;
26
import java.awt.geom.PathIterator;
27
import java.util.ArrayList;
28
import java.util.Iterator;
29
import java.util.List;
30

    
31
import com.vividsolutions.jts.geom.Coordinate;
32
import com.vividsolutions.jts.geom.GeometryFactory;
33
import com.vividsolutions.jts.geomgraph.Position;
34
import com.vividsolutions.jts.operation.buffer.BufferParameters;
35
import com.vividsolutions.jts.operation.buffer.OffsetCurveBuilder;
36

    
37
import org.gvsig.fmap.geom.Geometry;
38
import org.gvsig.fmap.geom.GeometryException;
39
import org.gvsig.fmap.geom.aggregate.MultiLine;
40
import org.gvsig.fmap.geom.aggregate.MultiPolygon;
41
import org.gvsig.fmap.geom.jts.GeometryJTS;
42
import org.gvsig.fmap.geom.jts.aggregate.MultiLine3DM;
43
import org.gvsig.fmap.geom.jts.aggregate.MultiPolygon3DM;
44
import org.gvsig.fmap.geom.jts.primitive.curve.line.BaseLine3DM;
45
import org.gvsig.fmap.geom.jts.primitive.curve.line.Line3DM;
46
import org.gvsig.fmap.geom.jts.primitive.point.Point3DM;
47
import org.gvsig.fmap.geom.jts.primitive.ring.Ring3DM;
48
import org.gvsig.fmap.geom.jts.util.JTSUtils;
49
import org.gvsig.fmap.geom.operation.GeometryOperationException;
50
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
51
import org.gvsig.fmap.geom.primitive.Line;
52
import org.gvsig.fmap.geom.primitive.Polygon;
53
import org.gvsig.fmap.geom.primitive.Ring;
54
import org.gvsig.fmap.geom.primitive.SurfaceAppearance;
55

    
56

    
57
/**
58
 * @author fdiaz
59
 *
60
 */
61
public class Polygon3DM extends BaseLine3DM implements Polygon {
62

    
63
    /**
64
     *
65
     */
66
    private static final long serialVersionUID = -5989088152154360862L;
67

    
68
    List<Ring> interiorRings = new ArrayList<Ring>();
69

    
70
    /**
71
     * @param subtype
72
     */
73
    public Polygon3DM() {
74
        super(Geometry.TYPES.POLYGON);
75
    }
76

    
77

    
78
    /**
79
    *
80
    */
81
    public Polygon3DM(Coordinate[] coordinates) {
82
        super(Geometry.TYPES.POLYGON, coordinates);
83
        closePrimitive();
84
    }
85

    
86

    
87
    /* (non-Javadoc)
88
     * @see org.gvsig.fmap.geom.primitive.Surface#setSurfaceAppearance(org.gvsig.fmap.geom.primitive.SurfaceAppearance)
89
     */
90
    public void setSurfaceAppearance(SurfaceAppearance app) {
91
        // TODO Auto-generated method stub
92

    
93
    }
94

    
95
    /* (non-Javadoc)
96
     * @see org.gvsig.fmap.geom.primitive.Surface#getSurfaceAppearance()
97
     */
98
    public SurfaceAppearance getSurfaceAppearance() {
99
        // TODO Auto-generated method stub
100
        return null;
101
    }
102

    
103
    /* (non-Javadoc)
104
     * @see org.gvsig.fmap.geom.primitive.Surface#getNumInteriorRings()
105
     */
106
    public int getNumInteriorRings() {
107
        return interiorRings.size();
108
    }
109

    
110
    /* (non-Javadoc)
111
     * @see org.gvsig.fmap.geom.primitive.Surface#getInteriorRing(int)
112
     */
113
    public Ring getInteriorRing(int index) {
114
        return interiorRings.get(index);
115
    }
116

    
117
    /* (non-Javadoc)
118
     * @see org.gvsig.fmap.geom.primitive.Surface#addInteriorRing(org.gvsig.fmap.geom.primitive.Ring)
119
     */
120
    public void addInteriorRing(Ring ring) {
121
        interiorRings.add(ring);
122
    }
123

    
124
    /* (non-Javadoc)
125
     * @see org.gvsig.fmap.geom.primitive.Surface#addInteriorRing(org.gvsig.fmap.geom.primitive.Line)
126
     */
127
    public void addInteriorRing(Line line) {
128
        Ring3DM ring = new Ring3DM();
129
        ring.ensureCapacity(line.getNumVertices());
130
        for(int i=0; i<line.getNumVertices(); i++){
131
            Point3DM vertex = (Point3DM)line.getVertex(i);
132
            ring.addVertex(new Point3DM(vertex.getX(), vertex.getY(), vertex.getZ(), vertex.getM()));
133
        }
134
        ring.closePrimitive();
135
        interiorRings.add(ring);
136
    }
137

    
138
    /*
139
     * (non-Javadoc)
140
     *
141
     * @see
142
     * org.gvsig.fmap.geom.primitive.Surface#addInteriorRing(org.gvsig.fmap.
143
     * geom.primitive.Polygon)
144
     */
145
    public void addInteriorRing(Polygon polygon) {
146
        Ring3DM ring = new Ring3DM();
147
        ring.ensureCapacity(polygon.getNumVertices());
148
        for(int i=0; i<polygon.getNumVertices(); i++){
149
            Point3DM vertex = (Point3DM)polygon.getVertex(i);
150
            ring.addVertex(new Point3DM(vertex.getX(), vertex.getY(), vertex.getZ(), vertex.getM()));
151
        }
152
        ring.closePrimitive();
153
        interiorRings.add(ring);
154
    }
155

    
156
    /* (non-Javadoc)
157
     * @see org.gvsig.fmap.geom.primitive.Surface#removeInteriorRing(int)
158
     */
159
    public void removeInteriorRing(int index) {
160
        interiorRings.remove(index);
161
    }
162

    
163
    /*
164
     * (non-Javadoc)
165
     *
166
     * @see org.gvsig.fmap.geom.primitive.Line#toLines()
167
     */
168
    public MultiLine toLines() throws GeometryException {
169
        MultiLine multiLine = new MultiLine3DM();
170
        multiLine.addPrimitive(new Line3DM(coordinates.toCoordinateArray()));
171
        return multiLine;
172
    }
173

    
174
    /*
175
     * (non-Javadoc)
176
     *
177
     * @see org.gvsig.fmap.geom.primitive.Line#toPolygons()
178
     */
179
    public MultiPolygon toPolygons() throws GeometryException {
180
        MultiPolygon multiPolygon = new MultiPolygon3DM();
181
        multiPolygon.addPrimitive(this);
182
        return multiPolygon;
183
    }
184

    
185

    
186
    /* (non-Javadoc)
187
     * @see org.gvsig.fmap.geom.Geometry#cloneGeometry()
188
     */
189
    public Geometry cloneGeometry() {
190
        Polygon3DM cloned = new Polygon3DM(cloneCoordinates().toCoordinateArray());
191
        for (int i = 0; i < getNumInteriorRings(); i++){
192
            cloned.addInteriorRing((Ring)getInteriorRing(i).cloneGeometry());
193
        }
194
        return cloned;
195
    }
196

    
197

    
198
    /* (non-Javadoc)
199
     * @see org.gvsig.fmap.geom.jts.GeometryJTS#getJTS()
200
     */
201
    public com.vividsolutions.jts.geom.Geometry getJTS() {
202
        return JTSUtils.createJTSPolygon(coordinates, interiorRings);
203
    }
204

    
205

    
206
    /*
207
     * (non-Javadoc)
208
     *
209
     * @see
210
     * org.gvsig.fmap.geom.Geometry#getPathIterator(java.awt.geom.AffineTransform
211
     * )
212
     */
213
    public PathIterator getPathIterator(AffineTransform at) {
214
        PolygonIterator pi = new PolygonIterator(this, at);
215
        return pi;
216
    }
217

    
218
    /* (non-Javadoc)
219
     * @see org.gvsig.fmap.geom.jts.GeometryJTS#ensureOrientation(boolean)
220
     */
221
    public boolean ensureOrientation(boolean ccw) throws GeometryOperationNotSupportedException, GeometryOperationException {
222
        boolean result = super.ensureOrientation(ccw);
223
        for (Iterator<Ring> iterator = interiorRings.iterator(); iterator.hasNext();) {
224
            GeometryJTS ring = (GeometryJTS) iterator.next();
225
            ring.ensureOrientation(!ccw);
226
        }
227
        return result;
228
    }
229

    
230
    /* (non-Javadoc)
231
     * @see org.gvsig.fmap.geom.jts.primitive.curve.line.AbstractLine#flip()
232
     */
233
    @Override
234
    public void flip() throws GeometryOperationNotSupportedException, GeometryOperationException {
235
        super.flip();
236
        for (Iterator<Ring> iterator = interiorRings.iterator(); iterator.hasNext();) {
237
            GeometryJTS ring = (GeometryJTS) iterator.next();
238
            ring.flip();
239
        }
240
    }
241

    
242

    
243
    /* (non-Javadoc)
244
     * @see org.gvsig.fmap.geom.jts.primitive.curve.line.AbstractLine#transform(java.awt.geom.AffineTransform)
245
     */
246
    @Override
247
    public void transform(AffineTransform at) {
248
        super.transform(at);
249
        for (Iterator<Ring> iterator = interiorRings.iterator(); iterator.hasNext();) {
250
            GeometryJTS ring = (GeometryJTS) iterator.next();
251
            ring.transform(at);
252
        }
253
    }
254

    
255

    
256
    /* (non-Javadoc)
257
    * @see org.gvsig.fmap.geom.Geometry#offset(double)
258
    */
259
      public Geometry offset(double distance) throws GeometryOperationNotSupportedException, GeometryOperationException {
260
          return JTSUtils.createGeometry(getJTS().buffer(distance));
261
      }
262
}
263