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;
|
35 |
32 |
import org.gvsig.expressionevaluator.ExpressionUtils;
|
36 |
33 |
import org.gvsig.expressionevaluator.GeometryExpressionBuilder;
|
37 |
34 |
import org.gvsig.expressionevaluator.GeometryExpressionUtils;
|
... | ... | |
375 |
372 |
);
|
376 |
373 |
final SpatialIndex dataIndex = theStore.wrapSpatialIndex(geomIndex);
|
377 |
374 |
try {
|
378 |
|
store.accept(new Visitor() {
|
379 |
|
@Override
|
380 |
|
public void visit(Object o) throws VisitCanceledException, BaseException {
|
381 |
|
Feature f = (Feature) o;
|
382 |
|
Geometry geom = f.getDefaultGeometry();
|
383 |
|
if (geom != null) {
|
384 |
|
dataIndex.insert(geom, f);
|
385 |
|
}
|
|
375 |
store.accept((Object o) -> {
|
|
376 |
Feature f = (Feature) o;
|
|
377 |
Geometry geom = f.getDefaultGeometry();
|
|
378 |
if (geom != null) {
|
|
379 |
dataIndex.insert(geom, f);
|
386 |
380 |
}
|
387 |
381 |
});
|
388 |
382 |
} catch (VisitCanceledException ex) {
|
... | ... | |
396 |
390 |
return this.spatialIndex.getValue();
|
397 |
391 |
}
|
398 |
392 |
|
|
393 |
|
399 |
394 |
@Override
|
|
395 |
public Iterable<FeatureReference> getFeatureReferencesThatEnvelopeIntersectsWith(Geometry geom) {
|
|
396 |
SpatialIndex index = this.getSpatialIndex();
|
|
397 |
if( index == null ) {
|
|
398 |
try {
|
|
399 |
FeatureStore theStore = (FeatureStore) this.getStore();
|
|
400 |
Expression expression = ExpressionUtils.createExpression();
|
|
401 |
GeometryExpressionBuilder expressionBuilder = GeometryExpressionUtils.createExpressionBuilder();
|
|
402 |
String geomName = theStore.getDefaultFeatureType().getDefaultGeometryAttributeName();
|
|
403 |
if( GeometryUtils.isSubtype(Geometry.TYPES.POINT, geom.getType()) ) {
|
|
404 |
expression.setPhrase(
|
|
405 |
expressionBuilder.ifnull(
|
|
406 |
expressionBuilder.column(geomName),
|
|
407 |
expressionBuilder.constant(false),
|
|
408 |
expressionBuilder.ST_Intersects(
|
|
409 |
expressionBuilder.column(geomName),
|
|
410 |
expressionBuilder.geometry(geom)
|
|
411 |
)
|
|
412 |
).toString()
|
|
413 |
);
|
|
414 |
} else {
|
|
415 |
expression.setPhrase(
|
|
416 |
expressionBuilder.ifnull(
|
|
417 |
expressionBuilder.column(geomName),
|
|
418 |
expressionBuilder.constant(false),
|
|
419 |
expressionBuilder.ST_Intersects(
|
|
420 |
expressionBuilder.column(geomName),
|
|
421 |
expressionBuilder.envelope(geom.getEnvelope())
|
|
422 |
)
|
|
423 |
).toString()
|
|
424 |
);
|
|
425 |
}
|
|
426 |
FeatureSet set = theStore.getFeatureSet(expression);
|
|
427 |
final DisposableIterator it = set.fastIterator();
|
|
428 |
return () -> new Iterator<FeatureReference>() {
|
|
429 |
@Override
|
|
430 |
public boolean hasNext() {
|
|
431 |
return it.hasNext();
|
|
432 |
}
|
|
433 |
|
|
434 |
@Override
|
|
435 |
public FeatureReference next() {
|
|
436 |
Feature f = (Feature) it.next();
|
|
437 |
return f.getReference();
|
|
438 |
}
|
|
439 |
};
|
|
440 |
|
|
441 |
} catch(Exception ex) {
|
|
442 |
return (Iterable<FeatureReference>) IteratorUtils.EMPTY_ITERATOR;
|
|
443 |
}
|
|
444 |
}
|
|
445 |
final Iterator it = index.query(geom);
|
|
446 |
if( it == null ) {
|
|
447 |
return (Iterable<FeatureReference>) IteratorUtils.EMPTY_ITERATOR;
|
|
448 |
}
|
|
449 |
return () -> it;
|
|
450 |
}
|
|
451 |
|
|
452 |
@Override
|
|
453 |
public Iterable<Feature> getFeaturesThatEnvelopeIntersectsWith(Geometry geom) {
|
|
454 |
SpatialIndex index = this.getSpatialIndex();
|
|
455 |
if( index == null ) {
|
|
456 |
try {
|
|
457 |
FeatureStore theStore = (FeatureStore) this.getStore();
|
|
458 |
Expression expression = ExpressionUtils.createExpression();
|
|
459 |
GeometryExpressionBuilder expressionBuilder = GeometryExpressionUtils.createExpressionBuilder();
|
|
460 |
String geomName = theStore.getDefaultFeatureType().getDefaultGeometryAttributeName();
|
|
461 |
if( GeometryUtils.isSubtype(Geometry.TYPES.POINT, geom.getType()) ) {
|
|
462 |
expression.setPhrase(
|
|
463 |
expressionBuilder.ifnull(
|
|
464 |
expressionBuilder.column(geomName),
|
|
465 |
expressionBuilder.constant(false),
|
|
466 |
expressionBuilder.ST_Intersects(
|
|
467 |
expressionBuilder.column(geomName),
|
|
468 |
expressionBuilder.geometry(geom)
|
|
469 |
)
|
|
470 |
).toString()
|
|
471 |
);
|
|
472 |
} else {
|
|
473 |
expression.setPhrase(
|
|
474 |
expressionBuilder.ifnull(
|
|
475 |
expressionBuilder.column(geomName),
|
|
476 |
expressionBuilder.constant(false),
|
|
477 |
expressionBuilder.ST_Intersects(
|
|
478 |
expressionBuilder.column(geomName),
|
|
479 |
expressionBuilder.envelope(geom.getEnvelope())
|
|
480 |
)
|
|
481 |
).toString()
|
|
482 |
);
|
|
483 |
}
|
|
484 |
FeatureSet set = theStore.getFeatureSet(expression);
|
|
485 |
final DisposableIterator it = set.fastIterator();
|
|
486 |
return () -> it;
|
|
487 |
|
|
488 |
} catch(Exception ex) {
|
|
489 |
return (Iterable<Feature>) IteratorUtils.EMPTY_ITERATOR;
|
|
490 |
}
|
|
491 |
}
|
|
492 |
final Iterator it = index.query(geom);
|
|
493 |
if( it == null ) {
|
|
494 |
return (Iterable<Feature>) IteratorUtils.EMPTY_ITERATOR;
|
|
495 |
}
|
|
496 |
return () -> new Iterator<Feature>() {
|
|
497 |
@Override
|
|
498 |
public boolean hasNext() {
|
|
499 |
return it.hasNext();
|
|
500 |
}
|
|
501 |
|
|
502 |
@Override
|
|
503 |
public Feature next() {
|
|
504 |
FeatureReference ref = (FeatureReference) it.next();
|
|
505 |
try {
|
|
506 |
return ref.getFeature();
|
|
507 |
} catch (DataException ex) {
|
|
508 |
return null;
|
|
509 |
}
|
|
510 |
}
|
|
511 |
};
|
|
512 |
}
|
|
513 |
|
|
514 |
@Override
|
400 |
515 |
public Iterable<FeatureReference> query(Geometry geom) {
|
401 |
516 |
return this.queryReferences(geom);
|
402 |
517 |
}
|
... | ... | |
435 |
550 |
}
|
436 |
551 |
FeatureSet set = theStore.getFeatureSet(expression);
|
437 |
552 |
final DisposableIterator it = set.fastIterator();
|
438 |
|
return new Iterable<FeatureReference>() {
|
|
553 |
return () -> new Iterator<FeatureReference>() {
|
439 |
554 |
@Override
|
440 |
|
public Iterator<FeatureReference> iterator() {
|
441 |
|
return new Iterator<FeatureReference>() {
|
442 |
|
@Override
|
443 |
|
public boolean hasNext() {
|
444 |
|
return it.hasNext();
|
445 |
|
}
|
446 |
|
|
447 |
|
@Override
|
448 |
|
public FeatureReference next() {
|
449 |
|
Feature f = (Feature) it.next();
|
450 |
|
return f.getReference();
|
451 |
|
}
|
452 |
|
};
|
|
555 |
public boolean hasNext() {
|
|
556 |
return it.hasNext();
|
453 |
557 |
}
|
|
558 |
|
|
559 |
@Override
|
|
560 |
public FeatureReference next() {
|
|
561 |
Feature f = (Feature) it.next();
|
|
562 |
return f.getReference();
|
|
563 |
}
|
454 |
564 |
};
|
455 |
565 |
|
456 |
566 |
} catch(Exception ex) {
|
... | ... | |
461 |
571 |
if( it == null ) {
|
462 |
572 |
return (Iterable<FeatureReference>) IteratorUtils.EMPTY_ITERATOR;
|
463 |
573 |
}
|
464 |
|
return new Iterable<FeatureReference>() {
|
465 |
|
@Override
|
466 |
|
public Iterator<FeatureReference> iterator() {
|
467 |
|
return it;
|
468 |
|
}
|
469 |
|
};
|
|
574 |
return () -> it;
|
470 |
575 |
}
|
471 |
576 |
|
472 |
577 |
@Override
|
... | ... | |
503 |
608 |
}
|
504 |
609 |
FeatureSet set = theStore.getFeatureSet(expression);
|
505 |
610 |
final DisposableIterator it = set.fastIterator();
|
506 |
|
return new Iterable<Feature>() {
|
507 |
|
@Override
|
508 |
|
public Iterator<Feature> iterator() {
|
509 |
|
return it;
|
510 |
|
}
|
511 |
|
};
|
|
611 |
return () -> it;
|
512 |
612 |
|
513 |
613 |
} catch(Exception ex) {
|
514 |
614 |
return (Iterable<Feature>) IteratorUtils.EMPTY_ITERATOR;
|
... | ... | |
518 |
618 |
if( it == null ) {
|
519 |
619 |
return (Iterable<Feature>) IteratorUtils.EMPTY_ITERATOR;
|
520 |
620 |
}
|
521 |
|
return new Iterable<Feature>() {
|
|
621 |
return () -> new Iterator<Feature>() {
|
522 |
622 |
@Override
|
523 |
|
public Iterator<Feature> iterator() {
|
524 |
|
return new Iterator<Feature>() {
|
525 |
|
@Override
|
526 |
|
public boolean hasNext() {
|
527 |
|
return it.hasNext();
|
528 |
|
}
|
529 |
|
|
530 |
|
@Override
|
531 |
|
public Feature next() {
|
532 |
|
FeatureReference ref = (FeatureReference) it.next();
|
533 |
|
try {
|
534 |
|
return ref.getFeature();
|
535 |
|
} catch (DataException ex) {
|
536 |
|
return null;
|
537 |
|
}
|
538 |
|
}
|
539 |
|
};
|
|
623 |
public boolean hasNext() {
|
|
624 |
return it.hasNext();
|
540 |
625 |
}
|
|
626 |
|
|
627 |
@Override
|
|
628 |
public Feature next() {
|
|
629 |
FeatureReference ref = (FeatureReference) it.next();
|
|
630 |
try {
|
|
631 |
return ref.getFeature();
|
|
632 |
} catch (DataException ex) {
|
|
633 |
return null;
|
|
634 |
}
|
|
635 |
}
|
541 |
636 |
};
|
542 |
637 |
}
|
543 |
638 |
|