svn-gvsig-desktop / tags / v1_0_2_Build_899 / libraries / libFMap / src / com / iver / cit / gvsig / fmap / operations / strategies / AnnotationStrategy.java @ 10517
History | View | Annotate | Download (19.4 KB)
1 | 4213 | caballero | package com.iver.cit.gvsig.fmap.operations.strategies; |
---|---|---|---|
2 | |||
3 | 4795 | caballero | import java.awt.Color; |
4 | 4226 | caballero | import java.awt.FontMetrics; |
5 | 4213 | caballero | import java.awt.Graphics2D; |
6 | 4256 | caballero | import java.awt.geom.AffineTransform; |
7 | 4213 | caballero | import java.awt.geom.Point2D; |
8 | import java.awt.geom.Rectangle2D; |
||
9 | import java.awt.image.BufferedImage; |
||
10 | import java.io.IOException; |
||
11 | import java.util.BitSet; |
||
12 | import java.util.List; |
||
13 | |||
14 | import org.apache.log4j.Logger; |
||
15 | import org.cresques.cts.ICoordTrans; |
||
16 | import org.geotools.resources.geometry.XRectangle2D; |
||
17 | |||
18 | import com.iver.cit.gvsig.fmap.DriverException; |
||
19 | import com.iver.cit.gvsig.fmap.ViewPort; |
||
20 | 4795 | caballero | import com.iver.cit.gvsig.fmap.core.FPoint2D; |
21 | import com.iver.cit.gvsig.fmap.core.FShape; |
||
22 | 4213 | caballero | import com.iver.cit.gvsig.fmap.core.GeneralPathX; |
23 | import com.iver.cit.gvsig.fmap.core.IGeometry; |
||
24 | 8765 | jjdelcerro | import com.iver.cit.gvsig.fmap.core.ISymbol; |
25 | 4213 | caballero | import com.iver.cit.gvsig.fmap.core.ShapeFactory; |
26 | import com.iver.cit.gvsig.fmap.core.v02.FGraphicUtilities; |
||
27 | import com.iver.cit.gvsig.fmap.core.v02.FLabel; |
||
28 | import com.iver.cit.gvsig.fmap.core.v02.FSymbol; |
||
29 | import com.iver.cit.gvsig.fmap.drivers.BoundedShapes; |
||
30 | import com.iver.cit.gvsig.fmap.drivers.DriverAttributes; |
||
31 | import com.iver.cit.gvsig.fmap.drivers.DriverIOException; |
||
32 | import com.iver.cit.gvsig.fmap.drivers.VectorialFileDriver; |
||
33 | import com.iver.cit.gvsig.fmap.layers.FBitSet; |
||
34 | import com.iver.cit.gvsig.fmap.layers.FLayer; |
||
35 | import com.iver.cit.gvsig.fmap.layers.FLyrAnnotation; |
||
36 | import com.iver.cit.gvsig.fmap.layers.FLyrVect; |
||
37 | import com.iver.cit.gvsig.fmap.layers.ReadableVectorial; |
||
38 | 5479 | caballero | import com.iver.cit.gvsig.fmap.layers.SpatialCache; |
39 | 4213 | caballero | import com.iver.cit.gvsig.fmap.layers.layerOperations.AlphanumericData; |
40 | import com.iver.cit.gvsig.fmap.layers.layerOperations.ClassifiableVectorial; |
||
41 | import com.iver.cit.gvsig.fmap.layers.layerOperations.Selectable; |
||
42 | import com.iver.cit.gvsig.fmap.layers.layerOperations.SingleLayer; |
||
43 | import com.iver.cit.gvsig.fmap.rendering.VectorialLegend; |
||
44 | import com.iver.cit.gvsig.fmap.rendering.styling.FStyle2D; |
||
45 | 5317 | fjp | import com.iver.utiles.swing.threads.Cancellable; |
46 | 4213 | caballero | import com.vividsolutions.jts.geom.Geometry; |
47 | import com.vividsolutions.jts.geom.IntersectionMatrix; |
||
48 | |||
49 | |||
50 | /**
|
||
51 | * Esta clase se encargar? de dibujar de la forma m?s eficiente los temas de
|
||
52 | * anotaciones.
|
||
53 | *
|
||
54 | * @author Vicente Caballero Navarro
|
||
55 | */
|
||
56 | public class AnnotationStrategy extends DefaultStrategy { |
||
57 | private static Logger logger = Logger.getLogger(AnnotationStrategy.class.getName()); |
||
58 | 4795 | caballero | private FSymbol symbolPoint=new FSymbol(FShape.POINT,Color.black); |
59 | 4954 | caballero | private Graphics2D graphics=null; |
60 | private ViewPort viewPort=null; |
||
61 | 5523 | caballero | private double heightDefault=-1; |
62 | 4213 | caballero | /**
|
63 | * Crea un nuevo AnotationStrategy.
|
||
64 | *
|
||
65 | * @param layer DOCUMENT ME!
|
||
66 | */
|
||
67 | public AnnotationStrategy(FLayer layer) {
|
||
68 | super(layer);
|
||
69 | capa = (FLyrAnnotation) layer; |
||
70 | 4795 | caballero | symbolPoint.setSize(5);
|
71 | 4213 | caballero | } |
72 | /**
|
||
73 | * @see com.iver.cit.gvsig.fmap.operations.LayerOperations#draw(java.awt.image.BufferedImage,
|
||
74 | 8765 | jjdelcerro | * java.awt.Graphics2D, ISymbol)
|
75 | 4213 | caballero | */
|
76 | public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort, |
||
77 | Cancellable cancel) throws DriverException {
|
||
78 | 5123 | caballero | Rectangle2D elExtent = viewPort.getAdjustedExtent();
|
79 | 4954 | caballero | graphics=g; |
80 | 4226 | caballero | FLyrAnnotation lyrAnnotation=(FLyrAnnotation)capa; |
81 | 5490 | caballero | List lstIndexes=null; |
82 | 5131 | caballero | |
83 | 5124 | caballero | VectorialLegend l=(VectorialLegend)lyrAnnotation.getLegend(); |
84 | 4226 | caballero | FBitSet bitSet=lyrAnnotation.getRecordset().getSelection(); |
85 | 5123 | caballero | |
86 | 4256 | caballero | boolean inPixels=lyrAnnotation.isInPixels();
|
87 | 8765 | jjdelcerro | FSymbol theSymbol = (FSymbol) l.getDefaultSymbol(); |
88 | 4256 | caballero | theSymbol.setFontSizeInPixels(inPixels); |
89 | 4213 | caballero | System.out.println("Dibujando Anotaciones..."); |
90 | 4954 | caballero | this.viewPort=viewPort;//capa.getFMap().getViewPort(); |
91 | AffineTransform at=viewPort.getAffineTransform();
|
||
92 | 5124 | caballero | try {
|
93 | 5131 | caballero | int sc;
|
94 | 5490 | caballero | sc=lyrAnnotation.getSource().getShapeCount(); |
95 | // If area of needed extent is less than fullExtent / 4,
|
||
96 | // it will be worthy to use SpatialIndex.
|
||
97 | // Otherwhise, we will not use it.
|
||
98 | boolean bUseSpatialIndex = false; |
||
99 | if(lyrAnnotation.getISpatialIndex() != null) |
||
100 | { |
||
101 | if(isSpatialIndexNecessary(elExtent)){
|
||
102 | lstIndexes = lyrAnnotation.getISpatialIndex().query(elExtent); |
||
103 | sc = lstIndexes.size(); |
||
104 | System.out.println("LISTA DEL SPATIALINDEX.SIZE = " + sc); |
||
105 | bUseSpatialIndex = true;
|
||
106 | }//if
|
||
107 | }//if
|
||
108 | |||
109 | 5184 | caballero | FontMetrics metrics = g.getFontMetrics();
|
110 | 5874 | fjp | SpatialCache cache = lyrAnnotation.getSpatialCache(); |
111 | cache.clearAll(); |
||
112 | 5511 | caballero | int numOriginal;
|
113 | 5131 | caballero | for (int numReg = 0; numReg < sc; numReg++) { |
114 | 5511 | caballero | if (cancel.isCanceled()){
|
115 | 4213 | caballero | break;
|
116 | } |
||
117 | 5511 | caballero | if (bUseSpatialIndex){
|
118 | 5490 | caballero | Integer idRec = (Integer) lstIndexes.get(numReg); |
119 | 5511 | caballero | numOriginal = idRec.intValue(); |
120 | }else{
|
||
121 | numOriginal = numReg; |
||
122 | 5490 | caballero | } |
123 | /* if (lyrAnnotation.getSource() instanceof EditableAdapter)
|
||
124 | numOriginal=((EditableAdapter)lyrAnnotation.getSource()).getCalculatedIndex(numOriginal);*/
|
||
125 | 4954 | caballero | |
126 | 5490 | caballero | FLabel theLabel = lyrAnnotation.getLabel(numOriginal); |
127 | 4213 | caballero | if ((theLabel == null) || (theLabel.getOrig() == null)) |
128 | continue;
|
||
129 | 4256 | caballero | |
130 | 5523 | caballero | |
131 | Rectangle2D r=null; |
||
132 | if (inPixels && lyrAnnotation.getMapping().getColumnHeight()==-1) { |
||
133 | r=getDefaultBoundBoxinPixels(metrics,theLabel.getOrig(),theLabel.getString()); |
||
134 | }else {
|
||
135 | r=getBoundBox(theLabel.getOrig(),(float)theLabel.getHeight(), theLabel.getJustification(),theLabel.getString());
|
||
136 | } |
||
137 | 4213 | caballero | theLabel.setBoundBox(r); |
138 | 5511 | caballero | |
139 | 5490 | caballero | if (XRectangle2D.intersectInclusive(elExtent, r))
|
140 | { |
||
141 | 5511 | caballero | FPoint2D p=new FPoint2D(viewPort.fromMapPoint(new Point2D.Double(r.getX(),r.getY()))); |
142 | 8765 | jjdelcerro | symbolPoint.draw(g, at, p); |
143 | // FGraphicUtilities.DrawShape(g,at,p,symbolPoint);
|
||
144 | 5490 | caballero | if (bitSet.get(numOriginal)) {
|
145 | FGraphicUtilities.DrawAnnotation(g, at, theSymbol, theLabel,metrics,true);
|
||
146 | }else{
|
||
147 | FGraphicUtilities.DrawAnnotation(g, at, theSymbol, theLabel,metrics,false);
|
||
148 | } |
||
149 | 5479 | caballero | |
150 | |||
151 | 5874 | fjp | if (lyrAnnotation.isSpatialCacheEnabled())
|
152 | { |
||
153 | if (cache.getMaxFeatures() >= cache.size())
|
||
154 | 5479 | caballero | { |
155 | 5874 | fjp | // Ya reproyectado todo
|
156 | IGeometry geo=ShapeFactory.createPoint2D(r.getX(),r.getY()); |
||
157 | Rectangle2D re= new Rectangle2D.Double(r.getX(),r.getY(),1,1); |
||
158 | cache.insert(re, geo); |
||
159 | 5479 | caballero | } |
160 | 5874 | fjp | } |
161 | 5490 | caballero | } // XIntersects
|
162 | 5479 | caballero | |
163 | |||
164 | 4213 | caballero | } |
165 | 5479 | caballero | |
166 | 5523 | caballero | // System.out.println("..................Fin del dibujado ..............");
|
167 | 5124 | caballero | } catch (DriverIOException e) {
|
168 | e.printStackTrace(); |
||
169 | } |
||
170 | 5523 | caballero | heightDefault=-1;
|
171 | 4213 | caballero | } |
172 | 5685 | caballero | /**
|
173 | * @see com.iver.cit.gvsig.fmap.operations.LayerOperations#draw(java.awt.image.BufferedImage,
|
||
174 | 8765 | jjdelcerro | * java.awt.Graphics2D, ISymbol)
|
175 | 5685 | caballero | */
|
176 | public void print(BufferedImage image, Graphics2D g, ViewPort viewPort, |
||
177 | Cancellable cancel) throws DriverException {
|
||
178 | Rectangle2D elExtent = viewPort.getAdjustedExtent();
|
||
179 | graphics=g; |
||
180 | FLyrAnnotation lyrAnnotation=(FLyrAnnotation)capa; |
||
181 | List lstIndexes=null; |
||
182 | |||
183 | VectorialLegend l=(VectorialLegend)lyrAnnotation.getLegend(); |
||
184 | FBitSet bitSet=lyrAnnotation.getRecordset().getSelection(); |
||
185 | |||
186 | boolean inPixels=lyrAnnotation.isInPixels();
|
||
187 | 8765 | jjdelcerro | FSymbol theSymbol = (FSymbol) l.getDefaultSymbol(); |
188 | 5685 | caballero | theSymbol.setFontSizeInPixels(inPixels); |
189 | this.viewPort=viewPort;//capa.getFMap().getViewPort(); |
||
190 | AffineTransform at=viewPort.getAffineTransform();
|
||
191 | try {
|
||
192 | int sc;
|
||
193 | sc=lyrAnnotation.getSource().getShapeCount(); |
||
194 | // If area of needed extent is less than fullExtent / 4,
|
||
195 | // it will be worthy to use SpatialIndex.
|
||
196 | // Otherwhise, we will not use it.
|
||
197 | boolean bUseSpatialIndex = false; |
||
198 | if(lyrAnnotation.getISpatialIndex() != null) |
||
199 | { |
||
200 | if(isSpatialIndexNecessary(elExtent)){
|
||
201 | lstIndexes = lyrAnnotation.getISpatialIndex().query(elExtent); |
||
202 | sc = lstIndexes.size(); |
||
203 | bUseSpatialIndex = true;
|
||
204 | }//if
|
||
205 | }//if
|
||
206 | |||
207 | FontMetrics metrics = g.getFontMetrics();
|
||
208 | //SpatialCache cache = lyrAnnotation.createSpatialCache();
|
||
209 | int numOriginal;
|
||
210 | for (int numReg = 0; numReg < sc; numReg++) { |
||
211 | if (cancel.isCanceled()){
|
||
212 | break;
|
||
213 | } |
||
214 | if (bUseSpatialIndex){
|
||
215 | Integer idRec = (Integer) lstIndexes.get(numReg); |
||
216 | numOriginal = idRec.intValue(); |
||
217 | }else{
|
||
218 | numOriginal = numReg; |
||
219 | } |
||
220 | /* if (lyrAnnotation.getSource() instanceof EditableAdapter)
|
||
221 | numOriginal=((EditableAdapter)lyrAnnotation.getSource()).getCalculatedIndex(numOriginal);*/
|
||
222 | |||
223 | FLabel theLabel = lyrAnnotation.getLabel(numOriginal); |
||
224 | if ((theLabel == null) || (theLabel.getOrig() == null)) |
||
225 | continue;
|
||
226 | |||
227 | |||
228 | Rectangle2D r=null; |
||
229 | if (inPixels && lyrAnnotation.getMapping().getColumnHeight()==-1) { |
||
230 | r=getDefaultBoundBoxinPixels(metrics,theLabel.getOrig(),theLabel.getString()); |
||
231 | }else {
|
||
232 | r=getBoundBox(theLabel.getOrig(),(float)theLabel.getHeight(), theLabel.getJustification(),theLabel.getString());
|
||
233 | } |
||
234 | theLabel.setBoundBox(r); |
||
235 | |||
236 | if (XRectangle2D.intersectInclusive(elExtent, r))
|
||
237 | { |
||
238 | FPoint2D p=new FPoint2D(viewPort.fromMapPoint(new Point2D.Double(r.getX(),r.getY()))); |
||
239 | FGraphicUtilities.DrawShape(g,at,p,symbolPoint); |
||
240 | if (bitSet.get(numOriginal)) {
|
||
241 | FGraphicUtilities.DrawAnnotation(g, at, theSymbol, theLabel,metrics,true);
|
||
242 | }else{
|
||
243 | FGraphicUtilities.DrawAnnotation(g, at, theSymbol, theLabel,metrics,false);
|
||
244 | } |
||
245 | |||
246 | |||
247 | } // XIntersects
|
||
248 | |||
249 | |||
250 | } |
||
251 | |||
252 | } catch (DriverIOException e) {
|
||
253 | e.printStackTrace(); |
||
254 | } |
||
255 | heightDefault=-1;
|
||
256 | } |
||
257 | |||
258 | 5523 | caballero | public Rectangle2D getDefaultBoundBoxinPixels(FontMetrics metrics, |
259 | Point2D p, String s) { |
||
260 | int w = metrics.stringWidth(s);
|
||
261 | double width = viewPort.toMapDistance(w);
|
||
262 | if (heightDefault == -1) { |
||
263 | int h = metrics.getMaxAscent();
|
||
264 | heightDefault = viewPort.toMapDistance(h); |
||
265 | } |
||
266 | return new Rectangle2D.Double(p.getX(), p.getY(), width, heightDefault); |
||
267 | |||
268 | } |
||
269 | 5685 | caballero | |
270 | 4213 | caballero | /**
|
271 | 5523 | caballero | * Construcci?n del rect?ngulo
|
272 | *
|
||
273 | * @param p
|
||
274 | * @param g
|
||
275 | * DOCUMENT ME!
|
||
276 | * @param justification
|
||
277 | * DOCUMENT ME!
|
||
278 | * @param vp
|
||
279 | * DOCUMENT ME!
|
||
280 | *
|
||
281 | * @return
|
||
282 | */
|
||
283 | 4954 | caballero | public Rectangle2D getBoundBox(Point2D p, float hp, |
284 | int justification,String s) { |
||
285 | 5479 | caballero | //Rectangle2D bounding=null;
|
286 | 4256 | caballero | if (((FLyrAnnotation)capa).isInPixels()){
|
287 | 4954 | caballero | graphics.setFont(graphics.getFont().deriveFont(hp)); |
288 | 4256 | caballero | }else{
|
289 | 4954 | caballero | float alturaPixels = (float) ((hp * viewPort.getAffineTransform().getScaleX())*FLabel.SQUARE); |
290 | graphics.setFont(graphics.getFont().deriveFont(alturaPixels)); |
||
291 | 4256 | caballero | } |
292 | 4954 | caballero | FontMetrics metrics = graphics.getFontMetrics();
|
293 | 4226 | caballero | int w = metrics.stringWidth(s);
|
294 | 4954 | caballero | double width = viewPort.toMapDistance(w);
|
295 | 4226 | caballero | int h = metrics.getMaxAscent();
|
296 | 4954 | caballero | double height = viewPort.toMapDistance(h);
|
297 | 5198 | caballero | //double dist = viewPort.toMapDistance(3);
|
298 | return new Rectangle2D.Double(p.getX(), p.getY(), width, height); |
||
299 | /* switch (justification) {
|
||
300 | 4226 | caballero | case FLabel.LEFT_BOTTOM:
|
301 | 5198 | caballero | bounding=justification(p, width,height, 0, 0);
|
302 | 4226 | caballero | |
303 | break;
|
||
304 | |||
305 | case FLabel.LEFT_CENTER:
|
||
306 | bounding=justification(p, width,height, 0, -(height / 2));
|
||
307 | |||
308 | break;
|
||
309 | |||
310 | case FLabel.LEFT_TOP:
|
||
311 | bounding=justification(p,width,height, 0, -height);
|
||
312 | |||
313 | break;
|
||
314 | |||
315 | case FLabel.CENTER_BOTTOM:
|
||
316 | bounding=justification(p, width,height, -(width / 2), -dist);
|
||
317 | |||
318 | break;
|
||
319 | |||
320 | case FLabel.CENTER_CENTER:
|
||
321 | bounding=justification(p, width,height, -(width / 2), -(height / 2));
|
||
322 | |||
323 | break;
|
||
324 | |||
325 | case FLabel.CENTER_TOP:
|
||
326 | bounding=justification(p, width,height, -(width / 2), -height);
|
||
327 | |||
328 | break;
|
||
329 | |||
330 | case FLabel.RIGHT_BOTTOM:
|
||
331 | bounding=justification(p, width,height, -width, -dist);
|
||
332 | |||
333 | break;
|
||
334 | |||
335 | case FLabel.RIGHT_CENTER:
|
||
336 | bounding=justification(p, width,height, -width, -(height / 2));
|
||
337 | |||
338 | break;
|
||
339 | |||
340 | case FLabel.RIGHT_TOP:
|
||
341 | bounding=justification(p, width,height, -width, -height);
|
||
342 | |||
343 | break;
|
||
344 | }
|
||
345 | |||
346 | return bounding;
|
||
347 | 5198 | caballero | */
|
348 | 4226 | caballero | } |
349 | 5198 | caballero | /* private Rectangle2D justification(Point2D p, double w,double h, double x, double y) {
|
350 | 4226 | caballero | Rectangle2D r=new Rectangle2D.Double(p.getX() + x, p.getY() - y, w, h);
|
351 | return r;
|
||
352 | }
|
||
353 | 5198 | caballero | */
|
354 | 4213 | caballero | |
355 | /* (non-Javadoc)
|
||
356 | * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#queryByShape(com.iver.cit.gvsig.fmap.core.IGeometry, int)
|
||
357 | */
|
||
358 | public FBitSet queryByShape(IGeometry g, int relationship) |
||
359 | throws DriverException, VisitException {
|
||
360 | // Si hay un ?ndice espacial, lo usamos para hacer el query.
|
||
361 | FLyrVect lyr = (FLyrVect) capa; |
||
362 | 4978 | azabala | // if (lyr.getSpatialIndex() == null)
|
363 | if(lyr.getISpatialIndex() == null) |
||
364 | 4213 | caballero | return super.queryByShape(g, relationship); |
365 | |||
366 | long t1 = System.currentTimeMillis(); |
||
367 | ReadableVectorial va = lyr.getSource(); |
||
368 | ICoordTrans ct = lyr.getCoordTrans(); |
||
369 | Rectangle2D bounds = g.getBounds2D();
|
||
370 | 4978 | azabala | // Coordinate c1 = new Coordinate(bounds.getMinX(), bounds.getMinY());
|
371 | // Coordinate c2 = new Coordinate(bounds.getMaxX(), bounds.getMaxY());
|
||
372 | // Envelope env = new Envelope(c1, c2);
|
||
373 | // List lstRecs = lyr.getSpatialIndex().query(env);
|
||
374 | List lstRecs = lyr.getISpatialIndex().query(bounds);
|
||
375 | 4213 | caballero | Integer idRec;
|
376 | FBitSet bitset = new FBitSet();
|
||
377 | Geometry jtsShape = g.toJTSGeometry(); |
||
378 | IntersectionMatrix m; |
||
379 | int index;
|
||
380 | try {
|
||
381 | va.start(); |
||
382 | |||
383 | for (int i=0; i < lstRecs.size(); i++) |
||
384 | { |
||
385 | idRec = (Integer) lstRecs.get(i);
|
||
386 | index = idRec.intValue(); |
||
387 | IGeometry geom=getGeometry(((FLyrAnnotation)capa).getLabel(index).getBoundBox()); |
||
388 | if (ct != null) { |
||
389 | geom.reProject(ct); |
||
390 | } |
||
391 | Geometry jtsGeom = geom.toJTSGeometry(); |
||
392 | switch (relationship) {
|
||
393 | case CONTAINS:
|
||
394 | m = jtsShape.relate(jtsGeom); |
||
395 | if (m.isContains()) {
|
||
396 | bitset.set(index, true);
|
||
397 | } |
||
398 | break;
|
||
399 | |||
400 | case CROSSES:
|
||
401 | m = jtsShape.relate(jtsGeom); |
||
402 | if (m.isCrosses(jtsGeom.getDimension(), jtsShape.getDimension())) {
|
||
403 | bitset.set(index, true);
|
||
404 | } |
||
405 | break;
|
||
406 | |||
407 | case DISJOINT:
|
||
408 | // TODO: CREO QUE EL DISJOINT NO SE PUEDE METER AQUI
|
||
409 | m = jtsShape.relate(jtsGeom); |
||
410 | if (m.isDisjoint()) {
|
||
411 | bitset.set(index, true);
|
||
412 | } |
||
413 | break;
|
||
414 | |||
415 | case EQUALS:
|
||
416 | m = jtsShape.relate(jtsGeom); |
||
417 | if (m.isEquals(jtsGeom.getDimension(), jtsShape.getDimension())) {
|
||
418 | bitset.set(index, true);
|
||
419 | } |
||
420 | break;
|
||
421 | |||
422 | case INTERSECTS:
|
||
423 | m = jtsShape.relate(jtsGeom); |
||
424 | if (m.isIntersects()) {
|
||
425 | bitset.set(index, true);
|
||
426 | } |
||
427 | break;
|
||
428 | |||
429 | case OVERLAPS:
|
||
430 | m = jtsShape.relate(jtsGeom); |
||
431 | if (m.isOverlaps(jtsGeom.getDimension(), jtsShape.getDimension()))
|
||
432 | { |
||
433 | bitset.set(index, true);
|
||
434 | } |
||
435 | |||
436 | break;
|
||
437 | |||
438 | case TOUCHES:
|
||
439 | m = jtsShape.relate(jtsGeom); |
||
440 | if (m.isTouches(jtsGeom.getDimension(), jtsShape.getDimension()))
|
||
441 | { |
||
442 | bitset.set(index, true);
|
||
443 | } |
||
444 | |||
445 | break;
|
||
446 | |||
447 | case WITHIN:
|
||
448 | m = jtsShape.relate(jtsGeom); |
||
449 | if (m.isWithin()) {
|
||
450 | bitset.set(index, true);
|
||
451 | } |
||
452 | |||
453 | break;
|
||
454 | } |
||
455 | } |
||
456 | va.stop(); |
||
457 | } catch (DriverIOException e) {
|
||
458 | // TODO Auto-generated catch block
|
||
459 | e.printStackTrace(); |
||
460 | } |
||
461 | long t2 = System.currentTimeMillis(); |
||
462 | logger.debug("queryByShape optimizado sobre la capa " + lyr.getName() + ". " + (t2-t1) + " mseg."); |
||
463 | return bitset;
|
||
464 | } |
||
465 | public FBitSet queryByRect(Rectangle2D rect) throws DriverException { |
||
466 | // Si hay un ?ndice espacial, lo usamos para hacer el query.
|
||
467 | FLyrAnnotation lyr = (FLyrAnnotation) capa; |
||
468 | 4978 | azabala | // if (lyr.getSpatialIndex() == null)
|
469 | if(lyr.getISpatialIndex() == null) |
||
470 | 4213 | caballero | return super.queryByRect(rect); |
471 | |||
472 | ReadableVectorial va = lyr.getSource(); |
||
473 | ICoordTrans ct = lyr.getCoordTrans(); |
||
474 | Rectangle2D bounds = rect;
|
||
475 | 4978 | azabala | // Coordinate c1 = new Coordinate(bounds.getMinX(), bounds.getMinY());
|
476 | // Coordinate c2 = new Coordinate(bounds.getMaxX(), bounds.getMaxY());
|
||
477 | // Envelope env = new Envelope(c1, c2);
|
||
478 | //
|
||
479 | // List lstRecs = lyr.getSpatialIndex().query(env);
|
||
480 | //azabala
|
||
481 | List lstRecs = lyr.getISpatialIndex().query(bounds);
|
||
482 | 4213 | caballero | Integer idRec;
|
483 | FBitSet bitset = new FBitSet();
|
||
484 | int index;
|
||
485 | try {
|
||
486 | va.start(); |
||
487 | DriverAttributes attr = va.getDriverAttributes(); |
||
488 | boolean bMustClone = false; |
||
489 | if (attr != null) |
||
490 | { |
||
491 | if (attr.isLoadedInMemory())
|
||
492 | { |
||
493 | bMustClone = attr.isLoadedInMemory(); |
||
494 | } |
||
495 | } |
||
496 | |||
497 | for (int i=0; i < lstRecs.size(); i++) |
||
498 | { |
||
499 | idRec = (Integer) lstRecs.get(i);
|
||
500 | index = idRec.intValue(); |
||
501 | IGeometry geom=getGeometry(((FLyrAnnotation)capa).getLabel(index).getBoundBox()); |
||
502 | if (ct != null) { |
||
503 | if (bMustClone)
|
||
504 | geom = geom.cloneGeometry(); |
||
505 | geom.reProject(ct); |
||
506 | } |
||
507 | 4226 | caballero | //System.out.println("Rect?ngulo de selecci?n = "+ rect);
|
508 | //System.out.println("Rect?ngulo de la geometr?a = "+ geom.getBounds2D());
|
||
509 | 4213 | caballero | if (geom.intersects(rect)){
|
510 | bitset.set(index, true);
|
||
511 | } |
||
512 | |||
513 | } |
||
514 | va.stop(); |
||
515 | } catch (DriverIOException e) {
|
||
516 | // TODO Auto-generated catch block
|
||
517 | e.printStackTrace(); |
||
518 | } |
||
519 | return bitset;
|
||
520 | |||
521 | } |
||
522 | |||
523 | /* (non-Javadoc)
|
||
524 | * @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#queryByPoint(java.awt.geom.Point2D, double)
|
||
525 | */
|
||
526 | public FBitSet queryByPoint(Point2D p, double tolerance) |
||
527 | throws DriverException {
|
||
528 | // TODO: OJO!!!!. Est? implementado como un rectangulo.
|
||
529 | // Lo correcto deber?a ser calculando las distancias reales
|
||
530 | // es decir, con un c?rculo.
|
||
531 | Rectangle2D recPoint = new Rectangle2D.Double(p.getX() - (tolerance / 2), |
||
532 | p.getY() - (tolerance / 2), tolerance, tolerance);
|
||
533 | return queryByRect(recPoint);
|
||
534 | } |
||
535 | private IGeometry getGeometry(Rectangle2D r){ |
||
536 | GeneralPathX resul = new GeneralPathX();
|
||
537 | 5184 | caballero | Point2D[] vs=new Point2D[4]; |
538 | 4213 | caballero | vs[0]=new Point2D.Double(r.getX(),r.getY()); |
539 | vs[1]=new Point2D.Double(r.getMaxX(),r.getY()); |
||
540 | vs[2]=new Point2D.Double(r.getMaxX(),r.getMaxY()); |
||
541 | vs[3]=new Point2D.Double(r.getX(),r.getMaxY()); |
||
542 | 5184 | caballero | //vs[4]=new Point2D.Double(r.getX(),r.getY());
|
543 | 4213 | caballero | for (int i = 0; i < vs.length; i++) { |
544 | if (i == 0) { |
||
545 | resul.moveTo(vs[i].getX(),vs[i].getY()); |
||
546 | } else {
|
||
547 | resul.lineTo(vs[i].getX(),vs[i].getY()); |
||
548 | } |
||
549 | } |
||
550 | 5184 | caballero | resul.closePath(); |
551 | 4213 | caballero | return ShapeFactory.createPolygon2D(resul);
|
552 | } |
||
553 | } |