Statistics
| Revision:

gvsig-geoprocess / org.gvsig.sextante / trunk / org.gvsig.sextante.app / org.gvsig.sextante.app.algorithm / org.gvsig.sextante.app.algorithm.base / src / main / java / org / gvsig / sextante / app / algorithm / base / util / GeometryUtil.java @ 25

History | View | Annotate | Download (6.03 KB)

1
/*
2
 * Created on 08-jul-2006
3
 *
4
 * gvSIG. Sistema de Informaci�n Geogr�fica de la Generalitat Valenciana
5
 *
6
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
7
 *
8
 * This program is free software; you can redistribute it and/or
9
 * modify it under the terms of the GNU General Public License
10
 * as published by the Free Software Foundation; either version 2
11
 * of the License, or (at your option) any later version.
12
 *
13
 * This program is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU General Public License
19
 * along with this program; if not, write to the Free Software
20
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
21
 *
22
 * For more information, contact:
23
 *
24
 *  Generalitat Valenciana
25
 *   Conselleria d'Infraestructures i Transport
26
 *   Av. Blasco Ib��ez, 50
27
 *   46010 VALENCIA
28
 *   SPAIN
29
 *
30
 *      +34 963862235
31
 *   gvsig@gva.es
32
 *      www.gvsig.gva.es
33
 *
34
 *    or
35
 *
36
 *   IVER T.I. S.A
37
 *   Salamanca 50
38
 *   46005 Valencia
39
 *   Spain
40
 *
41
 *   +34 963163400
42
 *   dac@iver.es
43
 */
