Revision 53
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 | ||
---|---|---|
453 | 453 |
isFixedPoint.set(index, true); |
454 | 454 |
vertices.set(index, vertex); |
455 | 455 |
}else{ |
456 |
if (nextVertex!=null && !LrsAlgorithmUtils.equalPoints(nextVertex, fixedPoint)){ |
|
456 |
if (nextVertex!=null |
|
457 |
&& !LrsAlgorithmUtils.equalPoints(nextVertex, fixedPoint) |
|
458 |
&& vertex.distance(fixedPoint)>PRECISION){ |
|
459 |
|
|
457 | 460 |
GeometryManager geomanager = GeometryLocator.getGeometryManager(); |
458 | 461 |
Line segment= (Line) geomanager |
459 | 462 |
.create(Geometry.TYPES.LINE, Geometry.SUBTYPES.GEOM2DM); |
... | ... | |
645 | 648 |
if (nextFixedPointPos!=null){ |
646 | 649 |
return nextFixedPointPos; |
647 | 650 |
}else{ |
648 |
Integer lineVisited=lineIndexes.get(pos); |
|
649 |
for (int i=pos+1;i<vertices.size();i++){ |
|
650 |
if (!lineVisited.equals(lineIndexes.get(i))){//Line has changed |
|
651 |
int lastPositionInLine=i-1; |
|
652 |
nextFixedPointPos=findNextFixedPointInNextLines(lastPositionInLine,new ArrayList<Integer>()); |
|
653 |
if (nextFixedPointPos!=null){ |
|
654 |
return nextFixedPointPos; |
|
655 |
} |
|
656 |
try{ |
|
657 |
return findNearestNextFixedPoint(lastPositionInLine); |
|
658 |
}catch (Exception e){ |
|
659 |
return null; |
|
660 |
} |
|
661 |
} |
|
651 |
int lastPositionInLine=getLastPositionInLine(pos); |
|
652 |
nextFixedPointPos=findNextFixedPointInNextLines(lastPositionInLine,new ArrayList<Integer>()); |
|
653 |
if (nextFixedPointPos!=null){ |
|
654 |
return nextFixedPointPos; |
|
662 | 655 |
} |
656 |
try{ |
|
657 |
Integer nearestVertex=findNearestNextPoint(lastPositionInLine); |
|
658 |
return getNextPosFixedPoint(nearestVertex); |
|
659 |
}catch (Exception e){ |
|
660 |
return null; |
|
661 |
} |
|
663 | 662 |
} |
664 |
return null; |
|
665 | 663 |
} |
666 | 664 |
|
665 |
private Integer getLastPositionInLine (int pos){ |
|
666 |
Integer lineVisited=lineIndexes.get(pos); |
|
667 |
for (int i=pos+1;i<vertices.size();i++){ |
|
668 |
if (!lineVisited.equals(lineIndexes.get(i))){ |
|
669 |
return i-1; |
|
670 |
} |
|
671 |
} |
|
672 |
return vertices.size()-1; |
|
673 |
} |
|
674 |
|
|
667 | 675 |
private Integer findNextFixedPointInNextLines(int pos,List<Integer> visitedLines){ |
668 | 676 |
Integer nextFixedPointPos= findNextFixedPointInLine(pos); |
669 | 677 |
if (nextFixedPointPos!=null){ |
670 | 678 |
return nextFixedPointPos; |
671 | 679 |
}else{ |
672 |
Point vertex=vertices.get(pos); |
|
673 |
for (int j=pos;j<vertices.size();j++){ |
|
674 |
if (LrsAlgorithmUtils.equalPoints(vertex, vertices.get(j))){ |
|
675 |
Integer fixedPointPos=findNextFixedPointInLine(j); |
|
676 |
if (fixedPointPos!=null){ |
|
677 |
return fixedPointPos; |
|
680 |
Integer lineIndex=lineIndexes.get(pos); |
|
681 |
visitedLines.add(lineIndex); |
|
682 |
int lastPositionInLine=getLastPositionInLine(pos); |
|
683 |
Point lastVertexInLine=vertices.get(lastPositionInLine); |
|
684 |
for (int i=pos+1;i<vertices.size();i++){ |
|
685 |
if (LrsAlgorithmUtils.equalPoints(lastVertexInLine, vertices.get(i))){ |
|
686 |
if (!visitedLines.contains(lineIndexes.get(i))){ |
|
687 |
findNextFixedPointInNextLines(i,visitedLines); |
|
678 | 688 |
} |
679 | 689 |
} |
680 | 690 |
} |
... | ... | |
694 | 704 |
} |
695 | 705 |
return null; |
696 | 706 |
} |
697 |
private Integer findNearestNextFixedPoint(int vertexPos) throws GeometryOperationNotSupportedException, GeometryOperationException{ |
|
707 |
|
|
708 |
|
|
709 |
private Integer findNearestNextPoint(int vertexPos) throws GeometryOperationNotSupportedException, GeometryOperationException{ |
|
698 | 710 |
Point vertex=vertices.get(vertexPos); |
699 | 711 |
double nearestDistance = Double.POSITIVE_INFINITY; |
700 | 712 |
Integer nearestPointPos=null; |
701 | 713 |
for (int i=vertexPos+1;i<vertices.size();i++){ |
702 |
if (isFixedPoint.get(i)){ |
|
703 |
Double distance=vertex.distance(vertices.get(i)); |
|
704 |
if(nearestDistance>distance){ |
|
705 |
nearestDistance=distance; |
|
706 |
nearestPointPos=i; |
|
707 |
} |
|
714 |
Double distance=vertex.distance(vertices.get(i)); |
|
715 |
if(nearestDistance>distance && distance>Double.valueOf(0)){ |
|
716 |
nearestDistance=distance; |
|
717 |
nearestPointPos=i; |
|
708 | 718 |
} |
709 | 719 |
} |
710 | 720 |
return nearestPointPos; |
Also available in: Unified diff