Revision 56 org.gvsig.lrs/trunk/org.gvsig.lrs/org.gvsig.lrs.lib/org.gvsig.lrs.lib.impl/src/main/java/org/gvsig/lrs/lib/impl/LrsCalibrateRouteAlgorithm.java

View differences:

LrsCalibrateRouteAlgorithm.java
431 431
                                }else{
432 432
                                    if (nextVertex!=null
433 433
                                        && !LrsAlgorithmUtils.equalPoints(nextVertex, fixedPoint)
434
                                        && vertex.distance(fixedPoint)>PRECISION){
434
                                        && vertex.distance(fixedPoint)>PRECISION
435
                                        && nextVertex.distance(fixedPoint)>PRECISION){
435 436

  
436 437
                                        GeometryManager geomanager = GeometryLocator.getGeometryManager();
437 438
                                        Line segment= (Line) geomanager
......
496 497
            for (int i=0; i<vertices.size();i++){
497 498
                if(!isFixedPoint.get(i)){
498 499
                    Integer prevFixedPointPos=getPreviousPosFixedPoint(i);
499
                    Integer nextFixedPointPos=getNextPosFixedPoint(i);
500
                    Integer nextFixedPointPos=getNextPosFixedPoint(i,false);
500 501

  
501 502
                    if (prevFixedPointPos==null && nextFixedPointPos!=null  && before){
502 503
                        extrapolateBeforeCalibrationPoints(calculationMethod,nextFixedPointPos,i);
......
512 513
        }
513 514

  
514 515
        private void extrapolateBeforeCalibrationPoints(LrsMeasureCalculationMethods calculationMethod,int firstFixedPointPos,int pos){
515
            Integer secondFixedPointPos=getNextPosFixedPoint(firstFixedPointPos+1);
516
            Integer secondFixedPointPos=getNextPosFixedPoint(firstFixedPointPos,false);
516 517
            if (secondFixedPointPos!=null){
517 518

  
518 519
                if (calculationMethod.equals(LrsMeasureCalculationMethods.DISTANCE)){
......
550 551
        }
551 552

  
552 553
        private void extrapolateAfterCalibrationPoints(LrsMeasureCalculationMethods calculationMethod,int lastFixedPointPos,int pos){
553
            Integer prevFixedPointPos=getPreviousPosFixedPoint(lastFixedPointPos-1);
554
            Integer prevFixedPointPos=getPreviousPosFixedPoint(lastFixedPointPos);
554 555
            if (prevFixedPointPos!=null){
555 556
                calculateMValue(calculationMethod,prevFixedPointPos,lastFixedPointPos,pos);
556 557
            }
557 558
        }
558 559

  
559
        private void calculateMValue(LrsMeasureCalculationMethods calculationMethod,int prevFixedPointPos,int nextFixedPointPos,int pos){
560
        private void calculateMValue(LrsMeasureCalculationMethods calculationMethod,Integer prevFixedPointPos,int nextFixedPointPos,int pos){
560 561

  
561 562
            if (calculationMethod.equals(LrsMeasureCalculationMethods.DISTANCE)){
562 563
                if (!isFixedPoint.get(pos)){
......
569 570

  
570 571
            Double newMValueBeforePoint=vertices.get(prevFixedPointPos).getCoordinateAt(MDIMENSION);
571 572
            Double newMValueAfterPoint=vertices.get(nextFixedPointPos).getCoordinateAt(MDIMENSION);
573
            while (newMValueBeforePoint.equals(newMValueAfterPoint)){
574
                prevFixedPointPos=getPreviousPosFixedPoint(prevFixedPointPos);
575
                if (prevFixedPointPos!=null){
576
                    newMValueBeforePoint=vertices.get(prevFixedPointPos).getCoordinateAt(MDIMENSION);
577
                }else{
578
                    refreshMValueGeometryVertex(pos,Double.NaN, false);
579
                    return;
580
                }
581
            }
572 582

  
573 583
            Double oldMValueBeforePoint;
574 584
            Double oldMValueAfterPoint;
......
592 602
        }
593 603

  
594 604

  
595
        private Integer getNextPosFixedPoint(int pos){
596
            Integer nextFixedPointPos= findNextFixedPointInLine(pos);
605
        private Integer getNextPosFixedPoint(int pos, boolean selfInclude){
606
            Integer nextFixedPointPos= findNextFixedPointInLine(pos, selfInclude);
597 607
            if (nextFixedPointPos!=null){
598 608
                return nextFixedPointPos;
599 609
            }else{
......
604 614
                        }
605 615
                        try{
606 616
                    Integer nearestVertex=findNearestNextPoint(lastPositionInLine);
607
                    return getNextPosFixedPoint(nearestVertex);
617
                    return getNextPosFixedPoint(nearestVertex, true);
608 618
                        }catch (Exception e){
609 619
                            return null;
610 620
                        }
......
622 632
        }
623 633

  
624 634
        private Integer findNextFixedPointInNextLines(int pos,List<Integer> visitedLines){
625
            Integer nextFixedPointPos= findNextFixedPointInLine(pos);
635
            Integer nextFixedPointPos= findNextFixedPointInLine(pos, true);
626 636
            if (nextFixedPointPos!=null){
627 637
                return nextFixedPointPos;
628 638
            }else{
......
630 640
                visitedLines.add(lineIndex);
631 641
                int lastPositionInLine=getLastPositionInLine(pos);
632 642
                Point lastVertexInLine=vertices.get(lastPositionInLine);
633
                for (int i=pos+1;i<vertices.size();i++){
643
                for (int i=lastPositionInLine;i<vertices.size();i++){
634 644
                    if (LrsAlgorithmUtils.equalPoints(lastVertexInLine, vertices.get(i))){
635 645
                        if (!visitedLines.contains(lineIndexes.get(i))){
636 646
                            findNextFixedPointInNextLines(i,visitedLines);
......
641 651
            return null;
642 652
        }
643 653

  
644
        private Integer findNextFixedPointInLine(int vertexPos){
654
        private Integer findNextFixedPointInLine(int vertexPos, boolean selfInclude){
645 655
            int lineIndex=lineIndexes.get(vertexPos);
656
            if (!selfInclude){
657
                vertexPos+=1;
658
            }
646 659
            for (int i=vertexPos;i<vertices.size();i++){
647 660
                if(!lineIndexes.get(i).equals(lineIndex)){
648 661
                    return null;
......
681 694
                        int lastPositionInLine=i+1;
682 695
                        for (int j=lastPositionInLine;j>=0;j--){
683 696
                            if (LrsAlgorithmUtils.equalPoints(vertices.get(lastPositionInLine), vertices.get(j))){
684
                                if (isFixedPoint.get(j)){
697
                                if (isFixedPoint.get(j) && j<pos){
685 698
                                    return j;
686 699
                                }
687 700
                            }
......
698 711
        }
699 712
        private Integer findPrevFixedPointInLine(int vertexPos){
700 713
            int lineIndex=lineIndexes.get(vertexPos);
701
            for (int i=vertexPos;i>=0;i--){
714
            for (int i=vertexPos-1;i>=0;i--){
702 715
                if(!lineIndexes.get(i).equals(lineIndex)){
703 716
                    return null;
704 717
                }

Also available in: Unified diff