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

History | View | Annotate | Download (7.28 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

    
33
import org.gvsig.fmap.geom.Geometry;
34
import org.gvsig.fmap.geom.GeometryException;
35
import org.gvsig.fmap.geom.aggregate.MultiLine;
36
import org.gvsig.fmap.geom.aggregate.MultiPolygon;
37
import org.gvsig.fmap.geom.jts.GeometryJTS;
38
import org.gvsig.fmap.geom.jts.aggregate.MultiLine2D;
39
import org.gvsig.fmap.geom.jts.aggregate.MultiPolygon2D;
40
import org.gvsig.fmap.geom.jts.primitive.curve.line.BaseLine2D;
41
import org.gvsig.fmap.geom.jts.primitive.curve.line.Line2D;
42
import org.gvsig.fmap.geom.jts.primitive.point.Point2D;
43
import org.gvsig.fmap.geom.jts.primitive.ring.Ring2D;
44
import org.gvsig.fmap.geom.jts.util.JTSUtils;
45
import org.gvsig.fmap.geom.operation.GeometryOperationException;
46
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
47
import org.gvsig.fmap.geom.primitive.Line;
48
import org.gvsig.fmap.geom.primitive.Point;
49
import org.gvsig.fmap.geom.primitive.Polygon;
50
import org.gvsig.fmap.geom.primitive.Ring;
51
import org.gvsig.fmap.geom.primitive.SurfaceAppearance;
52

    
53
/**
54
 * @author fdiaz
55
 *
56
 */
57
public class Polygon2D extends BaseLine2D implements Polygon {
58

    
59
    /**
60
     *
61
     */
62
    private static final long serialVersionUID = 4927309852756014929L;
63

    
64
    List<Ring> interiorRings = new ArrayList<Ring>();
65

    
66
    /**
67
     * @param subtype
68
     */
69
    public Polygon2D() {
70
        super(Geometry.TYPES.POLYGON);
71
    }
72

    
73
    /**
74
    *
75
    */
76
    public Polygon2D(Coordinate[] coordinates) {
77
        super(coordinates);
78
        closePrimitive();
79
    }
80

    
81
    /*
82
     * (non-Javadoc)
83
     *
84
     * @see org.gvsig.fmap.geom.Geometry#cloneGeometry()
85
     */
86
    public Geometry cloneGeometry() {
87
        return new Polygon2D(cloneCoordinates().toCoordinateArray());
88
    }
89

    
90
    /*
91
     * (non-Javadoc)
92
     *
93
     * @see
94
     * org.gvsig.fmap.geom.primitive.Surface#setSurfaceAppearance(org.gvsig.
95
     * fmap.geom.primitive.SurfaceAppearance)
96
     */
97
    public void setSurfaceAppearance(SurfaceAppearance app) {
98
        // TODO Auto-generated method stub
99

    
100
    }
101

    
102
    /*
103
     * (non-Javadoc)
104
     *
105
     * @see org.gvsig.fmap.geom.primitive.Surface#getSurfaceAppearance()
106
     */
107
    public SurfaceAppearance getSurfaceAppearance() {
108
        // TODO Auto-generated method stub
109
        return null;
110
    }
111

    
112
    /*
113
     * (non-Javadoc)
114
     *
115
     * @see org.gvsig.fmap.geom.primitive.Surface#getNumInteriorRings()
116
     */
117
    public int getNumInteriorRings() {
118
        return interiorRings.size();
119
    }
120

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

    
130
    /*
131
     * (non-Javadoc)
132
     *
133
     * @see
134
     * org.gvsig.fmap.geom.primitive.Surface#addInteriorRing(org.gvsig.fmap.
135
     * geom.primitive.Ring)
136
     */
137
    public void addInteriorRing(Ring ring) {
138
        interiorRings.add(ring);
139
    }
140

    
141
    /*
142
     * (non-Javadoc)
143
     *
144
     * @see
145
     * org.gvsig.fmap.geom.primitive.Surface#addInteriorRing(org.gvsig.fmap.
146
     * geom.primitive.Line)
147
     */
148
    public void addInteriorRing(Line line) {
149
        Ring2D ring = new Ring2D();
150
        ring.ensureCapacity(line.getNumVertices());
151
        for(int i=0; i<line.getNumVertices(); i++){
152
            Point vertex = line.getVertex(i);
153
            ring.addVertex(new Point2D(vertex.getX(), vertex.getY()));
154
        }
155
        ring.closePrimitive();
156
        interiorRings.add(ring);
157
    }
158

    
159
    /*
160
     * (non-Javadoc)
161
     *
162
     * @see
163
     * org.gvsig.fmap.geom.primitive.Surface#addInteriorRing(org.gvsig.fmap.
164
     * geom.primitive.Polygon)
165
     */
166
    public void addInteriorRing(Polygon polygon) {
167
        Ring2D ring = new Ring2D();
168
        ring.ensureCapacity(polygon.getNumVertices());
169
        for(int i=0; i<polygon.getNumVertices(); i++){
170
            Point vertex = polygon.getVertex(i);
171
            ring.addVertex(new Point2D(vertex.getX(), vertex.getY()));
172
        }
173
        ring.closePrimitive();
174
        interiorRings.add(ring);
175
    }
176

    
177
    /*
178
     * (non-Javadoc)
179
     *
180
     * @see org.gvsig.fmap.geom.primitive.Surface#removeInteriorRing(int)
181
     */
182
    public void removeInteriorRing(int index) {
183
        interiorRings.remove(index);
184
    }
185

    
186
    /* (non-Javadoc)
187
     * @see org.gvsig.fmap.geom.primitive.Line#toLines()
188
     */
189
    public MultiLine toLines() throws GeometryException {
190
        MultiLine multiLine = new MultiLine2D();
191
        multiLine.addPrimitive(new Line2D(coordinates.toCoordinateArray()));
192
        return multiLine;
193
    }
194

    
195
    /* (non-Javadoc)
196
     * @see org.gvsig.fmap.geom.primitive.Line#toPolygons()
197
     */
198
    public MultiPolygon toPolygons() throws GeometryException {
199
        MultiPolygon multiPolygon = new MultiPolygon2D();
200
        multiPolygon.addPrimitive(this);
201
        return multiPolygon;
202
    }
203

    
204
    /* (non-Javadoc)
205
     * @see org.gvsig.fmap.geom.jts.GeometryJTS#getJTS()
206
     */
207
    public com.vividsolutions.jts.geom.Geometry getJTS() {
208
        return JTSUtils.createJTSPolygon(coordinates, interiorRings);
209
    }
210

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

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

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