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);
|