Revision 894 org.gvsig.topology/trunk/org.gvsig.topology/org.gvsig.topology.lib/org.gvsig.topology.lib.impl/src/main/java/org/gvsig/topology/lib/impl/DefaultTopologyDataSet.java
DefaultTopologyDataSet.java | ||
---|---|---|
29 | 29 |
import org.apache.commons.lang3.StringUtils; |
30 | 30 |
import org.apache.commons.lang3.mutable.MutableObject; |
31 | 31 |
import org.gvsig.expressionevaluator.Expression; |
32 |
import org.gvsig.expressionevaluator.ExpressionBuilder; |
|
33 |
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator; |
|
34 |
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager; |
|
32 | 35 |
import org.gvsig.fmap.dal.DataStore; |
33 | 36 |
import org.gvsig.fmap.dal.EditingNotification; |
34 | 37 |
import org.gvsig.fmap.dal.EditingNotificationManager; |
... | ... | |
37 | 40 |
import org.gvsig.fmap.dal.feature.Feature; |
38 | 41 |
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor; |
39 | 42 |
import org.gvsig.fmap.dal.feature.FeatureReference; |
43 |
import org.gvsig.fmap.dal.feature.FeatureSet; |
|
40 | 44 |
import org.gvsig.fmap.dal.feature.FeatureStore; |
41 | 45 |
import org.gvsig.fmap.dal.feature.FeatureStoreProviderFactory; |
42 | 46 |
import org.gvsig.fmap.dal.feature.FeatureType; |
... | ... | |
44 | 48 |
import org.gvsig.fmap.geom.Geometry; |
45 | 49 |
import org.gvsig.fmap.geom.GeometryLocator; |
46 | 50 |
import org.gvsig.fmap.geom.GeometryManager; |
51 |
import org.gvsig.fmap.geom.GeometryUtils; |
|
47 | 52 |
import org.gvsig.fmap.geom.SpatialIndex; |
48 | 53 |
import org.gvsig.fmap.geom.type.GeometryType; |
54 |
import org.gvsig.tools.dispose.DisposableIterator; |
|
49 | 55 |
import org.gvsig.tools.exception.BaseException; |
50 | 56 |
import org.gvsig.tools.util.PropertiesSupportHelper; |
51 | 57 |
import org.gvsig.tools.visitor.VisitCanceledException; |
... | ... | |
96 | 102 |
} |
97 | 103 |
} |
98 | 104 |
|
105 |
@Override |
|
99 | 106 |
public void restart() { |
100 | 107 |
this.store = null; |
101 | 108 |
this.spatialIndex = null; |
... | ... | |
350 | 357 |
return this.propertiesHelper.getProperties(); |
351 | 358 |
} |
352 | 359 |
|
360 |
@Override |
|
353 | 361 |
public SpatialIndex getSpatialIndex() { |
354 | 362 |
if( this.spatialIndex == null ) { |
355 | 363 |
this.spatialIndex = new MutableObject<>(); |
... | ... | |
385 | 393 |
return this.spatialIndex.getValue(); |
386 | 394 |
} |
387 | 395 |
|
396 |
@Override |
|
388 | 397 |
public Iterable<FeatureReference> query(Geometry geom) { |
398 |
return this.queryReferences(geom); |
|
399 |
} |
|
400 |
|
|
401 |
@Override |
|
402 |
public Iterable<FeatureReference> queryReferences(Geometry geom) { |
|
389 | 403 |
SpatialIndex index = this.getSpatialIndex(); |
390 | 404 |
if( index == null ) { |
391 |
return (Iterable<FeatureReference>) IteratorUtils.EMPTY_ITERATOR; |
|
405 |
try { |
|
406 |
FeatureStore theStore = (FeatureStore) this.getStore(); |
|
407 |
ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager(); |
|
408 |
Expression expression = manager.createExpression(); |
|
409 |
ExpressionBuilder expressionBuilder = manager.createExpressionBuilder(); |
|
410 |
String geomName = theStore.getDefaultFeatureType().getDefaultGeometryAttributeName(); |
|
411 |
if( GeometryUtils.isSubtype(Geometry.TYPES.POINT, geom.getType()) ) { |
|
412 |
expression.setPhrase( |
|
413 |
expressionBuilder.ifnull( |
|
414 |
expressionBuilder.column(geomName), |
|
415 |
expressionBuilder.constant(false), |
|
416 |
expressionBuilder.ST_Intersects( |
|
417 |
expressionBuilder.column(geomName), |
|
418 |
expressionBuilder.geometry(geom) |
|
419 |
) |
|
420 |
).toString() |
|
421 |
); |
|
422 |
} else { |
|
423 |
expression.setPhrase( |
|
424 |
expressionBuilder.ifnull( |
|
425 |
expressionBuilder.column(geomName), |
|
426 |
expressionBuilder.constant(false), |
|
427 |
expressionBuilder.ST_Overlaps( |
|
428 |
expressionBuilder.column(geomName), |
|
429 |
expressionBuilder.envelope(geom.getEnvelope()) |
|
430 |
) |
|
431 |
).toString() |
|
432 |
); |
|
433 |
} |
|
434 |
FeatureSet set = theStore.getFeatureSet(expression); |
|
435 |
final DisposableIterator it = set.fastIterator(); |
|
436 |
return new Iterable<FeatureReference>() { |
|
437 |
@Override |
|
438 |
public Iterator<FeatureReference> iterator() { |
|
439 |
return new Iterator<FeatureReference>() { |
|
440 |
@Override |
|
441 |
public boolean hasNext() { |
|
442 |
return it.hasNext(); |
|
443 |
} |
|
444 |
|
|
445 |
@Override |
|
446 |
public FeatureReference next() { |
|
447 |
Feature f = (Feature) it.next(); |
|
448 |
return f.getReference(); |
|
449 |
} |
|
450 |
}; |
|
451 |
} |
|
452 |
}; |
|
453 |
|
|
454 |
} catch(Exception ex) { |
|
455 |
return (Iterable<FeatureReference>) IteratorUtils.EMPTY_ITERATOR; |
|
456 |
} |
|
392 | 457 |
} |
393 | 458 |
final Iterator it = index.query(geom); |
394 | 459 |
if( it == null ) { |
... | ... | |
403 | 468 |
} |
404 | 469 |
|
405 | 470 |
@Override |
471 |
public Iterable<Feature> queryFeatures(Geometry geom) { |
|
472 |
SpatialIndex index = this.getSpatialIndex(); |
|
473 |
if( index == null ) { |
|
474 |
try { |
|
475 |
FeatureStore theStore = (FeatureStore) this.getStore(); |
|
476 |
ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager(); |
|
477 |
Expression expression = manager.createExpression(); |
|
478 |
ExpressionBuilder expressionBuilder = manager.createExpressionBuilder(); |
|
479 |
String geomName = theStore.getDefaultFeatureType().getDefaultGeometryAttributeName(); |
|
480 |
if( GeometryUtils.isSubtype(Geometry.TYPES.POINT, geom.getType()) ) { |
|
481 |
expression.setPhrase( |
|
482 |
expressionBuilder.ifnull( |
|
483 |
expressionBuilder.column(geomName), |
|
484 |
expressionBuilder.constant(false), |
|
485 |
expressionBuilder.ST_Intersects( |
|
486 |
expressionBuilder.column(geomName), |
|
487 |
expressionBuilder.geometry(geom) |
|
488 |
) |
|
489 |
).toString() |
|
490 |
); |
|
491 |
} else { |
|
492 |
expression.setPhrase( |
|
493 |
expressionBuilder.ifnull( |
|
494 |
expressionBuilder.column(geomName), |
|
495 |
expressionBuilder.constant(false), |
|
496 |
expressionBuilder.ST_Overlaps( |
|
497 |
expressionBuilder.column(geomName), |
|
498 |
expressionBuilder.envelope(geom.getEnvelope()) |
|
499 |
) |
|
500 |
).toString() |
|
501 |
); |
|
502 |
} |
|
503 |
FeatureSet set = theStore.getFeatureSet(expression); |
|
504 |
final DisposableIterator it = set.fastIterator(); |
|
505 |
return new Iterable<Feature>() { |
|
506 |
@Override |
|
507 |
public Iterator<Feature> iterator() { |
|
508 |
return it; |
|
509 |
} |
|
510 |
}; |
|
511 |
|
|
512 |
} catch(Exception ex) { |
|
513 |
return (Iterable<Feature>) IteratorUtils.EMPTY_ITERATOR; |
|
514 |
} |
|
515 |
} |
|
516 |
final Iterator it = index.query(geom); |
|
517 |
if( it == null ) { |
|
518 |
return (Iterable<Feature>) IteratorUtils.EMPTY_ITERATOR; |
|
519 |
} |
|
520 |
return new Iterable<Feature>() { |
|
521 |
@Override |
|
522 |
public Iterator<Feature> iterator() { |
|
523 |
return new Iterator<Feature>() { |
|
524 |
@Override |
|
525 |
public boolean hasNext() { |
|
526 |
return it.hasNext(); |
|
527 |
} |
|
528 |
|
|
529 |
@Override |
|
530 |
public Feature next() { |
|
531 |
FeatureReference ref = (FeatureReference) it.next(); |
|
532 |
try { |
|
533 |
return ref.getFeature(); |
|
534 |
} catch (DataException ex) { |
|
535 |
return null; |
|
536 |
} |
|
537 |
} |
|
538 |
}; |
|
539 |
} |
|
540 |
}; |
|
541 |
} |
|
542 |
|
|
543 |
@Override |
|
406 | 544 |
public Feature findFirst(Expression filter) { |
407 | 545 |
try { |
408 | 546 |
return this.getFeatureStore().findFirst(filter); |
Also available in: Unified diff