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 / Polygon2D.java @ 42441

History | View | Annotate | Download (8.39 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.MultiLine2D;
43
import org.gvsig.fmap.geom.jts.aggregate.MultiPolygon2D;
44
import org.gvsig.fmap.geom.jts.primitive.curve.line.BaseLine2D;
45
import org.gvsig.fmap.geom.jts.primitive.curve.line.Line2D;
46
import org.gvsig.fmap.geom.jts.primitive.point.Point2D;
47
import org.gvsig.fmap.geom.jts.primitive.ring.Ring2D;
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.Point;
53
import org.gvsig.fmap.geom.primitive.Polygon;
54
import org.gvsig.fmap.geom.primitive.Ring;
55
import org.gvsig.fmap.geom.primitive.SurfaceAppearance;
56

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

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

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

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

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

    
85
    /*
86
     * (non-Javadoc)
87
     *
88
     * @see org.gvsig.fmap.geom.Geometry#cloneGeometry()
89
     */
90
    public Geometry cloneGeometry() {
91
        Polygon2D cloned = new Polygon2D(cloneCoordinates().toCoordinateArray());
92
        for (int i = 0; i < getNumInteriorRings(); i++){
93
            cloned.addInteriorRing((Ring)getInteriorRing(i).cloneGeometry());
94
        }
95
        return cloned;
96
    }
97

    
98
    /*
99
     * (non-Javadoc)
100
     *
101
     * @see
102
     * org.gvsig.fmap.geom.primitive.Surface#setSurfaceAppearance(org.gvsig.
103
     * fmap.geom.primitive.SurfaceAppearance)
104
     */
105
    public void setSurfaceAppearance(SurfaceAppearance app) {
106
        // TODO Auto-generated method stub
107

    
108
    }
109

    
110
    /*
111
     * (non-Javadoc)
112
     *
113
     * @see org.gvsig.fmap.geom.primitive.Surface#getSurfaceAppearance()
114
     */
115
    public SurfaceAppearance getSurfaceAppearance() {
116
        // TODO Auto-generated method stub
117
        return null;
118
    }
119

    
120
    /*
121
     * (non-Javadoc)
122
     *
123
     * @see org.gvsig.fmap.geom.primitive.Surface#getNumInteriorRings()
124
     */
125
    public int getNumInteriorRings() {
126
        return interiorRings.size();
127
    }
128

    
129
    /*
130
     * (non-Javadoc)
131
     *
132
     * @see org.gvsig.fmap.geom.primitive.Surface#getInteriorRing(int)
133
     */
134
    public Ring getInteriorRing(int index) {
135
        return interiorRings.get(index);
136
    }
137

    
138
    /*
139
     * (non-Javadoc)
140
     *
141
     * @see
142
     * org.gvsig.fmap.geom.primitive.Surface#addInteriorRing(org.gvsig.fmap.
143
     * geom.primitive.Ring)
144
     */
145
    public void addInteriorRing(Ring ring) {
146
        interiorRings.add(ring);
147
    }
148

    
149
    /*
150
     * (non-Javadoc)
151
     *
152
     * @see
153
     * org.gvsig.fmap.geom.primitive.Surface#addInteriorRing(org.gvsig.fmap.
154
     * geom.primitive.Line)
155
     */
156
    public void addInteriorRing(Line line) {
157
        Ring2D ring = new Ring2D();
158
        ring.ensureCapacity(line.getNumVertices());
159
        for(int i=0; i<line.getNumVertices(); i++){
160
            Point vertex = line.getVertex(i);
161
            ring.addVertex(new Point2D(vertex.getX(), vertex.getY()));
162
        }
163
        ring.closePrimitive();
164
        interiorRings.add(ring);
165
    }
166

    
167
    /*
168
     * (non-Javadoc)
169
     *
170
     * @see
171
     * org.gvsig.fmap.geom.primitive.Surface#addInteriorRing(org.gvsig.fmap.
172
     * geom.primitive.Polygon)
173
     */
174
    public void addInteriorRing(Polygon polygon) {
175
        Ring2D ring = new Ring2D();
176
        ring.ensureCapacity(polygon.getNumVertices());
177
        for(int i=0; i<polygon.getNumVertices(); i++){
178
            Point vertex = polygon.getVertex(i);
179
            ring.addVertex(new Point2D(vertex.getX(), vertex.getY()));
180
        }
181
        ring.closePrimitive();
182
        interiorRings.add(ring);
183
    }
184

    
185
    /*
186
     * (non-Javadoc)
187
     *
188
     * @see org.gvsig.fmap.geom.primitive.Surface#removeInteriorRing(int)
189
     */
190
    public void removeInteriorRing(int index) {
191
        interiorRings.remove(index);
192
    }
193

    
194
    /* (non-Javadoc)
195
     * @see org.gvsig.fmap.geom.primitive.Line#toLines()
196
     */
197
    public MultiLine toLines() throws GeometryException {
198
        MultiLine multiLine = new MultiLine2D();
199
        multiLine.addPrimitive(new Line2D(coordinates.toCoordinateArray()));
200
        return multiLine;
201
    }
202

    
203
    /* (non-Javadoc)
204
     * @see org.gvsig.fmap.geom.primitive.Line#toPolygons()
205
     */
206
    public MultiPolygon toPolygons() throws GeometryException {
207
        MultiPolygon multiPolygon = new MultiPolygon2D();
208
        multiPolygon.addPrimitive(this);
209
        return multiPolygon;
210
    }
211

    
212
    /* (non-Javadoc)
213
     * @see org.gvsig.fmap.geom.jts.GeometryJTS#getJTS()
214
     */
215
    public com.vividsolutions.jts.geom.Geometry getJTS() {
216
        return JTSUtils.createJTSPolygon(coordinates, interiorRings);
217
    }
218

    
219
    /*
220
     * (non-Javadoc)
221
     *
222
     * @see
223
     * org.gvsig.fmap.geom.Geometry#getPathIterator(java.awt.geom.AffineTransform
224
     * )
225
     */
226
    public PathIterator getPathIterator(AffineTransform at) {
227
        PolygonIterator pi = new PolygonIterator(this, at);
228
        return pi;
229
    }
230

    
231
    /* (non-Javadoc)
232
     * @see org.gvsig.fmap.geom.jts.GeometryJTS#ensureOrientation(boolean)
233
     */
234
    public boolean ensureOrientation(boolean ccw) throws GeometryOperationNotSupportedException, GeometryOperationException {
235
        boolean result = super.ensureOrientation(ccw);
236
        for (Iterator<Ring> iterator = interiorRings.iterator(); iterator.hasNext();) {
237
            GeometryJTS ring = (GeometryJTS) iterator.next();
238
            ring.ensureOrientation(!ccw);
239
        }
240
        return result;
241
    }
242

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

    
255
    /* (non-Javadoc)
256
     * @see org.gvsig.fmap.geom.jts.primitive.curve.line.AbstractLine#transform(java.awt.geom.AffineTransform)
257
     */
258
    @Override
259
    public void transform(AffineTransform at) {
260
        super.transform(at);
261
        for (Iterator<Ring> iterator = interiorRings.iterator(); iterator.hasNext();) {
262
            GeometryJTS ring = (GeometryJTS) iterator.next();
263
            ring.transform(at);
264
        }
265
    }
266

    
267
  /* (non-Javadoc)
268
  * @see org.gvsig.fmap.geom.Geometry#offset(double)
269
  */
270
    public Geometry offset(double distance) throws GeometryOperationNotSupportedException, GeometryOperationException {
271
        return JTSUtils.createGeometry(getJTS().buffer(distance));
272
    }
273
}