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