diff --git a/src/plugins/roadgraph/graphbuilder.cpp b/src/plugins/roadgraph/graphbuilder.cpp index 46d155e..5702e0a 100644 --- a/src/plugins/roadgraph/graphbuilder.cpp +++ b/src/plugins/roadgraph/graphbuilder.cpp @@ -18,8 +18,8 @@ // Qgis includes -RgGraphBuilder::RgGraphBuilder( const QgsCoordinateReferenceSystem& crs, double topologyTolerance ) : - mCrs( crs ), mTopologyToleraceFactor( topologyTolerance ) +RgGraphBuilder::RgGraphBuilder( const QgsCoordinateReferenceSystem& crs, bool ctfEnabled, double topologyTolerance ) : + mCrs( crs ), mTopologyToleraceFactor( topologyTolerance ), mCoordinateTransformEnabled( ctfEnabled ) { } @@ -38,3 +38,8 @@ double RgGraphBuilder::topologyTolerance() { return mTopologyToleraceFactor; } + +bool RgGraphBuilder::coordinateTransformEnabled() const +{ + return mCoordinateTransformEnabled; +} diff --git a/src/plugins/roadgraph/graphbuilder.h b/src/plugins/roadgraph/graphbuilder.h index 6af1c6a..e943001 100644 --- a/src/plugins/roadgraph/graphbuilder.h +++ b/src/plugins/roadgraph/graphbuilder.h @@ -33,7 +33,7 @@ class RgGraphBuilder { public: //! Constructor - RgGraphBuilder( const QgsCoordinateReferenceSystem& crs, double topologyTolerance = 0.0 ); + RgGraphBuilder( const QgsCoordinateReferenceSystem& crs, bool coordinateTransform, double topologyTolerance = 0.0 ); //! Destructor virtual ~RgGraphBuilder(); @@ -49,6 +49,11 @@ class RgGraphBuilder double topologyTolerance(); /** + * coordinate transform Enabled + */ + bool coordinateTransformEnabled() const; + + /** * add vertex */ virtual QgsPoint addVertex( const QgsPoint& pt ) = 0; @@ -62,5 +67,7 @@ class RgGraphBuilder QgsCoordinateReferenceSystem mCrs; double mTopologyToleraceFactor; + + bool mCoordinateTransformEnabled; }; #endif //GRAPHBUILDER diff --git a/src/plugins/roadgraph/linevectorlayerdirector.cpp b/src/plugins/roadgraph/linevectorlayerdirector.cpp index 5207592..4ccaa9b 100644 --- a/src/plugins/roadgraph/linevectorlayerdirector.cpp +++ b/src/plugins/roadgraph/linevectorlayerdirector.cpp @@ -72,11 +72,23 @@ void RgLineVectorLayerDirector::makeGraph( RgGraphBuilder *builder, const QVecto int featureCount = ( int ) vl->featureCount() * 2; int step = 0; - QgsCoordinateTransform ct( vl->crs(), builder->destinationCrs() ); - + QgsCoordinateTransform ct; QgsDistanceArea da; - da.setSourceCrs( builder->destinationCrs().srsid() ); - da.setProjectionsEnabled( true ); + ct.setSourceCrs( vl->crs() ); + + if ( builder->coordinateTransformEnabled() ) + { + ct.setDestCRS( builder->destinationCrs() ); + da.setProjectionsEnabled( true ); + // + //da.setSourceCrs( builder->destinationCrs().srsid() ); + // + } + else + { + ct.setDestCRS( vl->crs() ); + da.setProjectionsEnabled( false ); + } tiedPoint = QVector< QgsPoint >( additionalPoints.size(), QgsPoint( 0.0, 0.0 ) ); TiePointInfo tmpInfo; @@ -104,8 +116,14 @@ void RgLineVectorLayerDirector::makeGraph( RgGraphBuilder *builder, const QVecto for ( i = 0; i != additionalPoints.size(); ++i ) { TiePointInfo info; - info.mLength = additionalPoints[ i ].sqrDistToSegment( pt1.x(), pt1.y(), pt2.x(), pt2.y(), info.mTiedPoint ); - + if ( pt1 == pt2 ) + { + info.mLength = additionalPoints[ i ].sqrDist( pt1 ); + info.mTiedPoint = pt1; + }else + { + info.mLength = additionalPoints[ i ].sqrDistToSegment( pt1.x(), pt1.y(), pt2.x(), pt2.y(), info.mTiedPoint ); + } if ( pointLengthMap[ i ].mLength > info.mLength ) { info.mTiedPoint = builder->addVertex( info.mTiedPoint ); diff --git a/src/plugins/roadgraph/roadgraphplugin.cpp b/src/plugins/roadgraph/roadgraphplugin.cpp index eb8ba0a..a982002 100644 --- a/src/plugins/roadgraph/roadgraphplugin.cpp +++ b/src/plugins/roadgraph/roadgraphplugin.cpp @@ -305,7 +305,8 @@ void RoadGraphPlugin::render( QPainter *painter ) if ( graphDirector == NULL ) return; - RgSimpleGraphBuilder builder( mQGisIface->mapCanvas()->mapRenderer()->destinationCrs() ); + RgSimpleGraphBuilder builder( mQGisIface->mapCanvas()->mapRenderer()->destinationCrs(), + mQGisIface->mapCanvas()->mapRenderer()->hasCrsTransformEnabled() ); QVector< QgsPoint > null; graphDirector->makeGraph( &builder , null, null ); AdjacencyMatrix m = builder.adjacencyMatrix(); diff --git a/src/plugins/roadgraph/shortestpathwidget.cpp b/src/plugins/roadgraph/shortestpathwidget.cpp index fe9ea38..d25b9a5 100644 --- a/src/plugins/roadgraph/shortestpathwidget.cpp +++ b/src/plugins/roadgraph/shortestpathwidget.cpp @@ -236,8 +236,11 @@ bool RgShortestPathWidget::getPath( AdjacencyMatrix& matrix, QgsPoint& p1, QgsPo return false; } - RgSimpleGraphBuilder builder( mPlugin->iface()->mapCanvas()->mapRenderer()->destinationCrs(), - mPlugin->topologyToleranceFactor() ); + RgSimpleGraphBuilder builder( + mPlugin->iface()->mapCanvas()->mapRenderer()->destinationCrs(), + mPlugin->iface()->mapCanvas()->mapRenderer()->hasCrsTransformEnabled(), + mPlugin->topologyToleranceFactor() ); + { const RgGraphDirector *director = mPlugin->director(); if ( director == NULL ) diff --git a/src/plugins/roadgraph/simplegraphbuilder.cpp b/src/plugins/roadgraph/simplegraphbuilder.cpp index 050c941..584ff11 100644 --- a/src/plugins/roadgraph/simplegraphbuilder.cpp +++ b/src/plugins/roadgraph/simplegraphbuilder.cpp @@ -21,8 +21,8 @@ #include #include -RgSimpleGraphBuilder::RgSimpleGraphBuilder( const QgsCoordinateReferenceSystem& crs, double topologyTolerance ) : - RgGraphBuilder( crs, topologyTolerance ) +RgSimpleGraphBuilder::RgSimpleGraphBuilder( const QgsCoordinateReferenceSystem& crs, bool ctfEnabled, double topologyTolerance ) : + RgGraphBuilder( crs, ctfEnabled, topologyTolerance ) { } diff --git a/src/plugins/roadgraph/simplegraphbuilder.h b/src/plugins/roadgraph/simplegraphbuilder.h index bab968d..a2ca2bd 100644 --- a/src/plugins/roadgraph/simplegraphbuilder.h +++ b/src/plugins/roadgraph/simplegraphbuilder.h @@ -38,7 +38,7 @@ class RgSimpleGraphBuilder : public RgGraphBuilder /** * default constructor */ - RgSimpleGraphBuilder( const QgsCoordinateReferenceSystem& crs, double topologyTolerance = 0.0 ); + RgSimpleGraphBuilder( const QgsCoordinateReferenceSystem& crs, bool ctfEnabled, double topologyTolerance = 0.0 ); /** * MANDATORY BUILDER PROPERTY DECLARATION