Revision 103

View differences:

org.gvsig.dgn/trunk/org.gvsig.dgn/org.gvsig.dgn.provider/src/main/java/org/gvsig/fmap/dal/store/dgn/DGNStoreProvider.java
333 333
                                dgndata); // OJO la reproyeccion
334 334
                        resource.notifyClose();
335 335
                    }
336

  
337
                    data = dgndata.data;
338
                    store.setFeatureTypes(dgndata.fTypes, dgndata.defaultFType);
336
                    // El feature type no lo compartimos entre las instancias del 
337
                    // mismo resource ya que puede cambiar en funcion del filtro.
338
                    // Por lo menos el geometry-type.
339
                    List<FeatureType> featureTypes = getFeatureTypes(store);
340
                    
341
                    PostProcessFeatures postProcess = new PostProcessFeatures(
342
                            getDGNParameters(),
343
                            featureTypes.get(0)
344
                    );
345
                    if (postProcess.hasOperations()) {
346
                        data = postProcess.apply(dgndata.data);
347
                        setDynValue("Envelope", postProcess.getEnvelope());
348
                    } else {
349
                        data = dgndata.data;
350
                        setDynValue("Envelope", dgndata.getEnvelopeCopy());
351
                    }
339 352
                    legendBuilder = dgndata.legendBuilder;
340
                    setDynValue("Envelope", dgndata.getEnvelopeCopy());
353
                    store.setFeatureTypes(featureTypes, featureTypes.get(0));
341 354
                    setDynValue("CRS", projection);
342 355
                    counterNewsOIDs = data.size();
343 356
                    return null;
......
353 366
        }
354 367
    }
355 368

  
356
    private void sortRows() {
357
        List rows = this.data;
358

  
359
        Collections.sort(rows, new Comparator<FeatureProvider>() {
360
            public int compare(FeatureProvider o1, FeatureProvider o2) {
361
                Geometry g1 = o1.getDefaultGeometry();
362
                Geometry g2 = o2.getDefaultGeometry();
363
                if (g1 == null) {
364
                    if (g2 == null) {
365
                        return 0;
366
                    } else {
367
                        return -1;
368
                    }
369
                } else if (g2 == null) {
370
                    return 1;
371
                }
372
                return g2.getType() - g1.getType();
373
            }
374
        });
375
    }
376

  
377 369
    public DataServerExplorer getExplorer() throws ReadException {
378 370
        DataManager manager = DALLocator.getDataManager();
379 371
        FilesystemServerExplorerParameters params;
......
395 387
        throw new UnsupportedOperationException();
396 388
    }
