Revision 5878 trunk/libraries/libFMap/src/com/iver/cit/gvsig/fmap/core/FGeometryCollection.java
FGeometryCollection.java | ||
---|---|---|
49 | 49 |
import java.awt.geom.Rectangle2D; |
50 | 50 |
import java.io.IOException; |
51 | 51 |
import java.util.ArrayList; |
52 |
import java.util.Comparator; |
|
53 |
import java.util.TreeMap; |
|
52 | 54 |
|
53 | 55 |
import org.cresques.cts.ICoordTrans; |
54 | 56 |
import org.geotools.data.postgis.attributeio.WKBEncoder; |
... | ... | |
69 | 71 |
*/ |
70 | 72 |
public class FGeometryCollection implements IGeometry { |
71 | 73 |
private ArrayList geometries = new ArrayList(); |
72 |
|
|
74 |
private int type=FShape.LINE; |
|
73 | 75 |
/** |
74 | 76 |
* Crea un nuevo FGeometryCollection. |
75 | 77 |
* |
... | ... | |
120 | 122 |
*/ |
121 | 123 |
public boolean intersects(Rectangle2D r) { |
122 | 124 |
boolean resul = false; |
123 |
for (int i = 0; i < geometries.size(); i++) |
|
124 |
{ |
|
125 |
resul = ((IGeometry)geometries.get(i)).intersects(r); |
|
126 |
if (resul) break; |
|
125 |
if (type==FShape.LINE) { |
|
126 |
for (int i = 0; i < geometries.size(); i++){ |
|
127 |
resul = ((IGeometry)geometries.get(i)).intersects(r); |
|
128 |
if (resul) break; |
|
129 |
} |
|
130 |
}else if (type==FShape.POLYGON) { |
|
131 |
GeneralPathX gpx=new GeneralPathX(); |
|
132 |
Handler lastHandler=null; |
|
133 |
for (int i = 0; i < geometries.size(); i++) { |
|
134 |
IGeometry geom=(IGeometry)geometries.get(i); |
|
135 |
GeneralPathXIterator gpxi=(GeneralPathXIterator)geom.getPathIterator(null); |
|
136 |
Handler[] handlers=geom.getHandlers(IGeometry.SELECTHANDLER); |
|
137 |
if (lastHandler==null || handlers[0].getPoint().distance(lastHandler.getPoint())==0) { |
|
138 |
gpx.append(gpxi,true); |
|
139 |
}else { |
|
140 |
gpx.append(gpxi,false); |
|
141 |
} |
|
142 |
lastHandler=handlers[handlers.length-1]; |
|
143 |
} |
|
144 |
resul=ShapeFactory.createPolygon2D(gpx).intersects(r); |
|
127 | 145 |
} |
128 |
|
|
129 | 146 |
return resul; |
130 | 147 |
} |
131 | 148 |
|
... | ... | |
156 | 173 |
|
157 | 174 |
return ret; |
158 | 175 |
*/ |
159 |
return FShape.LINE;
|
|
176 |
return type;
|
|
160 | 177 |
} |
161 |
|
|
178 |
public void setGeometryType(int type) { |
|
179 |
this.type=type; |
|
180 |
} |
|
162 | 181 |
/* (non-Javadoc) |
163 | 182 |
* @see com.iver.cit.gvsig.fmap.core.IGeometry#draw(java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort, com.iver.cit.gvsig.fmap.core.v02.FSymbol) |
164 | 183 |
*/ |
165 | 184 |
public void draw(Graphics2D g, ViewPort vp, FSymbol symbol) { |
166 |
for (int i = 0; i < geometries.size(); i++) |
|
167 |
((IGeometry)geometries.get(i)).draw(g, vp, symbol); |
|
185 |
if (type==FShape.LINE) { |
|
186 |
for (int i = 0; i < geometries.size(); i++) |
|
187 |
((IGeometry)geometries.get(i)).draw(g, vp, symbol); |
|
188 |
}else if (type==FShape.POLYGON) { |
|
189 |
//GeneralPathXIterator gpxi=(GeneralPathXIterator)getPathIterator(null); |
|
190 |
GeneralPathX gpx=new GeneralPathX(); |
|
191 |
Handler lastHandler=null; |
|
192 |
for (int i = 0; i < geometries.size(); i++) { |
|
193 |
IGeometry geom=(IGeometry)geometries.get(i); |
|
194 |
GeneralPathXIterator gpxi=(GeneralPathXIterator)geom.getPathIterator(null); |
|
195 |
Handler[] handlers=geom.getHandlers(IGeometry.SELECTHANDLER); |
|
196 |
if (lastHandler==null || handlers[0].getPoint().distance(lastHandler.getPoint())==0) { |
|
197 |
gpx.append(gpxi,true); |
|
198 |
}else { |
|
199 |
gpx.append(gpxi,false); |
|
200 |
} |
|
201 |
lastHandler=handlers[handlers.length-1]; |
|
202 |
} |
|
203 |
ShapeFactory.createPolygon2D(gpx).draw(g,vp,symbol); |
|
204 |
} |
|
168 | 205 |
} |
169 | 206 |
|
170 | 207 |
/* (non-Javadoc) |
... | ... | |
175 | 212 |
|
176 | 213 |
for (int i = 0; i < geometries.size(); i++) |
177 | 214 |
newGeometries[i] = ((IGeometry)geometries.get(i)).cloneGeometry(); |
178 |
|
|
179 |
return new FGeometryCollection(newGeometries); |
|
215 |
FGeometryCollection gc=new FGeometryCollection(newGeometries); |
|
216 |
gc.type=type; |
|
217 |
return gc; |
|
180 | 218 |
} |
181 | 219 |
|
182 | 220 |
/* (non-Javadoc) |
... | ... | |
189 | 227 |
theGeoms[i] = ((IGeometry)geometries.get(i)).toJTSGeometry(); |
190 | 228 |
} |
191 | 229 |
GeometryCollection geomCol = new GeometryFactory().createGeometryCollection(theGeoms); |
192 |
|
|
193 |
|
|
230 |
|
|
231 |
|
|
194 | 232 |
return geomCol; |
195 | 233 |
} |
196 | 234 |
|
... | ... | |
285 | 323 |
* @see com.iver.cit.gvsig.fmap.core.IGeometry#drawInts(java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort, com.iver.cit.gvsig.fmap.core.v02.FSymbol) |
286 | 324 |
*/ |
287 | 325 |
public void drawInts(Graphics2D g, ViewPort vp, FSymbol symbol) { |
288 |
for (int i = 0; i < geometries.size(); i++) |
|
289 |
((IGeometry)geometries.get(i)).drawInts(g, vp, symbol); |
|
326 |
if (type==FShape.LINE) { |
|
327 |
for (int i = 0; i < geometries.size(); i++) |
|
328 |
((IGeometry)geometries.get(i)).drawInts(g, vp, symbol); |
|
329 |
}else if (type==FShape.POLYGON) { |
|
330 |
//GeneralPathXIterator gpxi=(GeneralPathXIterator)getPathIterator(null); |
|
331 |
GeneralPathX gpx=new GeneralPathX(); |
|
332 |
Handler lastHandler=null; |
|
333 |
for (int i = 0; i < geometries.size(); i++) { |
|
334 |
IGeometry geom=(IGeometry)geometries.get(i); |
|
335 |
GeneralPathXIterator gpxi=(GeneralPathXIterator)geom.getPathIterator(null); |
|
336 |
Handler[] handlers=geom.getHandlers(IGeometry.SELECTHANDLER); |
|
337 |
if (lastHandler==null || handlers[0].getPoint().distance(lastHandler.getPoint())==0) { |
|
338 |
gpx.append(gpxi,true); |
|
339 |
}else { |
|
340 |
gpx.append(gpxi,false); |
|
341 |
} |
|
342 |
lastHandler=handlers[handlers.length-1]; |
|
343 |
} |
|
344 |
IGeometry geom=ShapeFactory.createPolygon2D(gpx); |
|
345 |
geom.setGeometryType(type); |
|
346 |
geom.drawInts(g,vp,symbol); |
|
347 |
} |
|
290 | 348 |
|
291 | 349 |
} |
292 | 350 |
|
... | ... | |
315 | 373 |
for (int i = 0; i < geometries.size(); i++){ |
316 | 374 |
Handler[] handAux=((IGeometry)geometries.get(i)).getHandlers(type); |
317 | 375 |
for (int j=0;j<handAux.length;j++){ |
318 |
handlers.add(handAux[j]); |
|
376 |
if (!handlers.contains(handAux[j])) |
|
377 |
handlers.add(handAux[j]); |
|
319 | 378 |
} |
320 | 379 |
} |
321 | 380 |
return (Handler[])handlers.toArray(new Handler[0]); |
... | ... | |
363 | 422 |
} |
364 | 423 |
|
365 | 424 |
public boolean intersects(double x, double y, double w, double h) { |
366 |
boolean bRes; |
|
367 |
for (int i=0; i < geometries.size(); i++) |
|
368 |
{ |
|
369 |
IGeometry gAux = (IGeometry) geometries.get(i); |
|
370 |
bRes = gAux.intersects(x,y, w, h); |
|
371 |
if (bRes) return bRes; |
|
425 |
boolean resul = false; |
|
426 |
if (type==FShape.LINE) { |
|
427 |
for (int i=0; i < geometries.size(); i++){ |
|
428 |
IGeometry gAux = (IGeometry) geometries.get(i); |
|
429 |
resul= gAux.intersects(x,y, w, h); |
|
430 |
if (resul) break; |
|
431 |
} |
|
432 |
}else if (type==FShape.POLYGON) { |
|
433 |
GeneralPathX gpx=new GeneralPathX(); |
|
434 |
Handler lastHandler=null; |
|
435 |
for (int i = 0; i < geometries.size(); i++) { |
|
436 |
IGeometry geom=(IGeometry)geometries.get(i); |
|
437 |
GeneralPathXIterator gpxi=(GeneralPathXIterator)geom.getPathIterator(null); |
|
438 |
Handler[] handlers=geom.getHandlers(IGeometry.SELECTHANDLER); |
|
439 |
if (lastHandler==null || handlers[0].getPoint().distance(lastHandler.getPoint())==0) { |
|
440 |
gpx.append(gpxi,true); |
|
441 |
}else { |
|
442 |
gpx.append(gpxi,false); |
|
443 |
} |
|
444 |
lastHandler=handlers[handlers.length-1]; |
|
445 |
} |
|
446 |
IGeometry geom=ShapeFactory.createPolygon2D(gpx); |
|
447 |
geom.setGeometryType(FShape.POLYGON); |
|
448 |
resul=geom.intersects(x,y,w,h); |
|
372 | 449 |
} |
373 |
|
|
374 |
return false; |
|
450 |
return resul; |
|
375 | 451 |
} |
376 | 452 |
|
377 | 453 |
public Rectangle getBounds() { |
... | ... | |
413 | 489 |
public Shape getInternalShape() { |
414 | 490 |
return this; |
415 | 491 |
} |
492 |
|
|
493 |
public int getOriginalGeometryType() { |
|
494 |
return type; |
|
495 |
} |
|
496 |
|
|
497 |
public boolean isClosed() { |
|
498 |
GeneralPathX gpx=new GeneralPathX(); |
|
499 |
PathIterator pi=getPathIterator(null); |
|
500 |
gpx.append(pi,true); |
|
501 |
return gpx.isClosed(); |
|
502 |
} |
|
416 | 503 |
} |
Also available in: Unified diff