44
/* CVS MESSAGES:
45
*
46
* $Id: GeometryUtil.java 6487 2006-07-21 09:08:57Z azabala $
47
* $Log$
48
* Revision 1.1  2006-07-21 09:08:57  azabala
49
* first version in cvs
50
*
51
*
52
*/
53
package org.gvsig.sextante.app.algorithm.base.util;
54

    
55
import java.util.ArrayList;
56

    
57
import com.vividsolutions.jts.geom.Coordinate;
58
import com.vividsolutions.jts.geom.Geometry;
59
import com.vividsolutions.jts.geom.GeometryFactory;
60
import com.vividsolutions.jts.geom.LineString;
61
import com.vividsolutions.jts.geom.LinearRing;
62
import com.vividsolutions.jts.geom.MultiPolygon;
63
import com.vividsolutions.jts.geom.Polygon;
64

    
65
public class GeometryUtil {
66
        
67
        private static GeometryFactory fact = new GeometryFactory();
68
        
69
        
70
        public static Polygon removeDuplicates(Polygon polygon){
71
                LineString shell = polygon.getExteriorRing();
72
                LineString newShell = removeDuplicates(shell);
73
                LinearRing[] holes = new LinearRing[polygon.getNumInteriorRing()];
74
                for(int i = 0; i < holes.length; i++){
75
                        holes[i] = (LinearRing) polygon.getInteriorRingN(i);
76
                }
77
                Polygon newPolygon = fact.createPolygon((LinearRing) newShell, holes);
78
                return newPolygon;
79
        }
80
        
81
        
82
        public static MultiPolygon removeDuplicates(MultiPolygon multiPolygon){
83
                Polygon[] pols = new Polygon[multiPolygon.getNumGeometries()];
84
                for(int i = 0; i < pols.length; i++){
85
                        Polygon pol = (Polygon) multiPolygon.getGeometryN(i);
86
                        Polygon newPol = removeDuplicates(pol);
87
                        pols[i] = newPol;
88
                }
89
                return fact.createMultiPolygon(pols);
90
        }
91
        
92
        public static Geometry removeDuplicatesFrom(Geometry geometry){
93
                Geometry solution = null;
94
                if(geometry instanceof LineString)
95
                        solution = removeDuplicates((LineString)geometry);
96
                else if(geometry instanceof Polygon)
97
                        solution = removeDuplicates((Polygon) geometry);
98
                else if(geometry instanceof MultiPolygon)
99
                        solution = removeDuplicates((MultiPolygon) geometry);
100
                else
101
                        solution = geometry;
102
                return solution;
103
        }
104
        
105
        
106
        
107
        
108
        
109
        
110
        public static LineString removeDuplicates(LineString line){
111
                ArrayList coordinates = new ArrayList();
112
                Coordinate prevCoord = null;
113
                Coordinate actualCoord = null;
114
                int numPoints = line.getNumPoints();
115
                for(int i = 0; i < numPoints; i++){
116
                        actualCoord = line.getCoordinateN(i);
117
                        if(prevCoord != null){
118
                                if(!prevCoord.equals2D(actualCoord)){
119
                                        coordinates.add(actualCoord);
120
                                }
121
                        }else{
122
                                coordinates.add(actualCoord);
123
                        }
124
                        prevCoord = actualCoord;
125
                }//for
126
                //llegados a este punto, construimos la nueva geometria
127
                Coordinate[] newCoord = new Coordinate[coordinates.size()];
128
                coordinates.toArray(newCoord);
129
                if(line instanceof LineString){
130
                        return fact.createLineString(newCoord);
131
                }else{
132
                        return fact.createLinearRing(newCoord);
133
                }
134
                
135
        }
136
        
137
        
138
        
139
        
140
        
141
        
142
        /**
143
         *  Elimina los puntos colineales de una linea.
144
         *  Tiene en cuenta una tolerancia dada en radianes, de manera que si dos 
145
         *  segmentos contiguos de la linea forman un angulo menor o igual que esa
146
         *  tolerancia, se consideraran colineales sus puntos. Por tanto, cuanto 
147
         *  mayor sea la tolerancia, mas puntos se eliminaran.
148
         * 
149
         * @param linea                                Linea original.
150
         * @param toleranciaAngulo        Tolerancia en radianes.
151
         * @return  Una nueva linea filtrada sin los puntos colineales.
152
         */        
153
//        public static Linea eliminarColineales(Linea linea, double toleranciaAngulo)
154
//        {
155
//                // linea de dos puntos: no hay nada que filtrar
156
//                if (linea.getNumPuntos() < 3) 
157
//                {
158
//                        try {
159
//                                return (Linea) linea.clone();
160
//                        }
161
//                        catch (CloneNotSupportedException e) {
162
//                                e.printStackTrace();
163
//                                return null;
164
//                        }                
165
//                }
166
//                
167
//                // linea de mas de dos puntos
168
//                Linea lineaFiltrada = new Linea();
169
//                cloneAndAddPunto(lineaFiltrada, linea.getPunto(0));
170
//                
171
//                // angulo del primer segmento de la linea
172
//                Punto p1 = linea.getPunto(0);
173
//                Punto p2 = linea.getPunto(1);                        
174
//                double anguloAnt = Math.atan2(p2.y - p1.y, p2.x - p1.x);
175
//                        
176
//                // para cada par de segmentos se van comparando los angulos
177
//                for (int i = 1, size = linea.getNumPuntos()-1; i < size; i++)
178
//                {
179
//                        p1 = linea.getPunto(i);
180
//                        p2 = linea.getPunto(i+1);
181
//                        
182
//                        double angulo = Math.atan2(p2.y - p1.y, p2.x - p1.x);
183
//                        
184
//                        if ( !((anguloAnt - toleranciaAngulo) <= angulo) || !((anguloAnt + toleranciaAngulo) >= angulo) )                        
185
//                        {
186
//                                cloneAndAddPunto(lineaFiltrada, p1);
187
//                        }
188
//                        anguloAnt = angulo;                                                                                                                
189
//                }
190
//                
191
//                // ultimo punto
192
//                cloneAndAddPunto(lineaFiltrada, linea.getPunto(linea.getNumPuntos()-1));                
193
//                return lineaFiltrada;
194
//        }
195
        
196
        
197
        /**
198
         *  Dado un punto, lo clona y lo a�ade a una linea dada.
199
         *  Metodo para ahorrar lineas de codigo.
200
         *
201
         * @param linea Linea a la que se a�ade el punto.
202
         * @param p     Punto que se clona y se a�ade a la linea.
203
         */        
204
//        private static void cloneAndAddPunto(Linea linea, Punto p)
205
//        {
206
//                try {
207
//                        Punto pc = (Punto) p.clone();
208
//                        linea.addPunto(pc);
209
//                }
210
//                catch (CloneNotSupportedException e) {
211
//                        e.printStackTrace();                                        
212
//                }                                
213
//        }
214
        
215
}
216