397 389

  
398
    public class Filter {
390
    public List getFeatureTypes(FeatureStoreProviderServices store) {
391
        EditableFeatureType featureType = store.createFeatureType(getName());
399 392

  
400
        private Pattern levelFilter = null;
401
        private Pattern colorFilter = null;
402
        private Pattern styleFilter = null;
403
        private Pattern weighFilter = null;
404
        private Pattern typeFilter = null;
405
        private Pattern stypeFilter = null;
406
        private Pattern idFilter = null;
407
        private Pattern groupFilter = null;
408
        private Pattern textFilter = null;
409
        private Point pointForCheckGeometries = null;
410
        private boolean hasfilter = false;
411
        private boolean skipCurruptGeometries = true;
412
        private int geometryTypeFilter = Geometry.TYPES.GEOMETRY;
413
        private int counter_exceptions = 0;
414
        private int cropOperationFilter;
415
        private Geometry cropFilter = null;
393
        featureType.setHasOID(true);
416 394

  
417
        Filter(DGNStoreParameters parameters, DGNReader dgnReader) {
418
            geometryTypeFilter = getDGNParameters().getGeometryTypeFilter();
419
            skipCurruptGeometries = getDGNParameters().skipCorruptGeometries();
420
            if (!StringUtils.isBlank(parameters.getLevelFilter())) {
421
                this.levelFilter = Pattern.compile(parameters.getLevelFilter());
422
                this.hasfilter = true;
423
            }
424
            if (!StringUtils.isBlank(parameters.getColorFilter())) {
425
                colorFilter = Pattern.compile(parameters.getColorFilter());
426
                this.hasfilter = true;
427
            }
428
            if (!StringUtils.isBlank(parameters.getStyleFilter())) {
429
                styleFilter = Pattern.compile(parameters.getStyleFilter());
430
                this.hasfilter = true;
431
            }
432
            if (!StringUtils.isBlank(parameters.getWeightFilter())) {
433
                weighFilter = Pattern.compile(parameters.getWeightFilter());
434
                this.hasfilter = true;
435
            }
436
            if (!StringUtils.isBlank(parameters.getTypeFilter())) {
437
                this.typeFilter = Pattern.compile(parameters.getTypeFilter());
438
                this.hasfilter = true;
439
            }
440
            if (!StringUtils.isBlank(parameters.getSTypeFilter())) {
441
                this.stypeFilter = Pattern.compile(parameters.getSTypeFilter());
442
                this.hasfilter = true;
443
            }
444
            if (!StringUtils.isBlank(parameters.getWeightFilter())) {
445
                weighFilter = Pattern.compile(parameters.getWeightFilter());
446
                this.hasfilter = true;
447
            }
448
            if (!StringUtils.isBlank(parameters.getGroupFilter())) {
449
                groupFilter = Pattern.compile(parameters.getGroupFilter());
450
                this.hasfilter = true;
451
            }
452
            if (!StringUtils.isBlank(parameters.getIDFilter())) {
453
                idFilter = Pattern.compile(parameters.getIDFilter());
454
                this.hasfilter = true;
455
            }
456
            if (!StringUtils.isBlank(parameters.getTextFilter())) {
457
                textFilter = Pattern.compile(parameters.getTextFilter());
458
                this.hasfilter = true;
459
            }
460
            if (this.geometryTypeFilter != Geometry.TYPES.GEOMETRY) {
461
                this.hasfilter = true;
462
            }
463
            this.cropFilter = getDGNParameters().getCropFilter();
464
            if (this.cropFilter != null) {
465
                this.hasfilter = true;
466
            }
467
            this.cropOperationFilter = getDGNParameters().getCropOperationFilter();
468
            if (this.cropOperationFilter == CROP_OPERATION_NONE) {
469
                this.cropFilter = null;
470
            }
471
            this.pointForCheckGeometries = null;
472
            if (skipCurruptGeometries) {
473
                try {
474
                    if (dgnReader.getInfo().dimension == 3) {
475
                        this.pointForCheckGeometries = geomManager.createPoint(1, 1, Geometry.SUBTYPES.GEOM3D);
476
                        this.pointForCheckGeometries.setCoordinateAt(2, 1);
477
                    } else {
478
                        this.pointForCheckGeometries = geomManager.createPoint(1, 1, Geometry.SUBTYPES.GEOM2D);
479
                    }
480
                } catch (Exception ex) {
481
                    this.pointForCheckGeometries = null;
482
                }
483
            }
484
        }
395
        ID_FIELD_ID = featureType.add(NAME_FIELD_ID, DataTypes.INT)
396
                .setDefaultValue(Integer.valueOf(0))
397
                .getIndex();
485 398

  
486
        private boolean match(Pattern exp, Object value) {
487
            if (exp == null) {
488
                return true;
489
            }
490
            if (value == null) {
491
                return false;
492
            }
493
            return exp.matcher(value.toString()).matches();
494
        }
399
        ID_FIELD_PARENT = featureType.add(NAME_FIELD_PARENTID, DataTypes.INT)
400
                .setDefaultValue(Integer.valueOf(0))
401
                .getIndex();
495 402

  
496
        public boolean accept(FeatureProvider data) {
403
        // FIXME: Cual es el size y el valor por defecto para Entity ?
404
        ID_FIELD_ENTITY = featureType.add(NAME_FIELD_ENTITY, DataTypes.STRING, 100)
405
                .setDefaultValue("")
406
                .getIndex();
497 407

  
498
            if (!this.hasfilter) {
499
                return true;
500
            }
408
        // FIXME: Cual es el size de Layer ?
409
        ID_FIELD_LEVEL = featureType.add(NAME_FIELD_LEVEL, DataTypes.STRING, 100)
410
                .setDefaultValue("default")
411
                .getIndex();
412
        ID_FIELD_LAYER = ID_FIELD_LEVEL;
501 413

  
502
            Geometry geometry = data.getDefaultGeometry();
503
            if (this.pointForCheckGeometries != null) {
504
                if (geometry != null) {
505
                    try {
506
                        this.pointForCheckGeometries.intersects(geometry);
507
                    } catch (Exception ex) {
508
                        // Skip geometries with problems
509
                        data.setDefaultGeometry(null);
510
                        geometry = null;
511
                    }
512
                }
513
            }
414
        ID_FIELD_COLOR = featureType.add(NAME_FIELD_COLOR, DataTypes.INT)
415
                .setDefaultValue(Integer.valueOf(0))
416
                .getIndex();
514 417

  
515
            try {
516
                if (!match(levelFilter, data.get(ID_FIELD_LEVEL))) {
517
                    return false;
518
                }
519
                if (!match(colorFilter, data.get(ID_FIELD_COLOR))) {
520
                    return false;
521
                }
522
                if (!match(styleFilter, data.get(ID_FIELD_STYLE))) {
523
                    return false;
524
                }
525
                if (!match(weighFilter, data.get(ID_FIELD_WEIGHT))) {
526
                    return false;
527
                }
528
                if (!match(typeFilter, data.get(ID_FIELD_TYPE))) {
529
                    return false;
530
                }
531
                if (!match(stypeFilter, data.get(ID_FIELD_STYPE))) {
532
                    return false;
533
                }
534
                if (!match(groupFilter, data.get(ID_FIELD_GROUP))) {
535
                    return false;
536
                }
537
                if (!match(idFilter, data.get(ID_FIELD_ID))) {
538
                    return false;
539
                }
540
                if (!match(textFilter, data.get(ID_FIELD_TEXT))) {
541
                    return false;
542
                }
418
        // FIXME: Cual es el size de Text ?
419
        ID_FIELD_TEXT = featureType.add(NAME_FIELD_TEXT, DataTypes.STRING, 100)
420
                .setDefaultValue("")
421
                .getIndex();
543 422

  
544
                if (geometry != null) {
545
                    if (geometryTypeFilter != Geometry.TYPES.GEOMETRY) {
546
                        GeometryType geomtype = geometry.getGeometryType();
547
                        switch (geometryTypeFilter) {
548
                            case Geometry.TYPES.POINT:
549
                                if (!geomtype.isTypeOf(Geometry.TYPES.POINT)
550
                                        && !geomtype.isTypeOf(Geometry.TYPES.MULTIPOINT)) {
551
                                    return false;
552
                                }
553
                                break;
554
                            case Geometry.TYPES.CURVE:
555
                                if (!geomtype.isTypeOf(Geometry.TYPES.CURVE)
556
                                        && !geomtype.isTypeOf(Geometry.TYPES.MULTICURVE)) {
557
                                    return false;
558
                                }
559
                                break;
560
                            case Geometry.TYPES.SURFACE:
561
                                if (!geomtype.isTypeOf(Geometry.TYPES.SURFACE)
562
                                        && !geomtype.isTypeOf(Geometry.TYPES.MULTISURFACE)) {
563
                                    return false;
564
                                }
565
                                break;
566
                            default:
567
                                break;
568
                        }
569
                    }
570
                    if (this.cropFilter != null) {
571
                        switch (this.cropOperationFilter) {
572
                            case CROP_OPERATION_CONTAINS:
573
                                if (!this.cropFilter.contains(geometry)) {
574
                                    return false;
575
                                }
576
                                break;
577
                            case CROP_OPERATION_COVEREDBY:
578
                                if (!this.cropFilter.coveredBy(geometry)) {
579
                                    return false;
580
                                }
581
                                break;
582
                            case CROP_OPERATION_COVERS:
583
                                if (!this.cropFilter.covers(geometry)) {
584
                                    return false;
585
                                }
586
                                break;
587
                            case CROP_OPERATION_CROSSES:
588
                                if (!this.cropFilter.crosses(geometry)) {
589
                                    return false;
590
                                }
591
                                break;
592
                            case CROP_OPERATION_DISJOINT:
593
                                if (!this.cropFilter.disjoint(geometry)) {
594
                                    return false;
595
                                }
596
                                break;
597
                            case CROP_OPERATION_INTERSECT:
598
                                if (!this.cropFilter.intersects(geometry)) {
599
                                    return false;
600
                                }
601
                                break;
602
                            case CROP_OPERATION_OVERLAPS:
603
                                if (!this.cropFilter.overlaps(geometry)) {
604
                                    return false;
605
                                }
606
                                break;
607
                            case CROP_OPERATION_TOUCHES:
608
                                if (!this.cropFilter.touches(geometry)) {
609
                                    return false;
610
                                }
611
                                break;
612
                            case CROP_OPERATION_WITHIN:
613
                                if (!this.cropFilter.within(geometry)) {
614
                                    return false;
615
                                }
616
                                break;
617
                        }
618
                    }
619
                }
620
            } catch (Exception ex) {
621
                if (++counter_exceptions < 10) {
622
                    logger.warn("Can't filter data, accept it.", ex);
623
                } else if (counter_exceptions == 10) {
624
                    logger.warn("Can't filter data, accept it.", ex);
625
                    logger.warn("Too many exceptions, dont show more.");
626
                }
627
                return true;
423
        ID_FIELD_HEIGHTTEXT = featureType.add(NAME_FIELD_HEIGHTTEXT, DataTypes.DOUBLE)
424
                .setDefaultValue(Double.valueOf(10))
425
                .getIndex();
426

  
427
        ID_FIELD_HEIGHTTEXTRAW = featureType.add(NAME_FIELD_HEIGHTTEXTRAW, DataTypes.DOUBLE)
428
                .setDefaultValue(Double.valueOf(10))
429
                .getIndex();
430

  
431
        ID_FIELD_ROTATIONTEXT = featureType.add(NAME_FIELD_ROTATIONTEXT, DataTypes.DOUBLE)
432
                .setDefaultValue(Double.valueOf(0))
433
                .getIndex();
434

  
435
        ID_FIELD_TYPE = featureType.add(NAME_FIELD_TYPE, DataTypes.INT)
436
                .setDefaultValue(Integer.valueOf(0))
437
                .getIndex();
438

  
439
        ID_FIELD_STYPE = featureType.add(NAME_FIELD_STYPE, DataTypes.INT)
440
                .setDefaultValue(Integer.valueOf(0))
441
                .getIndex();
442

  
443
        ID_FIELD_FILLCOLOR = featureType.add(NAME_FIELD_FILLCOLOR, DataTypes.INT)
444
                .setDefaultValue(Integer.valueOf(0))
445
                .getIndex();
446

  
447
        ID_FIELD_STYLE = featureType.add(NAME_FIELD_STYLE, DataTypes.INT)
448
                .setDefaultValue(Integer.valueOf(0))
449
                .getIndex();
450

  
451
        ID_FIELD_ELEVATION = featureType.add(NAME_FIELD_ELEVATION, DataTypes.DOUBLE)
452
                .setDefaultValue(Double.valueOf(0))
453
                .getIndex();
454

  
455
        ID_FIELD_WEIGHT = featureType.add(NAME_FIELD_WEIGHT, DataTypes.DOUBLE)
456
                .setDefaultValue(Double.valueOf(0))
457
                .getIndex();
458

  
459
        ID_FIELD_GROUP = featureType.add(NAME_FIELD_GROUP, DataTypes.INT)
460
                .setDefaultValue(Integer.valueOf(0))
461
                .getIndex();
462

  
463
        ID_FIELD_ISSHAPE = featureType.add(NAME_FIELD_ISSHAPE, DataTypes.BOOLEAN)
464
                .setDefaultValue(Boolean.FALSE)
465
                .getIndex();
466

  
467
        ID_FIELD_ISCOMPLEXSHAPEHEADER = featureType.add(NAME_FIELD_ISCOMPLEXSHAPEHEADER, DataTypes.BOOLEAN)
468
                .setDefaultValue(Boolean.FALSE)
469
                .getIndex();
470

  
471
        ID_FIELD_ISHOLE = featureType.add(NAME_FIELD_ISHOLE, DataTypes.BOOLEAN)
472
                .setDefaultValue(Boolean.FALSE)
473
                .getIndex();
474

  
475
        ID_FIELD_ISCOMPLEX = featureType.add(NAME_FIELD_ISCOMPLEX, DataTypes.BOOLEAN)
476
                .setDefaultValue(Boolean.FALSE)
477
                .getIndex();
478

  
479
        ID_FIELD_SCALE = featureType.add(NAME_FIELD_SCALE, DataTypes.INT)
480
                .setDefaultValue(Integer.valueOf(0))
481
                .getIndex();
482

  
483
        ID_FIELD_LINKS_COUNT = featureType.add(NAME_FIELD_LINKS_COUNT, DataTypes.INT)
484
                .setDefaultValue(Integer.valueOf(0))
485
                .getIndex();
486

  
487
        ID_FIELD_LINK_INDEX = featureType.add(NAME_FIELD_LINK_INDEX, DataTypes.INT)
488
                .setDefaultValue(Integer.valueOf(0))
489
                .getIndex();
490

  
491
        ID_FIELD_LINK_ENTITY = featureType.add(NAME_FIELD_LINK_ENTITY, DataTypes.INT)
492
                .setDefaultValue(Integer.valueOf(0))
493
                .getIndex();
494

  
495
        ID_FIELD_LINK_TYPE = featureType.add(NAME_FIELD_LINK_TYPE, DataTypes.INT)
496
                .setDefaultValue(Integer.valueOf(0))
497
                .getIndex();
498

  
499
        ID_FIELD_LINK_MS = featureType.add(NAME_FIELD_LINK_MS, DataTypes.INT)
500
                .setDefaultValue(Integer.valueOf(0))
501
                .getIndex();
502

  
503
        ID_FIELD_LINK_LENGTH = featureType.add(NAME_FIELD_LINK_LENGTH, DataTypes.INT)
504
                .setDefaultValue(Integer.valueOf(0))
505
                .getIndex();
506

  
507
        ID_FIELD_LINK_DATA = featureType.add(NAME_FIELD_LINK_DATA, DataTypes.STRING, 512)
508
                .setDefaultValue("")
509
                .getIndex();
510

  
511
        EditableFeatureAttributeDescriptor attr = featureType.add(NAME_FIELD_GEOMETRY, DataTypes.GEOMETRY);
512
        attr.setSRS(this.projection);
513
        int geometryTypeToUse = getDGNParameters().getGeometryTypeFilter();
514
        if (getDGNParameters().getGroupBy() != null) {
515
            switch (getDGNParameters().getGroupGeometriesOperation()) {
516
                case GROUP_GEOMETRIES_NONE:
517
                case GROUP_GEOMETRIES_UNION:
518
                case GROUP_GEOMETRIES_INTERSECTION:
519
                    break;
520
                case GROUP_GEOMETRIES_TOPOINTS:
521
                    geometryTypeToUse = Geometry.TYPES.MULTIPOINT;
522
                    break;
523
                case GROUP_GEOMETRIES_TOLINES:
524
                    geometryTypeToUse = Geometry.TYPES.MULTICURVE;
525
                    break;
526
                case GROUP_GEOMETRIES_TOPOLYGONS:
527
                case GROUP_GEOMETRIES_TOPOLYGONS_FIX:
528
                case GROUP_GEOMETRIES_CONVEXHULL:
529
                    geometryTypeToUse = Geometry.TYPES.MULTISURFACE;
530
                    break;
628 531
            }
629
            return true;
630 532
        }
533
        attr.setGeometryType(geometryTypeToUse);
534
        attr.setGeometrySubType(Geometry.SUBTYPES.GEOM3D);
535
        ID_FIELD_GEOMETRY = attr.getIndex();
631 536

  
537
        featureType.setDefaultGeometryAttributeName(NAME_FIELD_GEOMETRY);
538

  
539
        MAX_FIELD_ID = featureType.size() - 1;
540

  
541
        List types = new ArrayList();
542
        types.add(featureType);
543

  
544
        return types;
632 545
    }
633 546

  
634 547
    public class Reader {
......
639 552
        private LegendBuilder leyendBuilder;
640 553
        private AbstractMemoryStoreProvider store;
641 554
        private Envelope envelope;
642
        private Filter filter = null;
643 555

  
644 556
        public Reader initialice(AbstractMemoryStoreProvider store, File file,
645 557
                IProjection projection,
......
660 572

  
661 573
        public void begin(FeatureStoreProviderServices store) {
662 574

  
663
            EditableFeatureType featureType = store.createFeatureType(getName());
575
            types = getFeatureTypes(store);
664 576

  
665
            featureType.setHasOID(true);
666

  
667
            ID_FIELD_ID = featureType.add(NAME_FIELD_ID, DataTypes.INT)
668
                    .setDefaultValue(Integer.valueOf(0))
669
                    .getIndex();
670

  
671
            ID_FIELD_PARENT = featureType.add(NAME_FIELD_PARENTID, DataTypes.INT)
672
                    .setDefaultValue(Integer.valueOf(0))
673
                    .getIndex();
674

  
675
            // FIXME: Cual es el size y el valor por defecto para Entity ?
676
            ID_FIELD_ENTITY = featureType.add(NAME_FIELD_ENTITY, DataTypes.STRING, 100)
677
                    .setDefaultValue("")
678
                    .getIndex();
679

  
680
            // FIXME: Cual es el size de Layer ?
681
            ID_FIELD_LEVEL = featureType.add(NAME_FIELD_LEVEL, DataTypes.STRING, 100)
682
                    .setDefaultValue("default")
683
                    .getIndex();
684
            ID_FIELD_LAYER = ID_FIELD_LEVEL;
685

  
686
            ID_FIELD_COLOR = featureType.add(NAME_FIELD_COLOR, DataTypes.INT)
687
                    .setDefaultValue(Integer.valueOf(0))
688
                    .getIndex();
689

  
690
            // FIXME: Cual es el size de Text ?
691
            ID_FIELD_TEXT = featureType.add(NAME_FIELD_TEXT, DataTypes.STRING, 100)
692
                    .setDefaultValue("")
693
                    .getIndex();
694

  
695
            ID_FIELD_HEIGHTTEXT = featureType.add(NAME_FIELD_HEIGHTTEXT, DataTypes.DOUBLE)
696
                    .setDefaultValue(Double.valueOf(10))
697
                    .getIndex();
698

  
699
            ID_FIELD_HEIGHTTEXTRAW = featureType.add(NAME_FIELD_HEIGHTTEXTRAW, DataTypes.DOUBLE)
700
                    .setDefaultValue(Double.valueOf(10))
701
                    .getIndex();
702

  
703
            ID_FIELD_ROTATIONTEXT = featureType.add(NAME_FIELD_ROTATIONTEXT, DataTypes.DOUBLE)
704
                    .setDefaultValue(Double.valueOf(0))
705
                    .getIndex();
706

  
707
            ID_FIELD_TYPE = featureType.add(NAME_FIELD_TYPE, DataTypes.INT)
708
                    .setDefaultValue(Integer.valueOf(0))
709
                    .getIndex();
710

  
711
            ID_FIELD_STYPE = featureType.add(NAME_FIELD_STYPE, DataTypes.INT)
712
                    .setDefaultValue(Integer.valueOf(0))
713
                    .getIndex();
714

  
715
            ID_FIELD_FILLCOLOR = featureType.add(NAME_FIELD_FILLCOLOR, DataTypes.INT)
716
                    .setDefaultValue(Integer.valueOf(0))
717
                    .getIndex();
718

  
719
            ID_FIELD_STYLE = featureType.add(NAME_FIELD_STYLE, DataTypes.INT)
720
                    .setDefaultValue(Integer.valueOf(0))
721
                    .getIndex();
722

  
723
            ID_FIELD_ELEVATION = featureType.add(NAME_FIELD_ELEVATION, DataTypes.DOUBLE)
724
                    .setDefaultValue(Double.valueOf(0))
725
                    .getIndex();
726

  
727
            ID_FIELD_WEIGHT = featureType.add(NAME_FIELD_WEIGHT, DataTypes.DOUBLE)
728
                    .setDefaultValue(Double.valueOf(0))
729
                    .getIndex();
730

  
731
            ID_FIELD_GROUP = featureType.add(NAME_FIELD_GROUP, DataTypes.INT)
732
                    .setDefaultValue(Integer.valueOf(0))
733
                    .getIndex();
734

  
735
            ID_FIELD_ISSHAPE = featureType.add(NAME_FIELD_ISSHAPE, DataTypes.BOOLEAN)
736
                    .setDefaultValue(Boolean.FALSE)
737
                    .getIndex();
738

  
739
            ID_FIELD_ISCOMPLEXSHAPEHEADER = featureType.add(NAME_FIELD_ISCOMPLEXSHAPEHEADER, DataTypes.BOOLEAN)
740
                    .setDefaultValue(Boolean.FALSE)
741
                    .getIndex();
742

  
743
            ID_FIELD_ISHOLE = featureType.add(NAME_FIELD_ISHOLE, DataTypes.BOOLEAN)
744
                    .setDefaultValue(Boolean.FALSE)
745
                    .getIndex();
746

  
747
            ID_FIELD_ISCOMPLEX = featureType.add(NAME_FIELD_ISCOMPLEX, DataTypes.BOOLEAN)
748
                    .setDefaultValue(Boolean.FALSE)
749
                    .getIndex();
750

  
751
            ID_FIELD_SCALE = featureType.add(NAME_FIELD_SCALE, DataTypes.INT)
752
                    .setDefaultValue(Integer.valueOf(0))
753
                    .getIndex();
754

  
755
            ID_FIELD_LINKS_COUNT = featureType.add(NAME_FIELD_LINKS_COUNT, DataTypes.INT)
756
                    .setDefaultValue(Integer.valueOf(0))
757
                    .getIndex();
758

  
759
            ID_FIELD_LINK_INDEX = featureType.add(NAME_FIELD_LINK_INDEX, DataTypes.INT)
760
                    .setDefaultValue(Integer.valueOf(0))
761
                    .getIndex();
762

  
763
            ID_FIELD_LINK_ENTITY = featureType.add(NAME_FIELD_LINK_ENTITY, DataTypes.INT)
764
                    .setDefaultValue(Integer.valueOf(0))
765
                    .getIndex();
766

  
767
            ID_FIELD_LINK_TYPE = featureType.add(NAME_FIELD_LINK_TYPE, DataTypes.INT)
768
                    .setDefaultValue(Integer.valueOf(0))
769
                    .getIndex();
770

  
771
            ID_FIELD_LINK_MS = featureType.add(NAME_FIELD_LINK_MS, DataTypes.INT)
772
                    .setDefaultValue(Integer.valueOf(0))
773
                    .getIndex();
774

  
775
            ID_FIELD_LINK_LENGTH = featureType.add(NAME_FIELD_LINK_LENGTH, DataTypes.INT)
776
                    .setDefaultValue(Integer.valueOf(0))
777
                    .getIndex();
778

  
779
            ID_FIELD_LINK_DATA = featureType.add(NAME_FIELD_LINK_DATA, DataTypes.STRING, 512)
780
                    .setDefaultValue("")
781
                    .getIndex();
782

  
783
            EditableFeatureAttributeDescriptor attr = featureType.add(NAME_FIELD_GEOMETRY, DataTypes.GEOMETRY);
784
            attr.setSRS(this.projection);
785
            int geometryTypeToUse = getDGNParameters().getGeometryTypeFilter();
786
            if( getDGNParameters().getGroupBy()!=null ) {
787
                switch( getDGNParameters().getGroupGeometriesOperation()) {
788
                    case GROUP_GEOMETRIES_NONE:
789
                    case GROUP_GEOMETRIES_UNION:
790
                    case GROUP_GEOMETRIES_INTERSECTION:
791
                        break;
792
                    case GROUP_GEOMETRIES_TOPOINTS:
793
                        geometryTypeToUse = Geometry.TYPES.MULTIPOINT;
794
                        break;
795
                    case GROUP_GEOMETRIES_TOLINES:
796
                        geometryTypeToUse = Geometry.TYPES.MULTICURVE;
797
                        break;
798
                    case GROUP_GEOMETRIES_TOPOLYGONS:
799
                    case GROUP_GEOMETRIES_TOPOLYGONS_FIX:
800
                    case GROUP_GEOMETRIES_CONVEXHULL:
801
                        geometryTypeToUse = Geometry.TYPES.MULTISURFACE;
802
                        break;
803
                }
804
            }
805
            attr.setGeometryType(geometryTypeToUse);
806
            attr.setGeometrySubType(Geometry.SUBTYPES.GEOM3D);
807
            ID_FIELD_GEOMETRY = attr.getIndex();
808

  
809
            featureType.setDefaultGeometryAttributeName(NAME_FIELD_GEOMETRY);
810

  
811
            MAX_FIELD_ID = featureType.size() - 1;
812

  
813
            types = new ArrayList();
814
            types.add(featureType);
815

  
816 577
            if (leyendBuilder != null) {
817 578
                leyendBuilder.begin();
818 579
            }
......
895 656

  
896 657
                FeatureType type = getDefaultType().getNotEditableCopy();
897 658

  
898
                filter = new Filter(getDGNParameters(), dgnReader);
899

  
900 659
                int counterOfElement = 0;
901 660
                DGNElemComplexHeader parentElement = null;
902 661

  
......
1139 898
                    }
1140 899
                }
1141 900

  
1142
                consolideGroups(dgnReader);
1143
                if (getDGNParameters().sortByGeometryType()) {
1144
                    sortRows();
1145
                }
1146

  
1147 901
            } catch (Exception ex) {
1148
                logger.warn("Can't process DGN file '"+getFullName()+".", ex);
902
                logger.warn("Can't process DGN file '" + getFullName() + ".", ex);
1149 903
                throw new LoadException(ex, getFullName());
1150 904
            } finally {
1151 905
                IOUtils.closeQuietly(xmlbfw);
......
1154 908

  
1155 909
        }
1156 910

  
1157
        private void consolideGroups(DGNReader dgnReader) {
1158
            if (groupedFeatures == null) {
1159
                return;
1160
            }
1161
            int groupOperation = getDGNParameters().getGroupGeometriesOperation();
1162
            FilteredLogger log = new FilteredLogger(logger, "ConsolideGroupBy", 10);
1163

  
1164
            Iterator<Map.Entry<Object, FeatureProvider>> it = groupedFeatures.entrySet().iterator();
1165
            while (it.hasNext()) {
1166
                Map.Entry<Object, FeatureProvider> entry = it.next();
1167
                String groupValue = "<null>";
1168
                if (entry.getKey() != null) {
1169
                    groupValue = entry.getKey().toString();
1170
                }
1171
                try {
1172
                    FeatureProvider data = entry.getValue();
1173
                    Geometry geometry = data.getDefaultGeometry();
1174
                    if (geometry != null) {
1175
                        switch (groupOperation) {
1176
                            case GROUP_GEOMETRIES_NONE:
1177
                                break;
1178
                            case GROUP_GEOMETRIES_CONVEXHULL:
1179
                                try {
1180
                                    geometry = geometry.convexHull();
1181
                                    data.set(ID_FIELD_GEOMETRY, geometry);
1182
                                } catch (Exception ex) {
1183
                                    log.warn("Can't create convex-hull with geometries of the group '" + groupValue + "'.", ex);
1184
                                }
1185
                                break;
1186
                            case GROUP_GEOMETRIES_UNION:
1187
                                if (geometry instanceof Aggregate) {
1188
                                    try {
1189
                                        geometry = ((Aggregate) geometry).union();
1190
                                        data.set(ID_FIELD_GEOMETRY, geometry);
1191
                                    } catch (Exception ex) {
1192
                                        log.warn("Can't create a union with geometries of the group '" + groupValue + "'.", ex);
1193
                                    }
1194
                                }
1195
                                break;
1196
                            case GROUP_GEOMETRIES_INTERSECTION:
1197
                                if (geometry instanceof Aggregate) {
1198
                                    try {
1199
                                        geometry = ((Aggregate) geometry).intersection();
1200
                                        data.set(ID_FIELD_GEOMETRY, geometry);
1201
                                    } catch (Exception ex) {
1202
                                        log.warn("Can't create a intersection with geometries of the group '" + groupValue + "'.", ex);
1203
                                    }
1204
                                }
1205
                                break;
1206

  
1207
                            case GROUP_GEOMETRIES_TOPOINTS:
1208
                                try {
1209
                                    if (geometry instanceof Line) {
1210
                                        geometry = ((Line) geometry).toPoints();
1211
                                        data.set(ID_FIELD_GEOMETRY, geometry);
1212

  
1213
                                    } else if (geometry instanceof Polygon) {
1214
                                        geometry = ((Polygon) geometry).toPoints();
1215
                                        data.set(ID_FIELD_GEOMETRY, geometry);
1216

  
1217
                                    } else if (geometry instanceof Point) {
1218
                                        geometry = ((Point) geometry).toPoints();
1219
                                        data.set(ID_FIELD_GEOMETRY, geometry);
1220

  
1221
                                    } else if (geometry instanceof MultiLine) {
1222
                                        geometry = ((MultiLine) geometry).toPoints();
1223
                                        data.set(ID_FIELD_GEOMETRY, geometry);
1224

  
1225
                                    } else if (geometry instanceof MultiPolygon) {
1226
                                        geometry = ((MultiPolygon) geometry).toPoints();
1227
                                        data.set(ID_FIELD_GEOMETRY, geometry);
1228

  
1229
                                    }
1230
                                } catch (Exception ex) {
1231
                                    log.warn("Can't convert to points the geometries of the group '" + groupValue + "'.", ex);
1232
                                }
1233
                                break;
1234

  
1235
                            case GROUP_GEOMETRIES_TOLINES:
1236
                                try {
1237
                                    if (geometry instanceof Polygon) {
1238
                                        geometry = ((Polygon) geometry).toLines();
1239
                                        data.set(ID_FIELD_GEOMETRY, geometry);
1240

  
1241
                                    } else if (geometry instanceof MultiPolygon) {
1242
                                        geometry = ((MultiPolygon) geometry).toLines();
1243
                                        data.set(ID_FIELD_GEOMETRY, geometry);
1244

  
1245
                                    }
1246
                                } catch (Exception ex) {
1247
                                    log.warn("Can't convert to lines the geometries of the group '" + groupValue + "'.", ex);
1248
                                }
1249
                                break;
1250

  
1251
                            case GROUP_GEOMETRIES_TOPOLYGONS:
1252
                                try {
1253
                                    if (geometry instanceof Line) {
1254
                                        geometry = ((Line) geometry).toPolygons();
1255
                                        data.set(ID_FIELD_GEOMETRY, geometry);
1256

  
1257
                                    } else if (geometry instanceof MultiLine) {
1258
                                        geometry = ((MultiLine) geometry).toPolygons();
1259
                                        data.set(ID_FIELD_GEOMETRY, geometry);
1260

  
1261
                                    } else {
1262
                                        geometry = null;
1263
                                        data.set(ID_FIELD_GEOMETRY, geometry);
1264
                                    }
1265
                                } catch (Exception ex) {
1266
                                    log.warn("Can't convert to polygons the geometries of the group '" + groupValue + "'.", ex);
1267
                                }
1268
                                break;
1269

  
1270
                            case GROUP_GEOMETRIES_TOPOLYGONS_FIX:
1271
                                try {
1272
                                    if (geometry instanceof Line) {
1273
                                        geometry = ((Line) geometry).toPolygons();
1274
                                        geometry = geometry.buffer(0);
1275
                                        data.set(ID_FIELD_GEOMETRY, geometry);
1276

  
1277
                                    } else if (geometry instanceof MultiLine) {
1278
                                        geometry = ((MultiLine) geometry).toPolygons();
1279
                                        geometry = geometry.buffer(0);
1280
                                        data.set(ID_FIELD_GEOMETRY, geometry);
1281

  
1282
                                    } else {
1283
                                        geometry = null;
1284
                                        data.set(ID_FIELD_GEOMETRY, geometry);
1285
                                    }
1286
                                } catch (Exception ex) {
1287
                                    log.warn("Can't convert to polygons the geometries of the group '" + groupValue + "'.", ex);
1288
                                }
1289
                                break;
1290
                        }
1291
                        if (geometry != null) {
1292
                            if (this.envelope == null) {
1293
                                this.envelope = geometry.getEnvelope();
1294
                            } else {
1295
                                this.envelope.add(geometry.getEnvelope());
1296
                            }
1297
                        }
1298
                    }
1299
                    addFeatureProvider(data);
1300
                    if (this.leyendBuilder != null) {
1301
                        this.leyendBuilder.process(data, dgnReader);
1302
                    }
1303
                } catch (Exception ex) {
1304
                    log.warn("Problem adding data from group '" + groupValue + "'.", ex);
1305
                }
1306
            }
1307
        }
1308

  
1309 911
        private void fillRow(Object[] row, DGNElemCore elemento, DGNElemComplexHeader parentElement, DGNReader dgnReader) {
1310 912
            row[ID_FIELD_HEIGHTTEXT] = new Double(0);
1311 913
            row[ID_FIELD_HEIGHTTEXTRAW] = new Double(0);
......
1390 992
            int counterOfElement = 0;
1391 993
            DGNElemComplexHeader parentElement = null;
1392 994

  
1393
            filter = new Filter(getDGNParameters(), dgnReader);
1394

  
1395 995
            for (int id = 0; id < dgnReader.getNumEntities(); id++) {
1396 996
                dgnReader.DGNGotoElement(id);
1397 997

  
......
1802 1402
            }
1803 1403

  
1804 1404
        }
1405
//
1406
//        private Curve createCurve(boolean is3D) throws CreateGeometryException {
1407
//            if (is3D) {
1408
//                return (Curve) geomManager.create(
1409
//                        Geometry.TYPES.CURVE,
1410
//                        Geometry.SUBTYPES.GEOM3D);
1411
//            }
1412
//            return (Curve) geomManager.create(
1413
//                    Geometry.TYPES.CURVE,
1414
//                    Geometry.SUBTYPES.GEOM2D);
1415
//
1416
//        }
1805 1417

  
1806
        private Curve createCurve(boolean is3D) throws CreateGeometryException {
1807
            if (is3D) {
1808
                return (Curve) geomManager.create(
1809
                        Geometry.TYPES.CURVE,
1810
                        Geometry.SUBTYPES.GEOM3D);
1811
            }
1812
            return (Curve) geomManager.create(
1813
                    Geometry.TYPES.CURVE,
1814
                    Geometry.SUBTYPES.GEOM2D);
1815

  
1816
        }
1817

  
1818 1418
        private Point createPoint3D(double x, double y, double z)
1819 1419
                throws DataException {
1820 1420
            Point point;
......
1832 1432
            return point;
1833 1433
        }
1834 1434

  
1835
        private int getGroupByFieldIndex() {
1836
            if (groupByFieldIndex > -2) {
1837
                return groupByFieldIndex;
1838
            }
1839
            String groupby = getDGNParameters().getGroupBy();
1840
            if (groupby == null) {
1841
                groupByFieldIndex = -1;
1842
                return groupByFieldIndex;
1843
            }
1844
            groupByFieldIndex = this.getDefaultType().getIndex(groupby);
1845
            if (groupByFieldIndex < 0) {
1846
                throw new IllegalArgumentException("Can't group by field '" + groupby + ", the field don't exists.");
1847
            }
1848
            return groupByFieldIndex;
1849
        }
1850

  
1851
        private MultiPrimitive getMultiPrimitive(Geometry geom) {
1852
            if (geom == null) {
1853
                return null;
1854
            }
1855
            if (geom instanceof MultiPrimitive) {
1856
                return (MultiPrimitive) geom;
1857
            }
1858
            MultiPrimitive multi = null;
1859
            try {
1860
                if (geom instanceof Point) {
1861
                    multi = (MultiPrimitive) geomManager.create(
1862
                            TYPES.MULTIPOINT,
1863
                            geom.getGeometryType().getSubType()
1864
                    );
1865
                } else if (geom instanceof Curve) {
1866
                    multi = (MultiPrimitive) geomManager.create(
1867
                            TYPES.MULTICURVE,
1868
                            geom.getGeometryType().getSubType()
1869
                    );
1870
                } else if (geom instanceof Surface) {
1871
                    multi = (MultiPrimitive) geomManager.create(
1872
                            TYPES.MULTISURFACE,
1873
                            geom.getGeometryType().getSubType()
1874
                    );
1875
                }
1876
                if (multi != null) {
1877
                    multi.addPrimitive((Primitive) geom);
1878
                }
1879
            } catch (CreateGeometryException ex) {
1880
                logger.warn("Can't create multi-geometry to group", ex);
1881
            }
1882
            return multi;
1883
        }
1884

  
1885
        private void addToGroup(int groupbyField, FeatureProvider data) {
1886
            if (groupedFeatures == null) {
1887
                groupedFeatures = new HashMap<Object, FeatureProvider>();
1888
            }
1889
            Object groupbyValue = data.get(groupbyField);
1890
            FeatureProvider group = groupedFeatures.get(groupbyValue);
1891
            if (group == null) {
1892
                groupedFeatures.put(groupbyValue, data);
1893
                MultiPrimitive multi = getMultiPrimitive((Geometry) data.get(ID_FIELD_GEOMETRY));
1894
                if (multi == null) {
1895
                    data.set(ID_FIELD_GEOMETRY, null);
1896
                } else {
1897
                    data.set(ID_FIELD_GEOMETRY, multi);
1898
                }
1899
                return;
1900
            }
1901
            for (int i = 0; i <= MAX_FIELD_ID; i++) {
1902
                Object value = group.get(i);
1903
                if (i == ID_FIELD_GEOMETRY) {
1904
                    Geometry newgeom = (Geometry) data.get(i);
1905
                    if (newgeom != null) {
1906
                        if (value == null) {
1907
                            group.set(ID_FIELD_GEOMETRY, getMultiPrimitive(newgeom));
1908
                        } else {
1909
                            try {
1910
                                ((MultiPrimitive) value).addPrimitive((Primitive) newgeom);
1911
                            } catch (Exception ex) {
1912
                                logger.warn("Can't group geoemtry '" + newgeom.toString() + "' in '" + value.toString() + "'.", ex);
1913
                            }
1914
                        }
1915
                    }
1916
                } else if (value == null) {
1917
                    group.set(i, data.get(i));
1918
                } else if (value instanceof String) {
1919
                    String s = (String) value;
1920
                    if (s.trim().length() == 0) {
1921
                        group.set(i, data.get(i));
1922
                    }
1923
                }
1924
            }
1925

  
1926
        }
1927

  
1928 1435
        private void addFeature(FeatureProvider data, DGNReader dgnReader) throws DataException {
1929 1436

  
1930
            if (!filter.accept(data)) {
1931
                return;
1932
            }
1933
            int groupByIndex = this.getGroupByFieldIndex();
1934
            if (groupByIndex >= 0) {
1935
                addToGroup(groupByIndex, data);
1936
                return;
1937
            }
1938 1437
            addFeatureProvider(data);
1939 1438
            Geometry geometry = data.getDefaultGeometry();
1940 1439
            if (geometry != null) {
org.gvsig.dgn/trunk/org.gvsig.dgn/org.gvsig.dgn.provider/src/main/java/org/gvsig/fmap/dal/store/dgn/PostProcessGroupOperation.java
1
package org.gvsig.fmap.dal.store.dgn;
2

  
3
import java.util.ArrayList;
4
import java.util.HashMap;
5
import java.util.Iterator;
6
import java.util.List;
7
import java.util.Map;
8
import org.gvsig.fmap.dal.feature.FeatureType;
9
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
10
import static org.gvsig.fmap.dal.store.dgn.DGNStoreProvider.GROUP_GEOMETRIES_CONVEXHULL;
11
import static org.gvsig.fmap.dal.store.dgn.DGNStoreProvider.GROUP_GEOMETRIES_INTERSECTION;
12
import static org.gvsig.fmap.dal.store.dgn.DGNStoreProvider.GROUP_GEOMETRIES_NONE;
13
import static org.gvsig.fmap.dal.store.dgn.DGNStoreProvider.GROUP_GEOMETRIES_TOLINES;
14
import static org.gvsig.fmap.dal.store.dgn.DGNStoreProvider.GROUP_GEOMETRIES_TOPOINTS;
15
import static org.gvsig.fmap.dal.store.dgn.DGNStoreProvider.GROUP_GEOMETRIES_TOPOLYGONS;
16
import static org.gvsig.fmap.dal.store.dgn.DGNStoreProvider.GROUP_GEOMETRIES_TOPOLYGONS_FIX;
17
import static org.gvsig.fmap.dal.store.dgn.DGNStoreProvider.GROUP_GEOMETRIES_UNION;
18
import org.gvsig.fmap.dal.store.dgn.lib.DGNReader;
19
import org.gvsig.fmap.geom.Geometry;
20
import org.gvsig.fmap.geom.GeometryLocator;
21
import org.gvsig.fmap.geom.GeometryManager;
22
import org.gvsig.fmap.geom.aggregate.Aggregate;
23
import org.gvsig.fmap.geom.aggregate.MultiLine;
24
import org.gvsig.fmap.geom.aggregate.MultiPolygon;
25
import org.gvsig.fmap.geom.aggregate.MultiPrimitive;
26
import org.gvsig.fmap.geom.exception.CreateGeometryException;
27
import org.gvsig.fmap.geom.primitive.Curve;
28
import org.gvsig.fmap.geom.primitive.Envelope;
29
import org.gvsig.fmap.geom.primitive.Line;
30
import org.gvsig.fmap.geom.primitive.Point;
31
import org.gvsig.fmap.geom.primitive.Polygon;
32
import org.gvsig.fmap.geom.primitive.Primitive;
33
import org.gvsig.fmap.geom.primitive.Surface;
34
import org.gvsig.tools.logger.FilteredLogger;
35
import org.slf4j.Logger;
36
import org.slf4j.LoggerFactory;
37

  
38
public class PostProcessGroupOperation {
39

  
40
    private static final Logger logger = LoggerFactory.getLogger(PostProcessGroupOperation.class);
41

  
42
    private int groupByFieldIndex = -1;
43
    private Map<Object, FeatureProvider> groupedFeatures = null;
44
    private GeometryManager geomManager = null;
45
    private int ID_FIELD_GEOMETRY = -1;
46
    private int MAX_FIELD_ID = -1;
47
    private int groupGeometriesOperation = -1;
48
    private Envelope envelope = null;
49

  
50
    public PostProcessGroupOperation(FeatureType featureType, String groupfield, int groupGeometriesOperation) {
51
        this.groupByFieldIndex = featureType.getIndex(groupfield);
52
        if (groupByFieldIndex < 0) {
53
            throw new IllegalArgumentException("Can't group by field '" + groupfield + ", the field don't exists.");
54
        }
55
        this.geomManager = GeometryLocator.getGeometryManager();
56
        this.ID_FIELD_GEOMETRY = featureType.getDefaultGeometryAttribute().getIndex();
57
        this.MAX_FIELD_ID = featureType.size() - 1;
58
        this.groupGeometriesOperation = groupGeometriesOperation;
59
    }
60

  
61
    public void add(FeatureProvider data) {
62
        if (groupedFeatures == null) {
63
            groupedFeatures = new HashMap<Object, FeatureProvider>();
64
        }
65
        Object groupbyValue = data.get(groupByFieldIndex);
66
        FeatureProvider group = groupedFeatures.get(groupbyValue);
67
        if (group == null) {
68
            groupedFeatures.put(groupbyValue, data);
69
            MultiPrimitive multi = getMultiPrimitive((Geometry) data.get(ID_FIELD_GEOMETRY));
70
            if (multi == null) {
71
                data.set(ID_FIELD_GEOMETRY, null);
72
            } else {
73
                data.set(ID_FIELD_GEOMETRY, multi);
74
            }
75
            return;
76
        }
77
        for (int i = 0; i <= MAX_FIELD_ID; i++) {
78
            Object value = group.get(i);
79
            if (i == ID_FIELD_GEOMETRY) {
80
                Geometry newgeom = (Geometry) data.get(i);
81
                if (newgeom != null) {
82
                    if (value == null) {
83
                        group.set(ID_FIELD_GEOMETRY, getMultiPrimitive(newgeom));
84
                    } else {
85
                        try {
86
                            ((MultiPrimitive) value).addPrimitive((Primitive) newgeom);
87
                        } catch (Exception ex) {
88
                            logger.warn("Can't group geoemtry '" + newgeom.toString() + "' in '" + value.toString() + "'.", ex);
89
                        }
90
                    }
91
                }
92
            } else if (value == null) {
93
                group.set(i, data.get(i));
94
            } else if (value instanceof String) {
95
                String s = (String) value;
96
                if (s.trim().length() == 0) {
97
                    group.set(i, data.get(i));
98
                }
99
            }
100
        }
101

  
102
    }
103

  
104
    private MultiPrimitive getMultiPrimitive(Geometry geom) {
105
        if (geom == null) {
106
            return null;
107
        }
108
        if (geom instanceof MultiPrimitive) {
109
            return (MultiPrimitive) geom;
110
        }
111
        MultiPrimitive multi = null;
112
        try {
113
            if (geom instanceof Point) {
114
                multi = (MultiPrimitive) geomManager.create(
115
                        Geometry.TYPES.MULTIPOINT,
116
                        geom.getGeometryType().getSubType()
117
                );
118
            } else if (geom instanceof Curve) {
119
                multi = (MultiPrimitive) geomManager.create(
120
                        Geometry.TYPES.MULTICURVE,
121
                        geom.getGeometryType().getSubType()
122
                );
123
            } else if (geom instanceof Surface) {
124
                multi = (MultiPrimitive) geomManager.create(
125
                        Geometry.TYPES.MULTISURFACE,
126
                        geom.getGeometryType().getSubType()
127
                );
128
            }
129
            if (multi != null) {
130
                multi.addPrimitive((Primitive) geom);
131
            }
132
        } catch (CreateGeometryException ex) {
133
            logger.warn("Can't create multi-geometry to group", ex);
134
        }
135
        return multi;
136
    }
137

  
138
    public List<FeatureProvider> getRows() {
139
        if (this.groupGeometriesOperation < 0) {
140
            Iterator<FeatureProvider> rowsIterator = this.groupedFeatures.values().iterator();
141
            while( rowsIterator.hasNext() ) {
142
                FeatureProvider feature = rowsIterator.next();
143
                Geometry geometry = feature.getDefaultGeometry();
144
                if (geometry != null) {
145
                    if (this.envelope == null) {
146
                        this.envelope = geometry.getEnvelope();
147
                    } else {
148
                        this.envelope.add(geometry.getEnvelope());
149
                    }
150
                }
151
            }
152
            return (List<FeatureProvider>) this.groupedFeatures.values();
153
        }
154

  
155
        List<FeatureProvider> result = new ArrayList<FeatureProvider>();
156
        
157
        FilteredLogger log = new FilteredLogger(logger, "ConsolideGroupBy", 10);
158

  
159
        Iterator<Map.Entry<Object, FeatureProvider>> it = groupedFeatures.entrySet().iterator();
160
        while (it.hasNext()) {
161
            Map.Entry<Object, FeatureProvider> entry = it.next();
162
            String groupValue = "<null>";
163
            if (entry.getKey() != null) {
164
                groupValue = entry.getKey().toString();
165
            }
166
            try {
167
                FeatureProvider data = entry.getValue();
168
                Geometry geometry = data.getDefaultGeometry();
169
                if (geometry != null) {
170
                    switch (this.groupGeometriesOperation) {
171
                        case GROUP_GEOMETRIES_NONE:
172
                            break;
173
                        case GROUP_GEOMETRIES_CONVEXHULL:
174
                            try {
175
                                geometry = geometry.convexHull();
176
                                data.set(ID_FIELD_GEOMETRY, geometry);
177
                            } catch (Exception ex) {
178
                                log.warn("Can't create convex-hull with geometries of the group '" + groupValue + "'.", ex);
179
                            }
180
                            break;
181
                        case GROUP_GEOMETRIES_UNION:
182
                            if (geometry instanceof Aggregate) {
183
                                try {
184
                                    geometry = ((Aggregate) geometry).union();
185
                                    data.set(ID_FIELD_GEOMETRY, geometry);
186
                                } catch (Exception ex) {
187
                                    log.warn("Can't create a union with geometries of the group '" + groupValue + "'.", ex);
188
                                }
189
                            }
190
                            break;
191
                        case GROUP_GEOMETRIES_INTERSECTION:
192
                            if (geometry instanceof Aggregate) {
193
                                try {
194
                                    geometry = ((Aggregate) geometry).intersection();
195
                                    data.set(ID_FIELD_GEOMETRY, geometry);
196
                                } catch (Exception ex) {
197
                                    log.warn("Can't create a intersection with geometries of the group '" + groupValue + "'.", ex);
198
                                }
199
                            }
200
                            break;
201

  
202
                        case GROUP_GEOMETRIES_TOPOINTS:
203
                            try {
204
                                if (geometry instanceof Line) {
205
                                    geometry = ((Line) geometry).toPoints();
206
                                    data.set(ID_FIELD_GEOMETRY, geometry);
207

  
208
                                } else if (geometry instanceof Polygon) {
209
                                    geometry = ((Polygon) geometry).toPoints();
210
                                    data.set(ID_FIELD_GEOMETRY, geometry);
211

  
212
                                } else if (geometry instanceof Point) {
213
                                    geometry = ((Point) geometry).toPoints();
214
                                    data.set(ID_FIELD_GEOMETRY, geometry);
215

  
216
                                } else if (geometry instanceof MultiLine) {
217
                                    geometry = ((MultiLine) geometry).toPoints();
218
                                    data.set(ID_FIELD_GEOMETRY, geometry);
219

  
220
                                } else if (geometry instanceof MultiPolygon) {
221
                                    geometry = ((MultiPolygon) geometry).toPoints();
222
                                    data.set(ID_FIELD_GEOMETRY, geometry);
223

  
224
                                }
225
                            } catch (Exception ex) {
226
                                log.warn("Can't convert to points the geometries of the group '" + groupValue + "'.", ex);
227
                            }
228
                            break;
229

  
230
                        case GROUP_GEOMETRIES_TOLINES:
231
                            try {
232
                                if (geometry instanceof Polygon) {
233
                                    geometry = ((Polygon) geometry).toLines();
234
                                    data.set(ID_FIELD_GEOMETRY, geometry);
235

  
236
                                } else if (geometry instanceof MultiPolygon) {
237
                                    geometry = ((MultiPolygon) geometry).toLines();
238
                                    data.set(ID_FIELD_GEOMETRY, geometry);
239

  
240
                                }
241
                            } catch (Exception ex) {
242
                                log.warn("Can't convert to lines the geometries of the group '" + groupValue + "'.", ex);
243
                            }
244
                            break;
245

  
246
                        case GROUP_GEOMETRIES_TOPOLYGONS:
247
                            try {
248
                                if (geometry instanceof Line) {
249
                                    geometry = ((Line) geometry).toPolygons();
250
                                    data.set(ID_FIELD_GEOMETRY, geometry);
251

  
252
                                } else if (geometry instanceof MultiLine) {
253
                                    geometry = ((MultiLine) geometry).toPolygons();
254
                                    data.set(ID_FIELD_GEOMETRY, geometry);
255

  
256
                                } else {
257
                                    geometry = null;
258
                                    data.set(ID_FIELD_GEOMETRY, geometry);
259
                                }
260
                            } catch (Exception ex) {
261
                                log.warn("Can't convert to polygons the geometries of the group '" + groupValue + "'.", ex);
262
                            }
263
                            break;
264

  
265
                        case GROUP_GEOMETRIES_TOPOLYGONS_FIX:
266
                            try {
267
                                if (geometry instanceof Line) {
268
                                    geometry = ((Line) geometry).toPolygons();
269
                                    geometry = geometry.buffer(0);
270
                                    data.set(ID_FIELD_GEOMETRY, geometry);
271

  
272
                                } else if (geometry instanceof MultiLine) {
273
                                    geometry = ((MultiLine) geometry).toPolygons();
274
                                    geometry = geometry.buffer(0);
275
                                    data.set(ID_FIELD_GEOMETRY, geometry);
276

  
277
                                } else {
278
                                    geometry = null;
279
                                    data.set(ID_FIELD_GEOMETRY, geometry);
280
                                }
281
                            } catch (Exception ex) {
282
                                log.warn("Can't convert to polygons the geometries of the group '" + groupValue + "'.", ex);
283
                            }
284
                            break;
285
                    }
286
                    if (geometry != null) {
287
                        if (this.envelope == null) {
288
                            this.envelope = geometry.getEnvelope();
289
                        } else {
290
                            this.envelope.add(geometry.getEnvelope());
291
                        }
292
                    }
293
                }
294
                result.add(data);
295
            } catch (Exception ex) {
296
                log.warn("Problem adding data from group '" + groupValue + "'.", ex);
297
            }
298
        }
299
        return result;
300
    }
301

  
302
    public Envelope getEnvelope() {
303
        if( this.envelope == null ) {
304
            
305
        }
306
        return this.envelope;
307
    }
308

  
309
}
org.gvsig.dgn/trunk/org.gvsig.dgn/org.gvsig.dgn.provider/src/main/java/org/gvsig/fmap/dal/store/dgn/PostProcessFeatures.java
1
package org.gvsig.fmap.dal.store.dgn;
2

  
3
import java.util.ArrayList;
4
import java.util.Collections;
5
import java.util.Comparator;
6
import java.util.Date;
7
import java.util.Iterator;
8
import java.util.List;
9
import org.gvsig.fmap.dal.feature.FeatureType;
10
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
11
import org.gvsig.fmap.geom.Geometry;
12
import org.gvsig.fmap.geom.GeometryLocator;
13
import org.gvsig.fmap.geom.GeometryManager;
14
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
15
import org.gvsig.fmap.geom.primitive.Envelope;
16
import org.slf4j.Logger;
17
import org.slf4j.LoggerFactory;
18

  
19
public class PostProcessFeatures {
20

  
21
    private static final Logger logger = LoggerFactory.getLogger(PostProcessFeatures.class);
22

  
23
    private final FeatureType featureType;
24
    private final DGNStoreParameters parameters;
25
    private Envelope envelope;
26
    private final int geomSubtype;
27
    private PostProcessFilterOperation filter = null;
28

  
29
    public PostProcessFeatures(DGNStoreParameters parameters, FeatureType featureType) {
30
        this.featureType = featureType;
31
        this.parameters = parameters;
32
        if (parameters.ignoreZs()) {
33
            this.geomSubtype = Geometry.SUBTYPES.GEOM2D;
34
        } else {
35
            this.geomSubtype = featureType.getDefaultGeometryAttribute().getGeomType().getSubType();
36
        }
37
    }
38

  
39
    private DGNStoreParameters getDGNParameters() {
40
        return this.parameters;
41
    }
42

  
43
    private PostProcessFilterOperation getFilter() {
44
        if (this.filter == null) {
45
            this.filter = new PostProcessFilterOperation(
46
                    getDGNParameters(),
47
                    featureType
48
            );
49
        }
50
        return this.filter;
51
    }
52

  
53
    public List<FeatureProvider> apply(List<FeatureProvider> rows) throws CreateEnvelopeException {
54

  
55
        PostProcessFilterOperation filter = this.getFilter();
56

  
57
        List<FeatureProvider> result = null;
58

  
59
        Iterator<FeatureProvider> rowsIterator = rows.iterator();
60

  
61
        int rowCount = 0;
62
        int rowFitereds = 0;
63
        if (parameters.getGroupBy() == null) {
64
            GeometryManager geomManager = GeometryLocator.getGeometryManager();
65
            this.envelope = geomManager.createEnvelope(this.geomSubtype);
66

  
67
            Date t1 = new Date();
68

  
69
            result = new ArrayList<FeatureProvider>();
70
            while (rowsIterator.hasNext()) {
71
                FeatureProvider feature = rowsIterator.next();
72
                rowCount++;
73
                if (!filter.accept(feature)) {
74
                    continue;
75
                }
76
                rowFitereds++;
77
                Geometry geom = feature.getDefaultGeometry();
78
                if (geom != null) {
79
                    this.envelope.add(geom.getEnvelope());
80
                }
81
                result.add(feature);
82
            }
83

  
84
            Date t2 = new Date();
85
            logger.debug("Time to filter data " + (t2.getTime() - t1.getTime())+", total rows "+rowCount+", output rows "+rowFitereds);
86

  
87
        } else {
88
            Date t1 = new Date();
89

  
90
            PostProcessGroupOperation groupOperation = new PostProcessGroupOperation(
91
                    this.featureType,
92
                    parameters.getGroupBy(),
93
                    parameters.getGroupGeometriesOperation()
94
            );
95
            while (rowsIterator.hasNext()) {
96
                FeatureProvider feature = rowsIterator.next();
97
                rowCount++;
98
                if (!filter.accept(feature)) {
99
                    continue;
100
                }
101
                rowFitereds++;
102
                groupOperation.add(feature);
103
            }
104
            result = groupOperation.getRows();
105
            this.envelope = groupOperation.getEnvelope();
106

  
107
            Date t2 = new Date();
108
            logger.debug("Time to filter+group data " + (t2.getTime() - t1.getTime())+", total rows "+rowCount+", output rows "+rowFitereds);
109
        }
110

  
111
        if (parameters.sortByGeometryType()) {
112
            this.sortRows(result);
113
        }
114
        return result;
115
    }
116

  
117
    public Envelope getEnvelope() {
118
        return this.envelope;
119
    }
120

  
121
    private void sortRows(List<FeatureProvider> rows) {
122
        Date t1 = new Date();
123
        Collections.sort(rows, new Comparator<FeatureProvider>() {
124
            public int compare(FeatureProvider o1, FeatureProvider o2) {
125
                Geometry g1 = o1.getDefaultGeometry();
126
                Geometry g2 = o2.getDefaultGeometry();
127
                if (g1 == null) {
128
                    if (g2 == null) {
129
                        return 0;
130
                    } else {
131
                        return -1;
132
                    }
133
                } else if (g2 == null) {
134
                    return 1;
135
                }
136
                return g2.getType() - g1.getType();
137
            }
138
        });
139
        Date t2 = new Date();
140
        logger.debug("Time to sort data " + (t2.getTime() - t1.getTime())+", rows "+rows.size());
141
    }
142

  
143
    public boolean hasOperations() {
144
        PostProcessFilterOperation filter = this.getFilter();
145
        if (filter.hasFilter()) {
146
            return true;
147
        }
148
        if (parameters.getGroupBy() != null) {
149
            return true;
150
        }
151
        return false;
152
    }
153

  
154
}
org.gvsig.dgn/trunk/org.gvsig.dgn/org.gvsig.dgn.provider/src/main/java/org/gvsig/fmap/dal/store/dgn/PostProcessFilterOperation.java
1
package org.gvsig.fmap.dal.store.dgn;
2

  
3
import java.util.regex.Pattern;
4
import org.apache.commons.lang3.StringUtils;
5
import org.gvsig.fmap.dal.feature.FeatureType;
6
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
7
import static org.gvsig.fmap.dal.store.dgn.DGNStoreProvider.CROP_OPERATION_CONTAINS;
8
import static org.gvsig.fmap.dal.store.dgn.DGNStoreProvider.CROP_OPERATION_COVEREDBY;
9
import static org.gvsig.fmap.dal.store.dgn.DGNStoreProvider.CROP_OPERATION_COVERS;
10
import static org.gvsig.fmap.dal.store.dgn.DGNStoreProvider.CROP_OPERATION_CROSSES;
11
import static org.gvsig.fmap.dal.store.dgn.DGNStoreProvider.CROP_OPERATION_DISJOINT;
12
import static org.gvsig.fmap.dal.store.dgn.DGNStoreProvider.CROP_OPERATION_INTERSECT;
13
import static org.gvsig.fmap.dal.store.dgn.DGNStoreProvider.CROP_OPERATION_NONE;
14
import static org.gvsig.fmap.dal.store.dgn.DGNStoreProvider.CROP_OPERATION_OVERLAPS;
15
import static org.gvsig.fmap.dal.store.dgn.DGNStoreProvider.CROP_OPERATION_TOUCHES;
16
import static org.gvsig.fmap.dal.store.dgn.DGNStoreProvider.CROP_OPERATION_WITHIN;
17
import org.gvsig.fmap.geom.Geometry;
18
import org.gvsig.fmap.geom.GeometryLocator;
19
import org.gvsig.fmap.geom.GeometryManager;
20
import org.gvsig.fmap.geom.primitive.Point;
21
import org.gvsig.fmap.geom.type.GeometryType;
22
import org.slf4j.Logger;
23
import org.slf4j.LoggerFactory;
24

  
25
public class PostProcessFilterOperation {
26

  
27
    private static final Logger logger = LoggerFactory.getLogger(PostProcessFilterOperation.class);
28
            
29
    private Pattern levelFilter = null;
30
    private Pattern colorFilter = null;
31
    private Pattern styleFilter = null;
32
    private Pattern weighFilter = null;
33
    private Pattern typeFilter = null;
34
    private Pattern stypeFilter = null;
35
    private Pattern idFilter = null;
36
    private Pattern groupFilter = null;
37
    private Pattern textFilter = null;
38
    private Point pointForCheckGeometries = null;
39
    private boolean hasfilter = false;
40
    private boolean skipCurruptGeometries = true;
41
    private int geometryTypeFilter = Geometry.TYPES.GEOMETRY;
42
    private int counter_exceptions = 0;
43
    private int cropOperationFilter;
44
    private Geometry cropFilter = null;
45
    private int ID_FIELD_LEVEL = -1;
46
    private int ID_FIELD_COLOR = -1;
47
    private int ID_FIELD_STYLE = -1;
48
    private int ID_FIELD_WEIGHT = -1;
49
    private int ID_FIELD_TYPE = -1;
50
    private int ID_FIELD_STYPE = -1;
51
    private int ID_FIELD_GROUP = -1;
52
    private int ID_FIELD_ID = -1;
53
    private int ID_FIELD_TEXT = -1;
54

  
55
    PostProcessFilterOperation(DGNStoreParameters parameters, FeatureType featureType) {
56
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
57

  
58
        geometryTypeFilter = parameters.getGeometryTypeFilter();
59
        skipCurruptGeometries = parameters.skipCorruptGeometries();
60
        if (!StringUtils.isBlank(parameters.getLevelFilter())) {
61
            this.levelFilter = Pattern.compile(parameters.getLevelFilter());
62
            this.ID_FIELD_LEVEL = featureType.getIndex(DGNStoreProvider.NAME_FIELD_LEVEL);
63
            this.hasfilter = true;
64
        }
65
        if (!StringUtils.isBlank(parameters.getColorFilter())) {
66
            colorFilter = Pattern.compile(parameters.getColorFilter());
67
            this.ID_FIELD_COLOR = featureType.getIndex(DGNStoreProvider.NAME_FIELD_COLOR);
68
            this.hasfilter = true;
69
        }
70
        if (!StringUtils.isBlank(parameters.getStyleFilter())) {
71
            styleFilter = Pattern.compile(parameters.getStyleFilter());
72
            this.ID_FIELD_STYLE = featureType.getIndex(DGNStoreProvider.NAME_FIELD_STYLE);
73
            this.hasfilter = true;
74
        }
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff