46 |
46 |
import java.awt.image.BufferedImage;
|
47 |
47 |
import java.io.IOException;
|
48 |
48 |
import java.util.BitSet;
|
|
49 |
import java.util.List;
|
49 |
50 |
|
50 |
51 |
import org.apache.log4j.Logger;
|
51 |
52 |
import org.cresques.cts.ICoordTrans;
|
... | ... | |
53 |
54 |
|
54 |
55 |
import com.iver.cit.gvsig.fmap.DriverException;
|
55 |
56 |
import com.iver.cit.gvsig.fmap.ViewPort;
|
56 |
|
import com.iver.cit.gvsig.fmap.core.FPolygon2D;
|
57 |
57 |
import com.iver.cit.gvsig.fmap.core.FShape;
|
58 |
|
import com.iver.cit.gvsig.fmap.core.GeneralPathX;
|
59 |
58 |
import com.iver.cit.gvsig.fmap.core.IGeometry;
|
60 |
|
import com.iver.cit.gvsig.fmap.core.ShapeFactory;
|
61 |
|
import com.iver.cit.gvsig.fmap.core.v02.FConverter;
|
62 |
59 |
import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
|
63 |
60 |
import com.iver.cit.gvsig.fmap.drivers.BoundedShapes;
|
64 |
61 |
import com.iver.cit.gvsig.fmap.drivers.DriverAttributes;
|
65 |
62 |
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
|
66 |
63 |
import com.iver.cit.gvsig.fmap.drivers.VectorialFileDriver;
|
|
64 |
import com.iver.cit.gvsig.fmap.layers.FBitSet;
|
67 |
65 |
import com.iver.cit.gvsig.fmap.layers.FLayer;
|
|
66 |
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
|
68 |
67 |
import com.iver.cit.gvsig.fmap.layers.VectorialAdapter;
|
69 |
68 |
import com.iver.cit.gvsig.fmap.layers.layerOperations.AlphanumericData;
|
70 |
69 |
import com.iver.cit.gvsig.fmap.layers.layerOperations.ClassifiableVectorial;
|
... | ... | |
74 |
73 |
import com.iver.cit.gvsig.fmap.rendering.ClassifiedLegendInfo;
|
75 |
74 |
import com.iver.cit.gvsig.fmap.rendering.VectorialLegend;
|
76 |
75 |
import com.iver.cit.gvsig.fmap.rendering.styling.FStyle2D;
|
|
76 |
import com.vividsolutions.jts.geom.Coordinate;
|
|
77 |
import com.vividsolutions.jts.geom.Envelope;
|
|
78 |
import com.vividsolutions.jts.geom.Geometry;
|
|
79 |
import com.vividsolutions.jts.geom.IntersectionMatrix;
|
77 |
80 |
|
78 |
81 |
|
79 |
82 |
/**
|
... | ... | |
261 |
264 |
throws DriverException {
|
262 |
265 |
super.draw(null, g, viewPort, cancel); // Quiero ejecutar el draw del padre, que es el que va sin acelaraci?n!!
|
263 |
266 |
}
|
|
267 |
|
|
268 |
/* (non-Javadoc)
|
|
269 |
* @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#queryByShape(com.iver.cit.gvsig.fmap.core.IGeometry, int)
|
|
270 |
*/
|
|
271 |
public FBitSet queryByShape(IGeometry g, int relationship)
|
|
272 |
throws DriverException, VisitException {
|
|
273 |
// Si hay un ?ndice espacial, lo usamos para hacer el query.
|
|
274 |
FLyrVect lyr = (FLyrVect) capa;
|
|
275 |
if (lyr.getSpatialIndex() == null)
|
|
276 |
return super.queryByShape(g, relationship);
|
|
277 |
|
|
278 |
VectorialAdapter va = lyr.getSource();
|
|
279 |
ICoordTrans ct = lyr.getCoordTrans();
|
|
280 |
Rectangle2D bounds = g.getBounds2D();
|
|
281 |
Coordinate c1 = new Coordinate(bounds.getMinX(), bounds.getMinY());
|
|
282 |
Coordinate c2 = new Coordinate(bounds.getMaxX(), bounds.getMaxY());
|
|
283 |
Envelope env = new Envelope(c1, c2);
|
|
284 |
|
|
285 |
List lstRecs = lyr.getSpatialIndex().query(env);
|
|
286 |
Integer idRec;
|
|
287 |
FBitSet bitset = new FBitSet();
|
|
288 |
Geometry jtsShape = g.toJTSGeometry();
|
|
289 |
IntersectionMatrix m;
|
|
290 |
int index;
|
|
291 |
try {
|
|
292 |
va.start();
|
|
293 |
|
|
294 |
for (int i=0; i < lstRecs.size(); i++)
|
|
295 |
{
|
|
296 |
idRec = (Integer) lstRecs.get(i);
|
|
297 |
index = idRec.intValue();
|
|
298 |
IGeometry geom = va.getShape(index);
|
|
299 |
if (ct != null) {
|
|
300 |
geom.reProject(ct);
|
|
301 |
}
|
|
302 |
Geometry jtsGeom = geom.toJTSGeometry();
|
|
303 |
switch (relationship) {
|
|
304 |
case CONTAINS:
|
|
305 |
m = jtsShape.relate(jtsGeom);
|
|
306 |
if (m.isContains()) {
|
|
307 |
bitset.set(index, true);
|
|
308 |
}
|
|
309 |
break;
|
|
310 |
|
|
311 |
case CROSSES:
|
|
312 |
m = jtsShape.relate(jtsGeom);
|
|
313 |
if (m.isCrosses(jtsGeom.getDimension(), jtsShape.getDimension())) {
|
|
314 |
bitset.set(index, true);
|
|
315 |
}
|
|
316 |
break;
|
|
317 |
|
|
318 |
case DISJOINT:
|
|
319 |
m = jtsShape.relate(jtsGeom);
|
|
320 |
if (m.isDisjoint()) {
|
|
321 |
bitset.set(index, true);
|
|
322 |
}
|
|
323 |
break;
|
|
324 |
|
|
325 |
case EQUALS:
|
|
326 |
m = jtsShape.relate(jtsGeom);
|
|
327 |
if (m.isEquals(jtsGeom.getDimension(), jtsShape.getDimension())) {
|
|
328 |
bitset.set(index, true);
|
|
329 |
}
|
|
330 |
break;
|
|
331 |
|
|
332 |
case INTERSECTS:
|
|
333 |
m = jtsShape.relate(jtsGeom);
|
|
334 |
if (m.isIntersects()) {
|
|
335 |
bitset.set(index, true);
|
|
336 |
}
|
|
337 |
break;
|
|
338 |
|
|
339 |
case OVERLAPS:
|
|
340 |
m = jtsShape.relate(jtsGeom);
|
|
341 |
if (m.isOverlaps(jtsGeom.getDimension(), jtsShape.getDimension()))
|
|
342 |
{
|
|
343 |
bitset.set(index, true);
|
|
344 |
}
|
|
345 |
|
|
346 |
break;
|
|
347 |
|
|
348 |
case TOUCHES:
|
|
349 |
m = jtsShape.relate(jtsGeom);
|
|
350 |
if (m.isTouches(jtsGeom.getDimension(), jtsShape.getDimension()))
|
|
351 |
{
|
|
352 |
bitset.set(index, true);
|
|
353 |
}
|
|
354 |
|
|
355 |
break;
|
|
356 |
|
|
357 |
case WITHIN:
|
|
358 |
m = jtsShape.relate(jtsGeom);
|
|
359 |
if (m.isWithin()) {
|
|
360 |
bitset.set(index, true);
|
|
361 |
}
|
|
362 |
|
|
363 |
break;
|
|
364 |
}
|
|
365 |
}
|
|
366 |
va.stop();
|
|
367 |
} catch (DriverIOException e) {
|
|
368 |
// TODO Auto-generated catch block
|
|
369 |
e.printStackTrace();
|
|
370 |
}
|
|
371 |
return bitset;
|
|
372 |
}
|
|
373 |
public FBitSet queryByRect(Rectangle2D rect) throws DriverException {
|
|
374 |
// Si hay un ?ndice espacial, lo usamos para hacer el query.
|
|
375 |
FLyrVect lyr = (FLyrVect) capa;
|
|
376 |
if (lyr.getSpatialIndex() == null)
|
|
377 |
return super.queryByRect(rect);
|
|
378 |
|
|
379 |
VectorialAdapter va = lyr.getSource();
|
|
380 |
ICoordTrans ct = lyr.getCoordTrans();
|
|
381 |
Rectangle2D bounds = rect;
|
|
382 |
Coordinate c1 = new Coordinate(bounds.getMinX(), bounds.getMinY());
|
|
383 |
Coordinate c2 = new Coordinate(bounds.getMaxX(), bounds.getMaxY());
|
|
384 |
Envelope env = new Envelope(c1, c2);
|
|
385 |
|
|
386 |
List lstRecs = lyr.getSpatialIndex().query(env);
|
|
387 |
Integer idRec;
|
|
388 |
FBitSet bitset = new FBitSet();
|
|
389 |
int index;
|
|
390 |
try {
|
|
391 |
va.start();
|
|
392 |
|
|
393 |
for (int i=0; i < lstRecs.size(); i++)
|
|
394 |
{
|
|
395 |
idRec = (Integer) lstRecs.get(i);
|
|
396 |
index = idRec.intValue();
|
|
397 |
IGeometry geom = va.getShape(index);
|
|
398 |
if (ct != null) {
|
|
399 |
geom.reProject(ct);
|
|
400 |
}
|
|
401 |
if (geom.intersects(rect))
|
|
402 |
bitset.set(index, true);
|
|
403 |
}
|
|
404 |
va.stop();
|
|
405 |
} catch (DriverIOException e) {
|
|
406 |
// TODO Auto-generated catch block
|
|
407 |
e.printStackTrace();
|
|
408 |
}
|
|
409 |
return bitset;
|
|
410 |
|
|
411 |
}
|
|
412 |
|
|
413 |
/* (non-Javadoc)
|
|
414 |
* @see com.iver.cit.gvsig.fmap.operations.strategies.Strategy#queryByPoint(java.awt.geom.Point2D, double)
|
|
415 |
*/
|
|
416 |
public FBitSet queryByPoint(Point2D p, double tolerance)
|
|
417 |
throws DriverException {
|
|
418 |
// TODO: OJO!!!!. Est? implementado como un rectangulo.
|
|
419 |
// Lo correcto deber?a ser calculando las distancias reales
|
|
420 |
// es decir, con un c?rculo.
|
|
421 |
Rectangle2D recPoint = new Rectangle2D.Double(p.getX() - (tolerance / 2),
|
|
422 |
p.getY() - (tolerance / 2), tolerance, tolerance);
|
|
423 |
return queryByRect(recPoint);
|
|
424 |
}
|
264 |
425 |
}
|