double QgsComposerScaleBar::mapDiagonal() const { if ( !mComposerMap ) { return 0.0; } QgsRectangle composerMapRect = mComposerMap->extent(); if ( mUnits == MapUnits ) { return sqrt( composerMapRect.width() * composerMapRect.width() + composerMapRect.height() * composerMapRect.height() ); } else { QgsDistanceArea da; da.setProjectionsEnabled( true ); da.setSourceCrs( mComposerMap->mapRenderer()->destinationCrs().srsid() ); QSettings s; da.setEllipsoid( s.value( "/qgis/measure/ellipsoid", "WGS84" ).toString() ); double measure = da.measureLine( QgsPoint( composerMapRect.xMinimum(), composerMapRect.yMaximum() ), QgsPoint( composerMapRect.xMaximum(), composerMapRect.yMinimum() ) ); if ( mUnits == Feet ) { measure /= 0.3048; } return measure; } }
void QgsMeasureDialog::configureDistanceArea( QgsDistanceArea& da ) { QSettings settings; QString ellipsoidId = settings.value( "/qgis/measure/ellipsoid", "WGS84" ).toString(); da.setSourceCrs( mTool->canvas()->mapRenderer()->destinationCrs().srsid() ); da.setEllipsoid( ellipsoidId ); da.setProjectionsEnabled( mcbProjectionEnabled->isChecked() ); }
void QgsMapToolMeasureAngle::configureDistanceArea( QgsDistanceArea& da ) { QSettings settings; QString ellipsoidId = settings.value( "/qgis/measure/ellipsoid", "WGS84" ).toString(); da.setSourceCrs( mCanvas->mapRenderer()->destinationCrs().srsid() ); da.setEllipsoid( ellipsoidId ); da.setProjectionsEnabled( mResultDisplay->projectionEnabled() ); }
void GlobePlugin::syncExtent() { osgEarth::Util::EarthManipulator* manip = dynamic_cast<osgEarth::Util::EarthManipulator*>( viewer.getCameraManipulator() ); //rotate earth to north and perpendicular to camera manip->setRotation( osg::Quat() ); //get mapCanvas->extent().height() in meters QgsRectangle extent = mQGisIface->mapCanvas()->extent(); QgsDistanceArea dist; dist.setProjectionsEnabled( true ); QgsPoint ll = QgsPoint( extent.xMinimum(), extent.yMinimum() ); QgsPoint ul = QgsPoint( extent.xMinimum(), extent.yMaximum() ); double height = dist.measureLine( ll, ul ); //camera viewing angle double viewAngle = 30; //camera distance double distance = height / tan( viewAngle * osg::PI / 180 ); //c = b*cotan(B(rad)) OE_NOTICE << "map extent: " << height << " camera distance: " << distance << std::endl; osgEarth::Util::Viewpoint viewpoint( osg::Vec3d( extent.center().x(), extent.center().y(), 0.0 ), 0.0, -90.0, distance ); manip->setViewpoint( viewpoint, 4.0 ); }
void RgLineVectorLayerDirector::makeGraph( RgGraphBuilder *builder, const QVector< QgsPoint >& additionalPoints, QVector< QgsPoint >& tiedPoint ) const { QgsVectorLayer *vl = myLayer(); if ( vl == NULL ) return; int featureCount = ( int ) vl->featureCount() * 2; int step = 0; QgsCoordinateTransform ct; QgsDistanceArea da; 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; tmpInfo.mLength = infinity(); QVector< TiePointInfo > pointLengthMap( additionalPoints.size(), tmpInfo ); QVector< TiePointInfo >::iterator pointLengthIt; // begin: tie points to the graph QgsAttributeList la; vl->select( la ); QgsFeature feature; while ( vl->nextFeature( feature ) ) { QgsMultiPolyline mpl; if ( feature.geometry()->wkbType() == QGis::WKBLineString ) { mpl.push_back( feature.geometry()->asPolyline() ); }else if ( feature.geometry()->wkbType() == QGis::WKBMultiLineString ) { mpl = feature.geometry()->asMultiPolyline(); } QgsMultiPolyline::iterator mplIt; for ( mplIt = mpl.begin(); mplIt != mpl.end(); ++mplIt ) { QgsPoint pt1, pt2; bool isFirstPoint = true; QgsPolyline::iterator pointIt; for ( pointIt = mplIt->begin(); pointIt != mplIt->end(); ++pointIt ) { pt2 = builder->addVertex( ct.transform( *pointIt ) ); if ( !isFirstPoint ) { int i = 0; for ( i = 0; i != additionalPoints.size(); ++i ) { TiePointInfo info; 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 ); info.mFirstPoint = pt1; info.mLastPoint = pt2; pointLengthMap[ i ] = info; tiedPoint[ i ] = info.mTiedPoint; } } } pt1 = pt2; isFirstPoint = false; } } emit buildProgress( ++step, featureCount ); } // end: tie points to graph if ( mDirectionFieldId != -1 ) { la.push_back( mDirectionFieldId ); } if ( mSpeedFieldId != -1 ) { la.push_back( mSpeedFieldId ); } SpeedUnit su = SpeedUnit::byName( mSpeedUnitName ); // begin graph construction vl->select( la ); while ( vl->nextFeature( feature ) ) { QgsAttributeMap attr = feature.attributeMap(); int directionType = mDefaultDirection; QgsAttributeMap::const_iterator it; // What direction have feature? for ( it = attr.constBegin(); it != attr.constEnd(); ++it ) { if ( it.key() != mDirectionFieldId ) { continue; } QString str = it.value().toString(); if ( str == mBothDirectionValue ) { directionType = 3; } else if ( str == mDirectDirectionValue ) { directionType = 1; } else if ( str == mReverseDirectionValue ) { directionType = 2; } } // What speed have feature? double speed = 0.0; for ( it = attr.constBegin(); it != attr.constEnd(); ++it ) { if ( it.key() != mSpeedFieldId ) { continue; } speed = it.value().toDouble(); } if ( speed <= 0.0 ) { speed = mDefaultSpeed; } // begin features segments and add arc to the Graph; QgsMultiPolyline mpl; if ( feature.geometry()->wkbType() == QGis::WKBLineString ) { mpl.push_back( feature.geometry()->asPolyline() ); }else if ( feature.geometry()->wkbType() == QGis::WKBMultiLineString ) { mpl = feature.geometry()->asMultiPolyline(); } QgsMultiPolyline::iterator mplIt; for ( mplIt = mpl.begin(); mplIt != mpl.end(); ++mplIt ) { QgsPoint pt1, pt2; bool isFirstPoint = true; QgsPolyline::iterator pointIt; for ( pointIt = mplIt->begin(); pointIt != mplIt->end(); ++pointIt ) { pt2 = builder->addVertex( ct.transform( *pointIt ) ); std::map< double, QgsPoint > pointsOnArc; pointsOnArc[ 0.0 ] = pt1; pointsOnArc[ pt1.sqrDist( pt2 )] = pt2; for ( pointLengthIt = pointLengthMap.begin(); pointLengthIt != pointLengthMap.end(); ++pointLengthIt ) { if ( pointLengthIt->mFirstPoint == pt1 && pointLengthIt->mLastPoint == pt2 ) { QgsPoint tiedPoint = pointLengthIt->mTiedPoint; pointsOnArc[ pt1.sqrDist( tiedPoint )] = tiedPoint; } } if ( !isFirstPoint ) { std::map< double, QgsPoint >::iterator pointsIt; QgsPoint pt1; QgsPoint pt2; bool isFirstPoint = true; for ( pointsIt = pointsOnArc.begin(); pointsIt != pointsOnArc.end(); ++pointsIt ) { pt2 = pointsIt->second; if ( !isFirstPoint ) { double cost = da.measureLine( pt1, pt2 ); if ( directionType == 1 || directionType == 3 ) { builder->addArc( pt1, pt2, cost, speed*su.multipler(), feature.id() ); } if ( directionType == 2 || directionType == 3 ) { builder->addArc( pt2, pt1, cost, speed*su.multipler(), feature.id() ); } } pt1 = pt2; isFirstPoint = false; } } // if ( !isFirstPoint ) pt1 = pt2; isFirstPoint = false; } } // for (it = pl.begin(); it != pl.end(); ++it) emit buildProgress( ++step, featureCount ); } // while( vl->nextFeature(feature) ) } // makeGraph( RgGraphBuilder *builder, const QgsRectangle& rt )
bool QgsMapToolIdentify::identifyVectorLayer( QgsVectorLayer *layer, int x, int y ) { if ( !layer ) return false; QMap< QString, QString > attributes, derivedAttributes; QgsPoint point = mCanvas->getCoordinateTransform()->toMapCoordinates( x, y ); derivedAttributes.insert( tr( "(clicked coordinate)" ), point.toString() ); // load identify radius from settings QSettings settings; double identifyValue = settings.value( "/Map/identifyRadius", QGis::DEFAULT_IDENTIFY_RADIUS ).toDouble(); QString ellipsoid = settings.value( "/qgis/measure/ellipsoid", "WGS84" ).toString(); if ( identifyValue <= 0.0 ) identifyValue = QGis::DEFAULT_IDENTIFY_RADIUS; int featureCount = 0; QgsFeatureList featureList; // toLayerCoordinates will throw an exception for an 'invalid' point. // For example, if you project a world map onto a globe using EPSG 2163 // and then click somewhere off the globe, an exception will be thrown. try { // create the search rectangle double searchRadius = mCanvas->extent().width() * ( identifyValue / 100.0 ); QgsRectangle r; r.setXMinimum( point.x() - searchRadius ); r.setXMaximum( point.x() + searchRadius ); r.setYMinimum( point.y() - searchRadius ); r.setYMaximum( point.y() + searchRadius ); r = toLayerCoordinates( layer, r ); layer->select( layer->pendingAllAttributesList(), r, true, true ); QgsFeature f; while ( layer->nextFeature( f ) ) featureList << QgsFeature( f ); } catch ( QgsCsException & cse ) { Q_UNUSED( cse ); // catch exception for 'invalid' point and proceed with no features found QgsDebugMsg( QString( "Caught CRS exception %1" ).arg( cse.what() ) ); } // init distance/area calculator QgsDistanceArea calc; if ( !featureList.count() == 0 ) { calc.setProjectionsEnabled( mCanvas->hasCrsTransformEnabled() ); // project? calc.setEllipsoid( ellipsoid ); calc.setSourceCrs( layer->crs().srsid() ); } QgsFeatureList::iterator f_it = featureList.begin(); for ( ; f_it != featureList.end(); ++f_it ) { featureCount++; QgsFeatureId fid = f_it->id(); QMap<QString, QString> derivedAttributes; // Calculate derived attributes and insert: // measure distance or area depending on geometry type if ( layer->geometryType() == QGis::Line ) { double dist = calc.measure( f_it->geometry() ); QGis::UnitType myDisplayUnits; convertMeasurement( calc, dist, myDisplayUnits, false ); QString str = calc.textUnit( dist, 3, myDisplayUnits, false ); // dist and myDisplayUnits are out params derivedAttributes.insert( tr( "Length" ), str ); if ( f_it->geometry()->wkbType() == QGis::WKBLineString || f_it->geometry()->wkbType() == QGis::WKBLineString25D ) { // Add the start and end points in as derived attributes str = QLocale::system().toString( f_it->geometry()->asPolyline().first().x(), 'g', 10 ); derivedAttributes.insert( tr( "firstX", "attributes get sorted; translation for lastX should be lexically larger than this one" ), str ); str = QLocale::system().toString( f_it->geometry()->asPolyline().first().y(), 'g', 10 ); derivedAttributes.insert( tr( "firstY" ), str ); str = QLocale::system().toString( f_it->geometry()->asPolyline().last().x(), 'g', 10 ); derivedAttributes.insert( tr( "lastX", "attributes get sorted; translation for firstX should be lexically smaller than this one" ), str ); str = QLocale::system().toString( f_it->geometry()->asPolyline().last().y(), 'g', 10 ); derivedAttributes.insert( tr( "lastY" ), str ); } } else if ( layer->geometryType() == QGis::Polygon ) { double area = calc.measure( f_it->geometry() ); QGis::UnitType myDisplayUnits; convertMeasurement( calc, area, myDisplayUnits, true ); // area and myDisplayUnits are out params QString str = calc.textUnit( area, 3, myDisplayUnits, true ); derivedAttributes.insert( tr( "Area" ), str ); } else if ( layer->geometryType() == QGis::Point && ( f_it->geometry()->wkbType() == QGis::WKBPoint || f_it->geometry()->wkbType() == QGis::WKBPoint25D ) ) { // Include the x and y coordinates of the point as a derived attribute QString str; str = QLocale::system().toString( f_it->geometry()->asPoint().x(), 'g', 10 ); derivedAttributes.insert( "X", str ); str = QLocale::system().toString( f_it->geometry()->asPoint().y(), 'g', 10 ); derivedAttributes.insert( "Y", str ); } derivedAttributes.insert( tr( "feature id" ), fid < 0 ? tr( "new feature" ) : FID_TO_STRING( fid ) ); results()->addFeature( layer, *f_it, derivedAttributes ); } QgsDebugMsg( "Feature count on identify: " + QString::number( featureCount ) ); return featureCount > 0; }